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
- What is this?: Here is a post with a large amount of details: https://programming.dev/post/6637268
- Where do I participate?: https://adventofcode.com/
- Is there a leaderboard for the community?: We have a programming.dev leaderboard with the info on how to join in this post: https://programming.dev/post/6631465
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
Oooh, some nice number theory going on there!