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.
BTW, for more in-depth vector stuff I usually use the Linear package.