Day 10: Hoof It
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 are viewing a single thread.
View all comments 4 points
Haskell
A nice easy one today: didn’t even have to hit this with the optimization hammer.
import Data.Char
import Data.List
import Data.Map (Map)
import Data.Map qualified as Map
readInput :: String -> Map (Int, Int) Int
readInput s =
Map.fromList
[ ((i, j), digitToInt c)
| (i, l) <- zip [0 ..] (lines s),
(j, c) <- zip [0 ..] l
]
findTrails :: Map (Int, Int) Int -> [[[(Int, Int)]]]
findTrails input =
Map.elems . Map.map (filter ((== 10) . length)) $
Map.restrictKeys accessible starts
where
starts = Map.keysSet . Map.filter (== 0) $ input
accessible = Map.mapWithKey getAccessible input
getAccessible (i, j) h
| h == 9 = [[(i, j)]]
| otherwise =
[ (i, j) : path
| (di, dj) <- [(-1, 0), (0, 1), (1, 0), (0, -1)],
let p = (i + di, j + dj),
input Map.!? p == Just (succ h),
path <- accessible Map.! p
]
main = do
trails <- findTrails . readInput <$> readFile "input10"
mapM_
(print . sum . (`map` trails))
[length . nub . map last, length]