aboutsummaryrefslogtreecommitdiff
path: root/Puzzle15.hs
blob: 104e2aa75b7b9130f7a30ac5a4ab3e223e371a02 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import Data.Int

stepA :: Int64 -> Int64
stepA x = x * 16807 `mod` 2147483647
stepB :: Int64 -> Int64
stepB x = x * 48271 `mod` 2147483647

toInt16 :: Int64 -> Int16
toInt16 = fromIntegral

stepAB :: ((Int64, Int64), Int) -> ((Int64, Int64), Int)
stepAB ((x, y), n) = ((stepA x, stepB y), if (toInt16 x) == (toInt16 y) then n + 1 else n)

solve1' :: ((Int64, Int64), Int) -> Int -> ((Int64, Int64), Int)
solve1' z 0 = z
solve1' z m = let !w = stepAB z in let !m' = m - 1 in solve1' w m'

solve1 :: (Int64, Int64) -> Int
solve1 (x, y) = snd $ solve1' ((x, y), 0) 40000000

input :: (Int64, Int64)
input = (783, 325)

main = (putStrLn . show . solve1) input