29 lines
884 B
Haskell
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'
|