projects
/
advent-of-code-23.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Updated blog link
[advent-of-code-23.git]
/
advent14
/
Main.hs
diff --git
a/advent14/Main.hs
b/advent14/Main.hs
index efd4db67d00a14345dcb2b4b58418bd4654e9584..1d0e71eb9313e5e7e3aaa1ab45911bcd90e467e3 100644
(file)
--- a/
advent14/Main.hs
+++ b/
advent14/Main.hs
@@
-1,4
+1,4
@@
--- Writeup at https://work.njae.me.uk/2023/12/1
5/advent-of-code-2023-day-13
/
+-- Writeup at https://work.njae.me.uk/2023/12/1
8/advent-of-code-2023-day-14
/
import AoC
import Data.List
import AoC
import Data.List
@@
-17,33
+17,19
@@
main =
do dataFileName <- getDataFileName
text <- readFile dataFileName
let grid = transpose $ fmap (fmap readElem) $ lines text
do dataFileName <- getDataFileName
text <- readFile dataFileName
let grid = transpose $ fmap (fmap readElem) $ lines text
- -- print grid
- -- print $ rollGrid $ transpose grid
- -- let r1 = rollToCompletion grid
- -- print r1
- -- putStrLn $ showGrid r1
- -- print $ transpose $ fmap reverse r1
+ -- print $ showGrid grid
print $ part1 grid
print $ part1 grid
- -- print $ rollCycle grid
- -- putStrLn $ showGrid $ rollCycle grid
- -- putStrLn $ showGrid $ rollCycle $ rollCycle grid
- -- putStrLn $ showGrid $ rollCycle $ rollCycle $ rollCycle grid
- -- print $ findRepeat grid
-
-
-
print $ part2 grid
print $ part2 grid
- -- print $ part2 patts
-part1 :: Grid -> Int
+part1
, part2
:: Grid -> Int
part1 grid = scoreGrid grid'
where grid' = rollToCompletion grid
part2 grid = scoreGrid finalGrid
part1 grid = scoreGrid grid'
where grid' = rollToCompletion grid
part2 grid = scoreGrid finalGrid
- where (grid', cache,
i
) = findRepeat grid
+ where (grid', cache,
repeatEnd
) = findRepeat grid
repeatStart = cache M.! grid'
repeatStart = cache M.! grid'
- repeatLen =
i
- repeatStart
- finalIndex = (
1e9 - repeatStart - 1) `mod` repeatLen
+ repeatLen =
repeatEnd
- repeatStart
+ finalIndex = (
(1e9 - repeatStart) `mod` repeatLen) + repeatStart
(finalGrid, _) = M.findMin $ M.filter (== finalIndex) cache
readElem :: Char -> Element
(finalGrid, _) = M.findMin $ M.filter (== finalIndex) cache
readElem :: Char -> Element
@@
-78,15
+64,13
@@
rotate1 = transpose . fmap reverse
rollCycle :: Grid -> Grid
rollCycle = appEndo (stimes 4 (Endo rotate1 <> Endo rollToCompletion))
rollCycle :: Grid -> Grid
rollCycle = appEndo (stimes 4 (Endo rotate1 <> Endo rollToCompletion))
+findRepeat :: Grid -> (Grid, Cache, Int)
+findRepeat grid = head $ dropWhile test $ iterate go (grid, M.empty, 0)
+ where test (g, c, _) = g `M.notMember` c
+ go (g, c, i) = (rollCycle g, M.insert g i c, (i + 1))
+
showGrid :: Grid -> String
showGrid grid = unlines $ fmap (fmap showElem) $ transpose grid
where showElem Empty = '.'
showElem Cube = '#'
showElem Round = 'O'
showGrid :: Grid -> String
showGrid grid = unlines $ fmap (fmap showElem) $ transpose grid
where showElem Empty = '.'
showElem Cube = '#'
showElem Round = 'O'
-
-
-rollCycleWithCache (grid, cache, index) = (rollCycle grid, M.insert grid index cache, (index + 1))
-
-findRepeat grid = head $ dropWhile test $ iterate rollCycleWithCache (grid, M.empty, 0)
- where test (g, c, i) = g `M.notMember` c
-