added to main + total fns

This commit is contained in:
Yann Esposito (Yogsototh) 2017-12-22 08:58:03 +01:00
parent 0d8930c6c5
commit e4e6730348
Signed by untrusted user who does not match committer: yogsototh
GPG key ID: 7B19A4C650D59646
4 changed files with 29 additions and 14 deletions

View file

@ -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:

View file

@ -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)

View file

@ -30,6 +30,7 @@ library:
- Day15
- Day16
- Day17
- Day18
dependencies:
- base >=4.7 && <5
- protolude

View file

@ -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\