feat: solve day 7
We parse the grid and then step through a simulation of the tachyon beam's spread and count the number of splitters that the beam actually hit.
This commit is contained in:
parent
7b7dd2660b
commit
d8824fd6bd
3 changed files with 315 additions and 0 deletions
|
|
@ -75,3 +75,10 @@ executable aoc25
|
||||||
|
|
||||||
-- Base language which the package is written in.
|
-- Base language which the package is written in.
|
||||||
default-language: GHC2021
|
default-language: GHC2021
|
||||||
|
|
||||||
|
executable day7
|
||||||
|
import: warnings
|
||||||
|
main-is: Day7.hs
|
||||||
|
build-depends: base ^>=4.20.2,
|
||||||
|
containers >= 0.6.7
|
||||||
|
hs-source-dirs: app
|
||||||
|
|
|
||||||
166
app/Day7.hs
Normal file
166
app/Day7.hs
Normal file
|
|
@ -0,0 +1,166 @@
|
||||||
|
{-# LANGUAGE LambdaCase #-}
|
||||||
|
{-# LANGUAGE RecordWildCards #-}
|
||||||
|
|
||||||
|
module Main where
|
||||||
|
|
||||||
|
import Data.Function (on)
|
||||||
|
import Data.Ix (range)
|
||||||
|
import Data.List (foldl', groupBy, sort, sortBy)
|
||||||
|
import Data.Map (Map)
|
||||||
|
import Data.Map qualified as M
|
||||||
|
import Data.Maybe (mapMaybe)
|
||||||
|
import Debug.Trace
|
||||||
|
import System.Environment (getArgs)
|
||||||
|
|
||||||
|
main :: IO ()
|
||||||
|
main = do
|
||||||
|
input <- readFile . head =<< getArgs
|
||||||
|
putStrLn $ unwords ["Part 1:", show $ part1 input]
|
||||||
|
putStrLn $ unwords ["Part 2:", show $ part2 input]
|
||||||
|
|
||||||
|
data Cell = Empty | Start | Splitter Int | Beam
|
||||||
|
deriving (Eq, Show)
|
||||||
|
|
||||||
|
instance Read Cell where
|
||||||
|
readsPrec _ "" = []
|
||||||
|
readsPrec _ (c : rest) = case c of
|
||||||
|
'.' -> [(Empty, rest)]
|
||||||
|
'S' -> [(Start, rest)]
|
||||||
|
'^' -> [(Splitter 0, rest)]
|
||||||
|
'|' -> [(Beam, rest)]
|
||||||
|
_ -> []
|
||||||
|
readList s = case readsPrec @Cell 0 s of
|
||||||
|
[(c, rest)] -> case readList rest of
|
||||||
|
[] -> [([c], rest)]
|
||||||
|
[(acc, rest')] -> [(c : acc, rest')]
|
||||||
|
[] -> []
|
||||||
|
|
||||||
|
data Grid = Grid
|
||||||
|
{ cells :: Map (Int, Int) Cell,
|
||||||
|
size :: (Int, Int),
|
||||||
|
currentBeams :: [(Int, Int)],
|
||||||
|
paths :: Int
|
||||||
|
}
|
||||||
|
deriving (Show)
|
||||||
|
|
||||||
|
showGrid :: Grid -> String
|
||||||
|
showGrid (Grid cs (rows, cols) _ _) =
|
||||||
|
unlines
|
||||||
|
. map (foldl' ((<>)) mempty . map showCell . (\r -> map (\c -> cs M.! (r, c)) [0 .. cols]))
|
||||||
|
$ [0 .. rows]
|
||||||
|
where
|
||||||
|
showCell c = show $ case c of
|
||||||
|
Empty -> '.'
|
||||||
|
Start -> 'S'
|
||||||
|
Splitter _ -> '^'
|
||||||
|
Beam -> '|'
|
||||||
|
|
||||||
|
instance Read Grid where
|
||||||
|
readsPrec _ =
|
||||||
|
(\cs -> [(Grid (M.fromList cs) (size cs) (start (cs)) 1, "")])
|
||||||
|
. concat
|
||||||
|
. map parseLine
|
||||||
|
. zip [0 ..]
|
||||||
|
. lines
|
||||||
|
where
|
||||||
|
start :: [((Int, Int), Cell)] -> [(Int, Int)]
|
||||||
|
start = map fst . filter (\(_, c) -> c == Start)
|
||||||
|
|
||||||
|
size :: [((Int, Int), Cell)] -> (Int, Int)
|
||||||
|
size cs = fst $ last cs
|
||||||
|
|
||||||
|
parseLine :: (Int, String) -> [((Int, Int), Cell)]
|
||||||
|
parseLine (r, line) = zipWith (\c cell -> ((r, c), cell)) [0 ..] . fst . head $ readList @Cell line
|
||||||
|
|
||||||
|
step :: Grid -> Grid
|
||||||
|
step g = foldl' go (g {currentBeams = []}) (filter valid $ currentBeams g)
|
||||||
|
where
|
||||||
|
go :: Grid -> ((Int, Int)) -> Grid
|
||||||
|
go g (row, col) = case cells g M.! (row, col) of
|
||||||
|
Empty ->
|
||||||
|
g
|
||||||
|
{ cells = M.adjust (const Beam) (row, col) (cells g),
|
||||||
|
currentBeams = (row + 1, col) : currentBeams g
|
||||||
|
}
|
||||||
|
Splitter 0 ->
|
||||||
|
g
|
||||||
|
{ cells = M.adjust (const $ Splitter 1) (row, col) (cells g),
|
||||||
|
currentBeams = (row, col + 1) : (row, col - 1) : currentBeams g,
|
||||||
|
paths = paths g + 1
|
||||||
|
}
|
||||||
|
Splitter n -> g {cells = M.adjust (const $ Splitter (n + 1)) (row, col) (cells g), paths = paths g + n}
|
||||||
|
Beam -> g {currentBeams = (row + 1, col) : currentBeams g}
|
||||||
|
Start -> g {currentBeams = (row + 1, col) : currentBeams g}
|
||||||
|
|
||||||
|
valid :: (Int, Int) -> Bool
|
||||||
|
valid p = p < size g
|
||||||
|
|
||||||
|
incrementCounter :: Cell -> Cell
|
||||||
|
incrementCounter (Splitter n) = Splitter (n + 1)
|
||||||
|
|
||||||
|
part1 :: String -> Int
|
||||||
|
part1 = M.size . M.filter nonZero . cells . final . read
|
||||||
|
where
|
||||||
|
nonZero :: Cell -> Bool
|
||||||
|
nonZero (Splitter n) = n > 0
|
||||||
|
nonZero _ = False
|
||||||
|
|
||||||
|
final :: Grid -> Grid
|
||||||
|
final gr =
|
||||||
|
let gr' = step gr
|
||||||
|
in if null (currentBeams gr') then gr' else final gr'
|
||||||
|
|
||||||
|
part2 :: String -> Int
|
||||||
|
part2 = (\g -> go g mempty) . read
|
||||||
|
where
|
||||||
|
go :: Grid -> Map (Int, Int) Int -> Int
|
||||||
|
go g acc = snd . M.findMin . foldl' (foldl' (onSplitter g)) acc $ splitters g
|
||||||
|
|
||||||
|
splitters :: Grid -> [[(Int, Int)]]
|
||||||
|
splitters =
|
||||||
|
groupBy ((==) `on` fst)
|
||||||
|
. sortBy (flip (compare `on` fst))
|
||||||
|
. M.keys
|
||||||
|
. M.filter
|
||||||
|
isSplitter
|
||||||
|
. cells
|
||||||
|
|
||||||
|
-- onSplitter sums the number of descendants in each leg of the
|
||||||
|
-- splitter and stores it in acc
|
||||||
|
onSplitter :: Grid -> Map (Int, Int) Int -> (Int, Int) -> Map (Int, Int) Int
|
||||||
|
onSplitter g acc (r, c) =
|
||||||
|
let h c = halfSplitter c (r + 1, fst . size $ g) acc
|
||||||
|
in M.insert (r, c) (sum . map (h . ($ c)) $ [succ, pred]) acc
|
||||||
|
|
||||||
|
halfSplitter :: Int -> (Int, Int) -> Map (Int, Int) Int -> Int
|
||||||
|
halfSplitter c range acc = case col c range acc of
|
||||||
|
[] -> 1
|
||||||
|
(n : _) -> n
|
||||||
|
|
||||||
|
-- col returns all elements in a column c
|
||||||
|
col :: Int -> (Int, Int) -> Map (Int, Int) a -> [a]
|
||||||
|
col c rows g = mapMaybe ((g M.!?) . (,c)) $ range rows
|
||||||
|
|
||||||
|
isSplitter (Splitter _) = True
|
||||||
|
isSplitter _ = False
|
||||||
|
|
||||||
|
testInput :: String
|
||||||
|
testInput =
|
||||||
|
unlines
|
||||||
|
[ ".......S.......",
|
||||||
|
"...............",
|
||||||
|
".......^.......",
|
||||||
|
"...............",
|
||||||
|
"......^.^......",
|
||||||
|
"...............",
|
||||||
|
".....^.^.^.....",
|
||||||
|
"...............",
|
||||||
|
"....^.^...^....",
|
||||||
|
"...............",
|
||||||
|
"...^.^...^.^...",
|
||||||
|
"...............",
|
||||||
|
"..^...^.....^..",
|
||||||
|
"...............",
|
||||||
|
".^.^.^.^.^...^.",
|
||||||
|
"..............."
|
||||||
|
]
|
||||||
142
input/day7.txt
Normal file
142
input/day7.txt
Normal file
|
|
@ -0,0 +1,142 @@
|
||||||
|
......................................................................S......................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
......................................................................^......................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.....................................................................^.^.....................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
....................................................................^.^.^....................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...................................................................^.....^...................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..................................................................^.^.^.^.^..................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.................................................................^.^...^...^.................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
................................................................^.^.^.^.^.^.^................................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...............................................................^.^.^.^...^...^...............................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..............................................................^.^.....^.^...^.^..............................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.............................................................^...^.....^.^.^.^.^.............................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
............................................................^...^.^.^.^...^.^.^.^............................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...........................................................^.^.^.^...^...^.^...^.^...........................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..........................................................^.^.^...^.^.^...^.^.^...^..........................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.........................................................^.^...^.^.^.^.^.^.^.^.^.^.^.........................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
........................................................^.^...^.^.^.^.^.......^...^.^........................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.......................................................^...^.^...^.^.......^.^...^.^.^.......................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
......................................................^...^.^...^.^...^.^...^.^.^.....^......................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.....................................................^.^.^.^.^.^...........^.^...^.^...^.....................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
....................................................^.^.^...^.^.^.^.^.^.^...^.^.....^.^.^....................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...................................................^.^.^.^...^.....^.........^...^...^.^.^...................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..................................................^.^.^...^...^.^.^...^.^.^.^...^.^.....^.^..................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.................................................^.^...^.^.^...^...^...^...^.^.^.^.^...^.^.^.................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
................................................^.^.^...........^.^.^.^.^.^.....^.^.^.....^.^................................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...............................................^.^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.^.^.^.^.^...............................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..............................................^...^.^.^.^...^...^.^.^.....^...^.^.^...^.^.^.^.^..............................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.............................................^.^.^.^.....^.^.^.^.^...^.^.^.^.^...^.^...^...^.^.^.............................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
............................................^.^.^.^.^.^.....^.^.^...^.^.....^.^.^.....^.^...^...^............................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...........................................^.^.^...^.^.^.^...^.^.^.^.^.......^.^.^.^.^.^...^...^.^...........................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..........................................^.^.^.^...^.^.^.^.^.^.^.^...^.....^...^.^.^...^.^...^.^.^..........................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.........................................^.....^.^.^.^...^.^.^.....^.^.^.^.^.....^.^.^.^.^.^.^.^.^.^.........................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
........................................^.^.^...^.....^...^.....^.^.^...^.^.^.^...^.^.^.^...^.^.^.^.^........................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.......................................^.^.^.........^...^...^...^.^.^.^...^.^.^.^...^.^.^.^.^...^...^.......................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
......................................^.^...^.^.^...^.^.^.^.^.^...^...^.^.^...^.^.^.^...^.....^.......^......................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.....................................^...^.^.^.^.^.^.^.^.^.^.^.^.^...^...........^.^.^.^...^.....^.^.^.^.....................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
....................................^.^.^.......^.^...^...^...^.....^.......^.^...^.......^.^.^.^...^.^.^....................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...................................^.^.^.^.^.^.....^.^...^.^.^.^.^...^.^.^...^.^.^.^.^...^...^.^.^.^.^.^.^...................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..................................^.^...^.^.^.^...^.....^...^.......^.^.^.^.^.^.^...^.^...^.^.....^.^.^.^.^..................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.................................^.^.^.^.^.^.^...^.^.....^.^.^.........^.^...^.^...^.....^.^.^.^.^.^...^.^.^.................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
................................^...^.^.....^...^.^.^.^...^.^...^.^.^...^...^.^.^.^.^.^.^.....^.^.^...^.....^................................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...............................^.....^...^...^.^.^...^.^.......^.^.^...^.^.^...^.^.^.^...^.^.^.^.^.^.....^...^...............................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..............................^.^.^...^...^.....^.^.^.^.^.^...^.^...^...^...^.^.^.^.^.^.^...^.^.^.^...^.^.....^..............................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.............................^.^.^.^...^.^...^.^...^...^.^...^.^.^.^...^.....^...^.^.^.......^.^.^...^...^.....^.............................
|
||||||
|
.............................................................................................................................................
|
||||||
|
............................^.....^...^...^.^.^.^.^.....^.^.^.^.^.......^.^.^.........^...........^.^.^...^.....^............................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...........................^.^.^...^...^.^.....^.^.^.^.^.^.^.^.....^.^.^.^.^.^.^...^.....^.^...^.^.....^.^.^.^...^...........................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..........................^.^.^.^.^...^.^.........^.^.^.^.....^...^.^.....^.^.^.^.^.^...^.....^...^.^.^.^...^.....^..........................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.........................^...^.^...^.^.^.^...^...^...^...^.^...^.^.^.^.^.^.^...^.^.^.^...^.^.^.^.^.^...^.....^...^.^.........................
|
||||||
|
.............................................................................................................................................
|
||||||
|
........................^.^.^...^.^.^.......^...^.^.^.^.^.^...^.^.^...^...^.^.^...^.^.^...^.^.^.^...^...^.^.^.^.^.^.^........................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.......................^...^...^.^.^.....^.^.....^.....^.^.^...^.^.......^.^.^.....^...^.^.....^.^.^.^.....^.^.^...^.^.......................
|
||||||
|
.............................................................................................................................................
|
||||||
|
......................^.......^.^.^...^.^...^.^...^.^.^.^.....^.^.^.^.^...^.^.^.^.^.^.....^.^.^.^.^.^.^.^.^.....^.^...^......................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.....................^.^.^.^.^.^.^.^.^...^.^.^.^.....^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^...^.^.^...^.^.^.^.^.^.^...^.^.^.^.....................
|
||||||
|
.............................................................................................................................................
|
||||||
|
....................^.^...^.....^.^.^.^...^.^.^...^.^.^.^...^.^...^.^.^.....^.....^.^.^...^.^.^...^...^...^.^...^.^...^.^....................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...................^.^.^.^.^.^.^...^.^...^.^.^.^...^.^.^.^.....^...^.^.^.^...^.^.^.^.^.^.......^.^...^.^.^.^.....^.^...^.^...................
|
||||||
|
.............................................................................................................................................
|
||||||
|
..................^.^.^...^.^...^...^.^.^.........^...^.^.^.^.^.^.^.^.^.^.....^.^...^...^.^.^.......^...^.....^...^.^.^...^..................
|
||||||
|
.............................................................................................................................................
|
||||||
|
.................^.^.^.^...^.^.^...^...^...^...^.^.^.^.......^.^.^.^.....^...^.^.^.^...^.^...^.^...^.....^.^.^.^.^.^.......^.................
|
||||||
|
.............................................................................................................................................
|
||||||
|
................^.^.....^...^.^.^...^.......^.^.^.^...^.^...^.^.^.^.^.^.^.......^...^...^...^...^.^...^...^...^...^.^.^.^.^.^................
|
||||||
|
.............................................................................................................................................
|
||||||
|
...............^.^.....^.....^.^.^.^.^.^...^.^...^.^.^.^.....^.^.^.^.^...^...^.^.^.......^.^.^.^.^...^.^...^...^.^.^.^.^.^...^...............
|
||||||
|
.............................................................................................................................................
|
||||||
|
..............^.^...^...^...^.^.^...^...^...^...^.^...^.^.^.^.^...^.^.^.^.^.^.^.^...^.^.......^.....^.........^.^.^.^.^.^.^.^.^..............
|
||||||
|
.............................................................................................................................................
|
||||||
|
.............^.^.^.^.^...^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^...^.^.^.^.......^...^.^...^.^.^.^.^.....^.^.^...^.............
|
||||||
|
.............................................................................................................................................
|
||||||
|
............^.....^.^.^.^.^.^.^.^.^.....^.^...^...^...^.^.^.^.........^.^.^.....^...^.^...^.^.^.....^.^.^.^.^...^.....^.^.^...^.^............
|
||||||
|
.............................................................................................................................................
|
||||||
|
...........^.....^.^...^.^...^.^.^.^...^...^...^.^.^.^.^.^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^.^.^.......^.^.^.^.^...^.^.^.^.....^.^.^...........
|
||||||
|
.............................................................................................................................................
|
||||||
|
..........^...^.^...^.^.^.^.^.^.^...^.^...^.^.^...^...^.^.^.....^.^.^.......^.^.^.^...^.^.^...^.^.^.^.^.^...^.^.....^...^...^.^...^..........
|
||||||
|
.............................................................................................................................................
|
||||||
|
.........^.^.^.^...^.^.^.....^.^...^.^.......^.^.....^.^.^.^.^.....^.^...^...^.^.^.......^.^.^.^.^...^.......^.^...^.^...^.^.^...^.^.........
|
||||||
|
.............................................................................................................................................
|
||||||
|
........^.^.....^.....^.^...^.^.....^.^...^.....^.^...^.^...^.^...^...^...^.^...^.^.^...^...^.^.....^.^.^.^.^.^.^...^.^.^.^...^.^.^.^........
|
||||||
|
.............................................................................................................................................
|
||||||
|
.......^.^.^...^.^.^.^.^...^...^...^.^.^.^.^.....^.^.^.^.^.^.^.^...^.^.^.^.^.^...^.^...^.^.......^.^.^.....^.^.^.^.^...^.....^.^...^.^.......
|
||||||
|
.............................................................................................................................................
|
||||||
|
......^.^.....^.^...^.^.^.^.^.....^...^...^.....^.^...^.^.......^.^.^.......^.....^.^.^.^.^.^.^.^.^.^...^.^.^.^.^.^...^...^.^...^.^.^.^......
|
||||||
|
.............................................................................................................................................
|
||||||
|
.....^.^.^.^.^...^...^.^.^...^.^.....^.^...^.......^.^.^...^.^...^.^.^.^.....^...^.^.^...^.^.^.^.....^.^.^.....^...^.^.^.^.^.^.^.^.^...^.....
|
||||||
|
.............................................................................................................................................
|
||||||
|
....^.^.^.^.^.^.^.^.^.........^.^...^.^.^.^.^.^.^.^.^...^.^.^...^.^.^.^.^.^...^.^.^.^.^.^...^.^.^...^.^.^...^...^.^...^.^.^.^.^.^...^.^.^....
|
||||||
|
.............................................................................................................................................
|
||||||
|
...^...^.....^...^.^.^.^.^...^.....^...^.^...^.^.^.^.^.^...^.^...^.^.^...^.^.^.^.^...^.^.^.^...^.^.^.^.^.^.^.........^.^...^.^.^.^.^.^.^.^...
|
||||||
|
.............................................................................................................................................
|
||||||
|
..^.....^.^.......^.^.^.^.^.^.^.^...^.^.^...^.^.^.^.^.^.^.^...^.^.^...^.^.^.^.....^.^.^...^.....^.^.^...^.^.^.^.........^.^.....^.....^.^.^..
|
||||||
|
.............................................................................................................................................
|
||||||
|
.^.^.^...^.^...^.^.^...^...^...^.....^.^...^.^...^.^.^...^...^.^...^...^.....^.....^.^.^...^.^.^.....^...^...^.^.^.^.^.^.....^.^.^.......^.^.
|
||||||
|
.............................................................................................................................................
|
||||||
Loading…
Add table
Add a link
Reference in a new issue