From 9052fd9db6e534f0c01f2feecc19d57f086af335 Mon Sep 17 00:00:00 2001 From: Jonathan Chan Date: Tue, 12 Dec 2017 09:28:43 -0800 Subject: [PATCH] Day 6, part 1 --- 6.hs | 37 +++++++++++++++++++++++++++++++++++++ 6.txt | 1 + 2 files changed, 38 insertions(+) create mode 100644 6.hs create mode 100644 6.txt diff --git a/6.hs b/6.hs new file mode 100644 index 0000000..79f67c4 --- /dev/null +++ b/6.hs @@ -0,0 +1,37 @@ +import Data.Foldable +import Data.HashSet +import Data.Sequence + +type Bank = Seq Int +type Config = (Bank, Data.HashSet.HashSet [Int]) + +(%) :: Int -> Int -> Int +(%) = mod + +getMaxMem :: Bank -> (Int, Int) +getMaxMem bank = + foldlWithIndex (\(currIndex, currMax) index value -> if value > currMax then (index, value) else (currIndex, currMax)) (0, 0) bank + +nextBank :: Bank -> Bank +nextBank bank = + let len = Data.Sequence.length bank + (index, value) = getMaxMem bank + zeroedBank = update index 0 bank + mappedBank = fmap (+ value `div` len) zeroedBank + indicesToUpdate = fmap (% len) [(index + 1)..(index + value % len)] + in mapWithIndex (\i v -> if i `elem` indicesToUpdate then v + 1 else v) mappedBank + + +cycles :: Int -> Config -> Int +cycles count (prevBank, configs) = + let bank = nextBank prevBank + hashableBank = Data.Foldable.toList bank + in if member hashableBank configs + then count + 1 + else cycles (count + 1) (bank, insert hashableBank configs) + +main :: IO () +main = do + input <- readFile "6.txt" + let bank = Data.Sequence.fromList $ fmap read $ words input :: Bank + print $ cycles 0 (bank, Data.HashSet.empty) diff --git a/6.txt b/6.txt new file mode 100644 index 0000000..bb545e3 --- /dev/null +++ b/6.txt @@ -0,0 +1 @@ +14 0 15 12 11 11 3 5 1 6 8 4 9 1 8 4 \ No newline at end of file