advent-of-code/2017/15/day15.hs
2024-11-12 21:46:18 +01:00

29 lines
884 B
Haskell

#!/usr/bin/env stack
-- stack --resolver lts-9.18 script
import Data.Bits
import Data.List
genA :: Integral a => a -> a
genA n = (16807 * n) `rem` 2147483647
genB :: Integral a => a -> a
genB n = (48271 * n) `rem` 2147483647
matchLowest16Bits :: (Bits a, Num a) => a -> a -> Bool
matchLowest16Bits n1 n2 =
n1 .&. 0xFFFF == n2 .&. 0xFFFF
main :: IO ()
main = do
let (inputA, inputB) = (783, 325) :: (Int, Int)
let n = 40000000
let seqA = take n $ iterate genA inputA
let seqB = take n $ iterate genB inputB
print . foldl' (flip ((+) . fromEnum)) 0 $ zipWith matchLowest16Bits seqA seqB
let n' = 5000000
let seqA' = take n' . filter (\k -> k `rem` 4 == 0)
$ iterate genA inputA
let seqB' = take n' . filter (\k -> k `rem` 8 == 0)
$ iterate genB inputB
print . foldl' (flip ((+) . fromEnum)) 0 $ zipWith matchLowest16Bits seqA' seqB'