diff --git a/adventofcode.cabal b/adventofcode.cabal index 274b6f1..dfbe447 100644 --- a/adventofcode.cabal +++ b/adventofcode.cabal @@ -2,7 +2,7 @@ -- -- see: https://github.com/sol/hpack -- --- hash: d871caa5723224d888f552d659e29f2e860d791e12ad0c0d7ced450d2334b83d +-- hash: 877996d6cd90e6a9a1d5d7f01e79fd91225f46e4cf930943da73fad95dda8ea0 name: adventofcode version: 0.1.0.0 @@ -47,8 +47,8 @@ library Day15 Day16 Day17 - other-modules: Day18 + other-modules: Permutations Paths_adventofcode build-depends: diff --git a/app/Main.hs b/app/Main.hs index 547069f..378ebdf 100644 --- a/app/Main.hs +++ b/app/Main.hs @@ -25,6 +25,7 @@ import qualified Day14 import qualified Day15 import qualified Day16 import qualified Day17 +import qualified Day18 showSol :: [Char] -> Doc -> IO () showSol txt d = putText . toS . render $ @@ -55,6 +56,7 @@ solutions = Map.fromList [(["01"], day01) ,(["15"], day15) ,(["16"], day16) ,(["17"], day17) + ,(["18"], day18) ] @@ -204,3 +206,15 @@ day17 = do showSol "Solution 1" (int (fromMaybe 0 sol1)) let sol2 = Day17.solution2 50000000 Day17.input showSol "Solution 2" (int sol2) + +day18 :: IO () +day18 = do + putText "Day 18:" + minput <- Day18.parseInput + case minput of + Nothing -> putText "parsing error!" + Just input -> do + let sol1 = Day18.solution1 input + showSol "Solution 1" (int (fromMaybe 0 sol1)) + let sol2 = Day18.solution2 input + showSol "Solution 2" (int sol2) diff --git a/package.yaml b/package.yaml index 143b861..7f9e37e 100644 --- a/package.yaml +++ b/package.yaml @@ -30,6 +30,7 @@ library: - Day15 - Day16 - Day17 + - Day18 dependencies: - base >=4.7 && <5 - protolude diff --git a/src/Day18.hs b/src/Day18.hs index 2ac0006..fd94797 100644 --- a/src/Day18.hs +++ b/src/Day18.hs @@ -148,12 +148,12 @@ data Instruction = | Jgz Value Value deriving (Show) -parseInput :: IO Program +parseInput :: IO (Maybe Program) parseInput = parseTxt <$> readFile "inputs/day18.txt" -parseTxt :: Text -> Program +parseTxt :: Text -> Maybe Program parseTxt txt = let instr = txt & T.lines & map (parseInstr . T.words) in - listArray (0,length instr-1) instr + fmap (listArray (0,length instr-1)) (sequenceA instr) txtToInt :: Text -> Maybe Int txtToInt = fmap fst . head . reads . toS @@ -162,15 +162,15 @@ parseValue :: Text -> Value parseValue t = let c = T.head t in if C.isLetter c then R (Reg t) else I (fromMaybe 0 (txtToInt t)) -parseInstr :: [Text] -> Instruction -parseInstr ["snd",v] = Snd (parseValue v) -parseInstr ["set",r,v] = Set (Reg r) (parseValue v) -parseInstr ["add",r,v] = Add (Reg r) (parseValue v) -parseInstr ["mul",r,v] = Mul (Reg r) (parseValue v) -parseInstr ["mod",r,v] = Mod (Reg r) (parseValue v) -parseInstr ["rcv",r] = Rcv (Reg r) -parseInstr ["jgz",v1,v2] = Jgz (parseValue v1) (parseValue v2) -parseInstr _ = error "Don't knwow this instruction" +parseInstr :: [Text] -> Maybe Instruction +parseInstr ["snd",v] = Just $ Snd (parseValue v) +parseInstr ["set",r,v] = Just $ Set (Reg r) (parseValue v) +parseInstr ["add",r,v] = Just $ Add (Reg r) (parseValue v) +parseInstr ["mul",r,v] = Just $ Mul (Reg r) (parseValue v) +parseInstr ["mod",r,v] = Just $ Mod (Reg r) (parseValue v) +parseInstr ["rcv",r] = Just $ Rcv (Reg r) +parseInstr ["jgz",v1,v2] = Just $ Jgz (parseValue v1) (parseValue v2) +parseInstr _ = Nothing testInput :: Text testInput = "set a 1\n\