Day 7: Bridge Repair

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

  • LeixB@lemmy.world
    link
    fedilink
    arrow-up
    4
    ·
    16 days ago

    Haskell

    import Control.Arrow
    import Data.Char
    import Text.ParserCombinators.ReadP
    
    numP = read <$> munch1 isDigit
    parse = endBy ((,) <$> (numP <* string ": ") <*> sepBy numP (char ' ')) (char '\n')
    
    valid n [m] = m == n
    valid n (x : xs) = n > 0 && valid (n - x) xs || (n `mod` x) == 0 && valid (n `div` x) xs
    
    part1 = sum . fmap fst . filter (uncurry valid . second reverse)
    
    concatNum r = (+r) . (* 10 ^ digits r)
        where
            digits = succ . floor . logBase 10 . fromIntegral
    
    allPossible [n] = [n]
    allPossible (x:xs) = ((x+) <$> rest) ++ ((x*) <$> rest) ++ (concatNum x <$> rest)
        where
            rest = allPossible xs
    
    part2 = sum . fmap fst . filter (uncurry elem . second (allPossible . reverse))
    
    main = getContents >>= print . (part1 &&& part2) . fst . last . readP_to_S parse