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

  • VegOwOtenks@lemmy.world
    link
    fedilink
    English
    arrow-up
    3
    ·
    20 days ago

    Haskell

    I’m not very proud, I copied my code for part two.

    import Control.Arrow hiding (first, second)
    
    import qualified Data.List as List
    import qualified Data.Char as Char
    
    parseLine l = (n, os)
            where
                    n = read . takeWhile (Char.isDigit) $ l
                    os = map read . drop 1 . words $ l
    
    parse :: String -> [(Int, [Int])]
    parse s = map parseLine . takeWhile (/= "") . lines $ s
    
    insertOperators target (r:rs) = any (target ==) (insertOperators' r rs)
    insertOperators' :: Int -> [Int] -> [Int]
    insertOperators' acc []     = [acc]
    insertOperators' acc (r:rs) = insertOperators' (acc+r) rs ++ insertOperators' (acc*r) rs
    
    insertOperators2 target (r:rs) = any (target ==) (insertOperators2' r rs)
    insertOperators2' :: Int -> [Int] -> [Int]
    insertOperators2' acc []     = [acc]
    insertOperators2' acc (r:rs) = insertOperators2' (acc+r) rs ++ insertOperators2' (acc*r) rs ++ insertOperators2' concatN rs
            where
                    concatN = read (show acc ++ show r)
    
    part1 ls = filter (uncurry insertOperators)
            >>> map fst
            >>> sum
            $ ls
    part2 ls = filter (uncurry insertOperators2)
            >>> map fst
            >>> sum
            $ ls
    
    main = getContents >>= print . (part1 &&& part2) . parse