69 lines
2.4 KiB
Haskell
69 lines
2.4 KiB
Haskell
|
|
{-# LANGUAGE OverloadedStrings #-}
|
||
|
|
{-# LANGUAGE QuasiQuotes #-}
|
||
|
|
|
||
|
|
module Day11Spec (spec) where
|
||
|
|
|
||
|
|
import Data.Foldable (toList)
|
||
|
|
import qualified Data.Sequence as S
|
||
|
|
import Data.Text (Text)
|
||
|
|
import Day11
|
||
|
|
import Day11.Parser
|
||
|
|
import Test.Hspec
|
||
|
|
import Text.Heredoc
|
||
|
|
import Data.Int (Int64)
|
||
|
|
|
||
|
|
testInput :: Text
|
||
|
|
testInput =
|
||
|
|
[str|Monkey 0:
|
||
|
|
| Starting items: 79, 98
|
||
|
|
| Operation: new = old * 19
|
||
|
|
| Test: divisible by 23
|
||
|
|
| If true: throw to monkey 2
|
||
|
|
| If false: throw to monkey 3
|
||
|
|
|
|
||
|
|
|Monkey 1:
|
||
|
|
| Starting items: 54, 65, 75, 74
|
||
|
|
| Operation: new = old + 6
|
||
|
|
| Test: divisible by 19
|
||
|
|
| If true: throw to monkey 2
|
||
|
|
| If false: throw to monkey 0
|
||
|
|
|
|
||
|
|
|Monkey 2:
|
||
|
|
| Starting items: 79, 60, 97
|
||
|
|
| Operation: new = old * old
|
||
|
|
| Test: divisible by 13
|
||
|
|
| If true: throw to monkey 1
|
||
|
|
| If false: throw to monkey 3
|
||
|
|
|
|
||
|
|
|Monkey 3:
|
||
|
|
| Starting items: 74
|
||
|
|
| Operation: new = old + 3
|
||
|
|
| Test: divisible by 17
|
||
|
|
| If true: throw to monkey 0
|
||
|
|
| If false: throw to monkey 1
|
||
|
|
|]
|
||
|
|
|
||
|
|
exampleMonkeys :: [Monkey]
|
||
|
|
exampleMonkeys = parseMonkeys testInput
|
||
|
|
|
||
|
|
spec :: Spec
|
||
|
|
spec =
|
||
|
|
describe "Day11" $ do
|
||
|
|
describe "Part1" $ do
|
||
|
|
it "parses" $ do
|
||
|
|
head exampleMonkeys `shouldBe` Monkey 0 (S.fromList [79, 98]) (Multiply (Fixed 19)) 23 2 3 0
|
||
|
|
_items (exampleMonkeys !! 1) `shouldBe` S.fromList [54, 65, 75, 74]
|
||
|
|
it "runs part 1 monkey machine for 20 rounds" $ do
|
||
|
|
let monkeys = runMonkeyMachine divideBy3 20 exampleMonkeys
|
||
|
|
map _inspectionCount monkeys
|
||
|
|
`shouldBe` [101, 95, 7, 105]
|
||
|
|
map _inspectionCount (mostActiveMonkeys monkeys) `shouldBe` [105, 101]
|
||
|
|
map _nr (mostActiveMonkeys monkeys) `shouldBe` [3, 0]
|
||
|
|
monkeyBusiness (mostActiveMonkeys monkeys) `shouldBe` 10605
|
||
|
|
|
||
|
|
it "runs part 2 monkey machine for 10000 rounds" $ do
|
||
|
|
let monkeys = runMonkeyMachine (worryLimit exampleMonkeys) 10000 exampleMonkeys
|
||
|
|
map _inspectionCount monkeys
|
||
|
|
`shouldBe` [52166, 47830, 1938, 52013]
|
||
|
|
monkeyBusiness (mostActiveMonkeys monkeys) `shouldBe` 2713310158
|