Day 6, updated for part 2
This commit is contained in:
parent
9052fd9db6
commit
2b209648d5
14
6.hs
14
6.hs
|
@ -1,9 +1,9 @@
|
||||||
import Data.Foldable
|
import Data.Foldable
|
||||||
import Data.HashSet
|
import Data.HashMap
|
||||||
import Data.Sequence
|
import Data.Sequence
|
||||||
|
|
||||||
type Bank = Seq Int
|
type Bank = Seq Int
|
||||||
type Config = (Bank, Data.HashSet.HashSet [Int])
|
type Config = (Bank, Data.HashMap.Map [Int] Int)
|
||||||
|
|
||||||
(%) :: Int -> Int -> Int
|
(%) :: Int -> Int -> Int
|
||||||
(%) = mod
|
(%) = mod
|
||||||
|
@ -16,22 +16,22 @@ nextBank :: Bank -> Bank
|
||||||
nextBank bank =
|
nextBank bank =
|
||||||
let len = Data.Sequence.length bank
|
let len = Data.Sequence.length bank
|
||||||
(index, value) = getMaxMem bank
|
(index, value) = getMaxMem bank
|
||||||
zeroedBank = update index 0 bank
|
zeroedBank = Data.Sequence.update index 0 bank
|
||||||
mappedBank = fmap (+ value `div` len) zeroedBank
|
mappedBank = fmap (+ value `div` len) zeroedBank
|
||||||
indicesToUpdate = fmap (% len) [(index + 1)..(index + value % len)]
|
indicesToUpdate = fmap (% len) [(index + 1)..(index + value % len)]
|
||||||
in mapWithIndex (\i v -> if i `elem` indicesToUpdate then v + 1 else v) mappedBank
|
in mapWithIndex (\i v -> if i `elem` indicesToUpdate then v + 1 else v) mappedBank
|
||||||
|
|
||||||
|
|
||||||
cycles :: Int -> Config -> Int
|
cycles :: Int -> Config -> (Int, Int)
|
||||||
cycles count (prevBank, configs) =
|
cycles count (prevBank, configs) =
|
||||||
let bank = nextBank prevBank
|
let bank = nextBank prevBank
|
||||||
hashableBank = Data.Foldable.toList bank
|
hashableBank = Data.Foldable.toList bank
|
||||||
in if member hashableBank configs
|
in if member hashableBank configs
|
||||||
then count + 1
|
then (count + 1, (count + 1) - findWithDefault undefined hashableBank configs)
|
||||||
else cycles (count + 1) (bank, insert hashableBank configs)
|
else cycles (count + 1) (bank, insert hashableBank (count + 1) configs)
|
||||||
|
|
||||||
main :: IO ()
|
main :: IO ()
|
||||||
main = do
|
main = do
|
||||||
input <- readFile "6.txt"
|
input <- readFile "6.txt"
|
||||||
let bank = Data.Sequence.fromList $ fmap read $ words input :: Bank
|
let bank = Data.Sequence.fromList $ fmap read $ words input :: Bank
|
||||||
print $ cycles 0 (bank, Data.HashSet.empty)
|
print $ cycles 0 (bank, Data.HashMap.empty)
|
||||||
|
|
Loading…
Reference in New Issue