added to main + total fns
This commit is contained in:
parent
0d8930c6c5
commit
e4e6730348
4 changed files with 29 additions and 14 deletions
|
@ -2,7 +2,7 @@
|
||||||
--
|
--
|
||||||
-- see: https://github.com/sol/hpack
|
-- see: https://github.com/sol/hpack
|
||||||
--
|
--
|
||||||
-- hash: d871caa5723224d888f552d659e29f2e860d791e12ad0c0d7ced450d2334b83d
|
-- hash: 877996d6cd90e6a9a1d5d7f01e79fd91225f46e4cf930943da73fad95dda8ea0
|
||||||
|
|
||||||
name: adventofcode
|
name: adventofcode
|
||||||
version: 0.1.0.0
|
version: 0.1.0.0
|
||||||
|
@ -47,8 +47,8 @@ library
|
||||||
Day15
|
Day15
|
||||||
Day16
|
Day16
|
||||||
Day17
|
Day17
|
||||||
other-modules:
|
|
||||||
Day18
|
Day18
|
||||||
|
other-modules:
|
||||||
Permutations
|
Permutations
|
||||||
Paths_adventofcode
|
Paths_adventofcode
|
||||||
build-depends:
|
build-depends:
|
||||||
|
|
14
app/Main.hs
14
app/Main.hs
|
@ -25,6 +25,7 @@ import qualified Day14
|
||||||
import qualified Day15
|
import qualified Day15
|
||||||
import qualified Day16
|
import qualified Day16
|
||||||
import qualified Day17
|
import qualified Day17
|
||||||
|
import qualified Day18
|
||||||
|
|
||||||
showSol :: [Char] -> Doc -> IO ()
|
showSol :: [Char] -> Doc -> IO ()
|
||||||
showSol txt d = putText . toS . render $
|
showSol txt d = putText . toS . render $
|
||||||
|
@ -55,6 +56,7 @@ solutions = Map.fromList [(["01"], day01)
|
||||||
,(["15"], day15)
|
,(["15"], day15)
|
||||||
,(["16"], day16)
|
,(["16"], day16)
|
||||||
,(["17"], day17)
|
,(["17"], day17)
|
||||||
|
,(["18"], day18)
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
@ -204,3 +206,15 @@ day17 = do
|
||||||
showSol "Solution 1" (int (fromMaybe 0 sol1))
|
showSol "Solution 1" (int (fromMaybe 0 sol1))
|
||||||
let sol2 = Day17.solution2 50000000 Day17.input
|
let sol2 = Day17.solution2 50000000 Day17.input
|
||||||
showSol "Solution 2" (int sol2)
|
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)
|
||||||
|
|
|
@ -30,6 +30,7 @@ library:
|
||||||
- Day15
|
- Day15
|
||||||
- Day16
|
- Day16
|
||||||
- Day17
|
- Day17
|
||||||
|
- Day18
|
||||||
dependencies:
|
dependencies:
|
||||||
- base >=4.7 && <5
|
- base >=4.7 && <5
|
||||||
- protolude
|
- protolude
|
||||||
|
|
24
src/Day18.hs
24
src/Day18.hs
|
@ -148,12 +148,12 @@ data Instruction =
|
||||||
| Jgz Value Value
|
| Jgz Value Value
|
||||||
deriving (Show)
|
deriving (Show)
|
||||||
|
|
||||||
parseInput :: IO Program
|
parseInput :: IO (Maybe Program)
|
||||||
parseInput = parseTxt <$> readFile "inputs/day18.txt"
|
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
|
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 :: Text -> Maybe Int
|
||||||
txtToInt = fmap fst . head . reads . toS
|
txtToInt = fmap fst . head . reads . toS
|
||||||
|
@ -162,15 +162,15 @@ parseValue :: Text -> Value
|
||||||
parseValue t = let c = T.head t in
|
parseValue t = let c = T.head t in
|
||||||
if C.isLetter c then R (Reg t) else I (fromMaybe 0 (txtToInt t))
|
if C.isLetter c then R (Reg t) else I (fromMaybe 0 (txtToInt t))
|
||||||
|
|
||||||
parseInstr :: [Text] -> Instruction
|
parseInstr :: [Text] -> Maybe Instruction
|
||||||
parseInstr ["snd",v] = Snd (parseValue v)
|
parseInstr ["snd",v] = Just $ Snd (parseValue v)
|
||||||
parseInstr ["set",r,v] = Set (Reg r) (parseValue v)
|
parseInstr ["set",r,v] = Just $ Set (Reg r) (parseValue v)
|
||||||
parseInstr ["add",r,v] = Add (Reg r) (parseValue v)
|
parseInstr ["add",r,v] = Just $ Add (Reg r) (parseValue v)
|
||||||
parseInstr ["mul",r,v] = Mul (Reg r) (parseValue v)
|
parseInstr ["mul",r,v] = Just $ Mul (Reg r) (parseValue v)
|
||||||
parseInstr ["mod",r,v] = Mod (Reg r) (parseValue v)
|
parseInstr ["mod",r,v] = Just $ Mod (Reg r) (parseValue v)
|
||||||
parseInstr ["rcv",r] = Rcv (Reg r)
|
parseInstr ["rcv",r] = Just $ Rcv (Reg r)
|
||||||
parseInstr ["jgz",v1,v2] = Jgz (parseValue v1) (parseValue v2)
|
parseInstr ["jgz",v1,v2] = Just $ Jgz (parseValue v1) (parseValue v2)
|
||||||
parseInstr _ = error "Don't knwow this instruction"
|
parseInstr _ = Nothing
|
||||||
|
|
||||||
testInput :: Text
|
testInput :: Text
|
||||||
testInput = "set a 1\n\
|
testInput = "set a 1\n\
|
||||||
|
|
Loading…
Reference in a new issue