Filtered the modified stream at source, rather than relying on list fusion that didn...
[advent-of-code-17.git] / src / advent15 / advent15.hs
index 7cec0d024da9784b39d3fc7a7d6dcafe4950d2cb..5aba6d7aba8dd811cbf80ac5666958b52bb38d81 100644 (file)
@@ -13,8 +13,8 @@ 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
+    where fsA = stream' 4 generatorA generatorAStart -- filteredStream 3 streamA
+          fsB = stream' 8 generatorB generatorBStart -- filteredStream 7 streamB
 
 
 generatorA = generator 2147483647 16807
@@ -23,15 +23,19 @@ 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
+generator :: Int -> Int -> Int -> Int
+generator divisor factor n = n * factor `rem` divisor
 
-toWord16 :: Word64 -> Word16
+toWord16 :: Int -> Word16
 toWord16 = fromIntegral
 
-stream :: (Word64 -> Word64) -> Word64 -> [Word16]
+stream :: (Int -> Int) -> Int -> [Word16]
 stream gen n0 = map toWord16 $ drop 1 $ iterate gen n0
 
-filteredStream :: Word16 -> [Word16] -> [Word16]
-filteredStream f str = filter (\n -> n .&. f == 0) str
+stream' :: Int -> (Int -> Int) -> Int -> [Word16]
+stream' f gen n0 = map toWord16 $ drop 1 $ filter ((== 0) . (`mod` f)) $ iterate gen n0
+
+
+-- filteredStream :: Word16 -> [Word16] -> [Word16]
+-- filteredStream f = filter ((== 0) . ( .&. f))