X-Git-Url: https://git.njae.me.uk/?a=blobdiff_plain;f=src%2Fadvent15%2Fadvent15.hs;fp=src%2Fadvent15%2Fadvent15.hs;h=7cec0d024da9784b39d3fc7a7d6dcafe4950d2cb;hb=cfe831809e32c1b0c9746eb9939fe0a2cd9a1d37;hp=0000000000000000000000000000000000000000;hpb=21c544baf22df89b359ae657654875bc1e2f62f9;p=advent-of-code-17.git diff --git a/src/advent15/advent15.hs b/src/advent15/advent15.hs new file mode 100644 index 0000000..7cec0d0 --- /dev/null +++ b/src/advent15/advent15.hs @@ -0,0 +1,37 @@ +import Data.Word +import Data.Bits + +generatorAStart = 873 +generatorBStart = 583 + +main :: IO () +main = do + print $ part1 + print $ part2 + +part1 = length $ filter (uncurry (==)) $ take 40000000 $ zip streamA streamB + + +part2 = length $ filter (uncurry (==)) $ take 5000000 $ zip fsA fsB + where fsA = filteredStream 3 streamA + fsB = filteredStream 7 streamB + + +generatorA = generator 2147483647 16807 +generatorB = generator 2147483647 48271 + +streamA = stream generatorA generatorAStart +streamB = stream generatorB generatorBStart + +generator :: Word64 -> Word64 -> Word64 -> Word64 +generator divisor factor n = fromIntegral $ fromIntegral n * factor `rem` divisor + +toWord16 :: Word64 -> Word16 +toWord16 = fromIntegral + +stream :: (Word64 -> Word64) -> Word64 -> [Word16] +stream gen n0 = map toWord16 $ drop 1 $ iterate gen n0 + +filteredStream :: Word16 -> [Word16] -> [Word16] +filteredStream f str = filter (\n -> n .&. f == 0) str +