1
0
Fork 0
adventofcode/06.hs

38 lines
1.2 KiB
Haskell
Raw Normal View History

import Data.Foldable (toList)
import Data.Maybe
import Data.HashMap (Map, member, insert, findWithDefault, empty)
import Data.Sequence (Seq, update, fromList, elemIndexL, mapWithIndex)
import qualified Data.Sequence as S (length)
2017-12-12 17:28:43 +00:00
type Bank = Seq Int
type Config = (Bank, Map [Int] Int)
2017-12-12 17:28:43 +00:00
(%) = mod
2017-12-12 17:28:52 +00:00
(//) = div
2017-12-12 17:28:43 +00:00
getMaxMem :: Bank -> (Int, Int)
getMaxMem bank =
(fromJust $ elemIndexL (maximum bank) bank, maximum bank)
2017-12-12 17:28:43 +00:00
nextBank :: Bank -> Bank
nextBank bank =
let len = S.length bank
2017-12-12 17:28:43 +00:00
(index, value) = getMaxMem bank
newBank = fmap (+ value // len) $ update index 0 bank
indices = fmap (% len) [index + 1..index + value % len]
in mapWithIndex (\i v -> v + fromEnum (i `elem` indices)) newBank
2017-12-12 17:28:43 +00:00
2017-12-12 17:28:47 +00:00
cycles :: Int -> Config -> (Int, Int)
2017-12-12 17:28:52 +00:00
cycles prevCount (prevBank, banks) =
let count = prevCount + 1
bank = nextBank prevBank
hashableBank = toList bank
2017-12-12 17:28:52 +00:00
in if member hashableBank banks
then (count, count - findWithDefault undefined hashableBank banks)
else cycles count (bank, insert hashableBank count banks)
2017-12-12 17:28:43 +00:00
main :: IO ()
main = do
bank <- fmap (fromList . map read . words) $ readFile "6.txt"
print $ cycles 0 (bank, empty)