Fixed a bug that isn't a bug in practice
[advent-of-code-17.git] / src / advent15 / advent15.hs
1 import Data.Word
2 import Data.Bits
3
4 generatorAStart = 873
5 generatorBStart = 583
6
7 main :: IO ()
8 main = do
9 print $ part1
10 print $ part2
11
12 part1 = length $ filter (uncurry (==)) $ take 40000000 $ zip streamA streamB
13
14
15 part2 = length $ filter (uncurry (==)) $ take 5000000 $ zip fsA fsB
16 where fsA = stream' 4 generatorA generatorAStart -- filteredStream 3 streamA
17 fsB = stream' 8 generatorB generatorBStart -- filteredStream 7 streamB
18
19
20 generatorA = generator 2147483647 16807
21 generatorB = generator 2147483647 48271
22
23 streamA = stream generatorA generatorAStart
24 streamB = stream generatorB generatorBStart
25
26 generator :: Int -> Int -> Int -> Int
27 generator divisor factor n = n * factor `rem` divisor
28
29 toWord16 :: Int -> Word16
30 toWord16 = fromIntegral
31
32 stream :: (Int -> Int) -> Int -> [Word16]
33 stream gen n0 = map toWord16 $ drop 1 $ iterate gen n0
34
35 stream' :: Int -> (Int -> Int) -> Int -> [Word16]
36 stream' f gen n0 = map toWord16 $ filter ((== 0) . (`mod` f)) $ drop 1 $ iterate gen n0
37
38
39 -- filteredStream :: Word16 -> [Word16] -> [Word16]
40 -- filteredStream f = filter ((== 0) . ( .&. f))
41