Day 22: Monkey Market

Megathread guidelines

  • Keep top level comments as only solutions, if you want to say something other than a solution put it in a new post. (replies to comments can be whatever)
  • You can send code in code blocks by using three backticks, the code, and then three backticks or use something such as https://topaz.github.io/paste/ if you prefer sending it through a URL

FAQ

  • lwhjp
    link
    19 hours ago

    Haskell

    A nice easy one today; shame I couldn’t start on time. I had a go at refactoring to reduce the peak memory usage, but it just ended up a mess. Here’s a tidy version.

    import Data.Bits
    import Data.List
    import Data.Map (Map)
    import Data.Map qualified as Map
    
    next :: Int -> Int
    next = flip (foldl' (\x n -> (x `xor` shift x n) .&. 0xFFFFFF)) [6, -5, 11]
    
    bananaCounts :: Int -> Map [Int] Int
    bananaCounts seed =
      let secrets = iterate next seed
          prices = map (`mod` 10) secrets
          changes = zipWith (-) (drop 1 prices) prices
          sequences = map (take 4) $ tails changes
       in Map.fromListWith (const id) $
            take 2000 (zip sequences (drop 4 prices))
    
    main = do
      input <- map read . lines <$> readFile "input22"
      print . sum $ map ((!! 2000) . iterate next) input
      print . maximum $ Map.unionsWith (+) $ map bananaCounts input