diff options
author | Brian Chu <brianmchu42@gmail.com> | 2022-01-06 12:25:42 -0800 |
---|---|---|
committer | Brian Chu <brianmchu42@gmail.com> | 2022-01-06 12:25:42 -0800 |
commit | b95d404ee6df9ae95a4ff214b376b3509568277e (patch) | |
tree | e11cdab94353f5b8ada92422010468f0bab99f49 /day12.fsx | |
parent | 070609ffef51983b8d5307a67bcb3b26a1c260f2 (diff) | |
download | AdventOfCode2016-b95d404ee6df9ae95a4ff214b376b3509568277e.tar.gz |
solution for day 12
Diffstat (limited to 'day12.fsx')
-rw-r--r-- | day12.fsx | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/day12.fsx b/day12.fsx new file mode 100644 index 0000000..17bcc6b --- /dev/null +++ b/day12.fsx @@ -0,0 +1,66 @@ +open System.IO + +type Reg = string +type Lit = int +type Value = + | LiteralVal of literal: Lit + | Register of register: Reg + +type Instruction = + | Cpy of copied: Value * register: Reg + | Inc of register: Reg + | Dec of register: Reg + | Jnz of compared: Value * offset: Lit + +let parseInstruction (line:string): Instruction = + let split = line.Split " " + match split[0] with + | "inc" -> Inc split[1] + | "dec" -> Dec split[1] + | "cpy" -> + let mutable parsed = 0 + if (System.Int32.TryParse(split[1], &parsed)) + then Cpy (LiteralVal parsed, split[2]) + else Cpy (Register split[1], split[2]) + | "jnz" -> + let mutable parsed = 0 + if (System.Int32.TryParse(split[1], &parsed)) + then Jnz (LiteralVal parsed, (int split[2])) + else Jnz (Register split[1], (int split[2])) + | _ -> Inc "" + +let rec execute index insts registers = + if index < 0 || index > (Array.length insts) - 1 + then + Map.find "a" registers + else + match insts[index] with + | Cpy (value, reg) -> + let copied = + match value with + | LiteralVal num -> num + | Register reg -> Map.find reg registers + let newRegisters = Map.change reg (function | Some x -> Some copied | None -> None) registers + execute (index + 1) insts newRegisters + | Inc reg -> + let newRegisters = Map.change reg (function | Some x -> Some (x + 1) | None -> None) registers + execute (index + 1) insts newRegisters + | Dec reg -> + let newRegisters = Map.change reg (function | Some x -> Some (x - 1) | None -> None) registers + execute (index + 1) insts newRegisters + | Jnz (reg, offset) -> + let compared = + match reg with + | LiteralVal num -> num + | Register reg -> Map.find reg registers + if compared <> 0 + then + execute (index + offset) insts registers + else + execute (index + 1) insts registers + +let lines = File.ReadAllLines "day12.txt" |> Array.map parseInstruction +let regsPart1: Map<string, Lit> = Map.ofList [("a", 0); ("b", 0); ("c", 0); ("d", 0)] +execute 0 lines regsPart1 |> printfn "%d" +let regsPart2: Map<string, Lit> = Map.ofList [("a", 0); ("b", 0); ("c", 1); ("d", 0)] +execute 0 lines regsPart2 |> printfn "%d" \ No newline at end of file |