From 88c7c35c5046f95f48afd786b89c7d42463e67b7 Mon Sep 17 00:00:00 2001 From: Yuchen Pei Date: Mon, 18 Dec 2017 15:45:09 +0100 Subject: finished day 18 part 1. --- Puzzle18.hs | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 Puzzle18.hs diff --git a/Puzzle18.hs b/Puzzle18.hs new file mode 100644 index 0000000..4e92862 --- /dev/null +++ b/Puzzle18.hs @@ -0,0 +1,30 @@ +import Data.List.Split (splitOn) +import Data.Map (Map) +import qualified Data.Map as Map + +exec :: [[Char]] -> Int -> Map Char Int -> Int +exec rom addr regs + | op == "snd" = exec rom (addr + 1) (Map.insert '_' dval regs) + | op == "set" = exec rom (addr + 1) (Map.insert dest val regs) + | op == "add" = exec rom (addr + 1) (Map.insert dest (dval + val) regs) + | op == "mul" = exec rom (addr + 1) (Map.insert dest (dval * val) regs) + | op == "mod" = exec rom (addr + 1) (Map.insert dest (dval `mod` val) regs) + | op == "jgz" = exec rom (if dval > 0 then addr + val else addr + 1) regs + | op == "rcv" = if dval /= 0 then regs Map.! '_' else exec rom (addr + 1) regs + where ins = rom !! addr + op:[dest]:xs = splitOn " " ins + dval = regs Map.! dest + x = head xs + val = if head x `elem` alphabet then regs Map.! (head x) else read x + +alphabet = ['a'..'z'] + +initRegs :: Map Char Int +initRegs = Map.fromList $ zipWith (,) ['a'..'z'] (cycle [0]) + +solve1 :: [Char] -> Int +solve1 xs = exec (splitOn "\n" xs) 0 initRegs + +input0 = "set a 1\nadd a 2\nmul a a\nmod a 5\nsnd a\nset a 0\nrcv a\njgz a -1\nset a 1\njgz a -2" + +input = "set i 31\nset a 1\nmul p 17\njgz p p\nmul a 2\nadd i -1\njgz i -2\nadd a -1\nset i 127\nset p 464\nmul p 8505\nmod p a\nmul p 129749\nadd p 12345\nmod p a\nset b p\nmod b 10000\nsnd b\nadd i -1\njgz i -9\njgz a 3\nrcv b\njgz b -1\nset f 0\nset i 126\nrcv a\nrcv b\nset p a\nmul p -1\nadd p b\njgz p 4\nsnd a\nset a b\njgz 1 3\nsnd b\nset f 1\nadd i -1\njgz i -11\nsnd a\njgz f -16\njgz a -19" -- cgit v1.2.3