Day 8: Resonant Collinearity
Megathread guidelines
- Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
- You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL
FAQ
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
Haskell
Not a very pretty solution today, Iβm afraid.
import Control.Arrow
import Control.Monad
import Data.Biapplicative
import Data.Ix
import Data.Map (Map)
import Data.Map qualified as Map
import Data.Set qualified as Set
type Coords = (Int, Int)
readInput :: String -> Map Coords Char
readInput s =
Map.fromAscList
[ ((i, j), c)
| (i, l) <- zip [0 ..] (lines s),
(j, c) <- zip [0 ..] l
]
(.+.), (.-.) :: Coords -> Coords -> Coords
(.+.) = join biliftA2 (+)
(.-.) = join biliftA2 (-)
part1, part2 :: (Coords -> Bool) -> (Coords, Coords) -> [Coords]
part1 valid (p1, p2) =
let s = p2 .-. p1
in filter valid [p1 .-. s, p2 .+. s]
part2 valid (p1, p2) =
let (si, sj) = p2 .-. p1
d = gcd si sj
s = (si `div` d, sj `div` d)
in takeWhile valid (iterate (.+. s) p1)
++ takeWhile valid (drop 1 $ iterate (.-. s) p2)
pairs (x : xs) = map (x,) xs ++ pairs xs
pairs _ = []
main = do
input <- readInput <$> readFile "input08"
let antennas = Map.filter (/= '.') input
antennaGroups =
Map.foldrWithKey
(\p c m -> Map.insertWith (++) c [p] m)
Map.empty
antennas
valid =
inRange
. (Set.findMin &&& Set.findMax)
$ Map.keysSet input
antiNodes model =
Set.fromList
. concatMap (concatMap (model valid) . pairs)
$ antennaGroups
print . Set.size $ antiNodes part1
print . Set.size $ antiNodes part2
Whaaat? It is possible to declare mutliple signatures on one line? π€―
Does that function (.+.
) add tuples/coordinates?
Yup, thatβs right! The function monad is a bit of a mind-bender, but (join f) x == f x x
is a useful thing to remember.
This is so cool, itβs going to replace the lambda in my function pipeline for calculating pairs.