π - 2024 DAY 8 SOLUTIONS -π
π - 2024 DAY 8 SOLUTIONS -π
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
You're viewing a single thread.
View all comments
31
comments
Haskell
import Control.Arrow import Control.Monad import Data.List import Data.Map qualified as M type Pos = [Int] parse :: String -> (Pos, [(Char, Pos)]) parse s = ([n, m], [(c, [i, j]) | i <- [0 .. n], j <- [0 .. m], c <- [l !! i !! j], c /= '.']) where l = lines s n = pred $ length $ head l m = pred $ length l buildMap :: [(Char, Pos)] -> M.Map Char [Pos] buildMap = M.fromListWith (++) . fmap (second pure) allPairs :: [Pos] -> [(Pos, Pos)] allPairs l = [(x, y) | (x : xs) <- tails l, y <- xs] add = zipWith (+) sub = zipWith (-) antinodes :: Pos -> Pos -> [Pos] antinodes a b = [a `sub` ab, b `add` ab] where ab = b `sub` a inBounds [x', y'] [x, y] = x >= 0 && y >= 0 && x <= x' && y <= y' antinodes' :: Pos -> Pos -> Pos -> [Pos] antinodes' l a b = al ++ bl where ab = b `sub` a al = takeWhile (inBounds l) $ iterate (`sub` ab) a bl = takeWhile (inBounds l) $ iterate (`add` ab) b part1 l = length . nub . filter (inBounds l) . concat . M.elems . fmap (allPairs >=> uncurry antinodes) part2 l = length . nub . concat . M.elems . fmap (allPairs >=> uncurry (antinodes' l)) main = getContents >>= print . (uncurry part1 &&& uncurry part2) . second buildMap . parse
1 0 Reply
You've viewed 31 comments.
Scroll to top