Guest User

Untitled

a guest
Dec 18th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.08 KB | None | 0 0
  1. module Main where
  2.  
  3. import Data.Bits
  4.  
  5. parse :: String -> Int
  6. parse x =
  7. case words x of
  8. ["Generator", _, "starts", "with", y] -> read y
  9. _ -> 0
  10.  
  11. type Generator = Int -> Int
  12.  
  13. generator :: Int -> Generator
  14. generator factor previous = (previous * factor) `rem` 2147483647
  15. {-# INLINE generator #-}
  16.  
  17. generatorA, generatorB :: Generator
  18. generatorA = generator 16807
  19. generatorB = generator 48271
  20.  
  21. matchLo :: (Num a, Bits a) => a -> a -> Bool
  22. matchLo l r = l .&. 0xffff == r .&. 0xffff
  23. {-# INLINE matchLo #-}
  24.  
  25. day15 :: Int -> [Int] -> [Int] -> Int
  26. day15 limit as bs = length . filter (uncurry matchLo) . take limit $ zip as bs
  27. {-# INLINE day15 #-}
  28.  
  29. part1, part2 :: Int -> Int -> Int -> Int
  30. part1 limit a b = day15 limit (iterate generatorA a) (iterate generatorB b)
  31. part2 limit a b =
  32. day15
  33. limit
  34. (filter (4 `divides`) $ iterate generatorA a)
  35. (filter (8 `divides`) $ iterate generatorB b)
  36. where
  37. a `divides` b = b `rem` a == 0
  38.  
  39. main :: IO ()
  40. main = do
  41. a <- parse <$> getLine
  42. b <- parse <$> getLine
  43. print $ part1 40000000 a b
  44. print $ part2 5000000 a b
Add Comment
Please, Sign In to add comment