Day 6 solution
This commit is contained in:
parent
b3834afba9
commit
18ea7d1466
3 changed files with 49 additions and 0 deletions
1
6/example.txt
Normal file
1
6/example.txt
Normal file
|
@ -0,0 +1 @@
|
|||
3,4,3,1,2
|
1
6/input.txt
Normal file
1
6/input.txt
Normal file
|
@ -0,0 +1 @@
|
|||
1,2,1,3,2,1,1,5,1,4,1,2,1,4,3,3,5,1,1,3,5,3,4,5,5,4,3,1,1,4,3,1,5,2,5,2,4,1,1,1,1,1,1,1,4,1,4,4,4,1,4,4,1,4,2,1,1,1,1,3,5,4,3,3,5,4,1,3,1,1,2,1,1,1,4,1,2,5,2,3,1,1,1,2,1,5,1,1,1,4,4,4,1,5,1,2,3,2,2,2,1,1,4,3,1,4,4,2,1,1,5,1,1,1,3,1,2,1,1,1,1,4,5,5,2,3,4,2,1,1,1,2,1,1,5,5,3,5,4,3,1,3,1,1,5,1,1,4,2,1,3,1,1,4,3,1,5,1,1,3,4,2,2,1,1,2,1,1,2,1,3,2,3,1,4,5,1,1,4,3,3,1,1,2,2,1,5,2,1,3,4,5,4,5,5,4,3,1,5,1,1,1,4,4,3,2,5,2,1,4,3,5,1,3,5,1,3,3,1,1,1,2,5,3,1,1,3,1,1,1,2,1,5,1,5,1,3,1,1,5,4,3,3,2,2,1,1,3,4,1,1,1,1,4,1,3,1,5,1,1,3,1,1,1,1,2,2,4,4,4,1,2,5,5,2,2,4,1,1,4,2,1,1,5,1,5,3,5,4,5,3,1,1,1,2,3,1,2,1,1
|
47
6/solution.hs
Normal file
47
6/solution.hs
Normal file
|
@ -0,0 +1,47 @@
|
|||
import Data.List
|
||||
|
||||
main :: IO ()
|
||||
main = do
|
||||
input <- readFile "6/input.txt"
|
||||
let x = parse input
|
||||
-- Problem 1
|
||||
print $ f x
|
||||
-- Problem 2
|
||||
print $ g x
|
||||
where
|
||||
f = solve 80
|
||||
g = solve 256
|
||||
|
||||
parse :: String -> [Int]
|
||||
parse = map read . words . map f
|
||||
where f ',' = ' '
|
||||
f x = x
|
||||
|
||||
-- Solve the problem by creating an association list mapping a
|
||||
-- value for the internal timer to a number of fishies as the seed,
|
||||
-- and then simulating `n` iterations of growth.
|
||||
solve :: Int -- ^ n: The number of generations to simulate
|
||||
-> [Int] -- ^ The initial population
|
||||
-> Int -- ^ The total population at the end of n generations
|
||||
solve n = sum . map snd . simulate n . map assoc . group . sort
|
||||
where assoc x = (head x, length x)
|
||||
|
||||
-- Simulate `n` iterations of growth and return the state
|
||||
-- after that many iterations.
|
||||
simulate :: Int -> [(Int, Int)] -> [(Int, Int)]
|
||||
simulate 0 st = st
|
||||
simulate n st = simulate (n - 1) (update st)
|
||||
|
||||
-- Update the simulation state by one iteration.
|
||||
update :: [(Int, Int)] -> [(Int, Int)]
|
||||
update = merge . (>>= f)
|
||||
where f (0, n) = [(6, n), (8, n)]
|
||||
f (t, n) = [(t - 1, n)]
|
||||
|
||||
-- Merge the values of duplicate key entries and produce a new list
|
||||
-- where each key is mapped to the sum of all values associated with
|
||||
-- that key.
|
||||
merge :: [(Int, Int)] -> [(Int, Int)]
|
||||
merge [] = []
|
||||
merge ((t,n) : ls) = (t, n + sum (map snd x)) : merge r
|
||||
where (x,r) = partition ((== t) . fst) ls
|
Loading…
Reference in a new issue