diff --git a/day23/day.go b/day23/day.go new file mode 100644 index 0000000..52d9d85 --- /dev/null +++ b/day23/day.go @@ -0,0 +1,98 @@ +package day23 + +import ( + "strconv" + "strings" + "tools" +) + +func run(code []string, register map[string]int) map[string]int { + index := 0 + for index < len(code) { + //fmt.Println("Executing line", index, ":", code[index]) + instr := strings.Split(code[index], " ") + switch instr[0] { + case "cpy": + value, err := strconv.Atoi(instr[1]) + if err != nil { + register[instr[2]] = register[instr[1]] + } else { + register[instr[2]] = value + } + index++ + case "inc": + register[instr[1]]++ + index++ + case "dec": + register[instr[1]]-- + index++ + case "jnz": + value, err := strconv.Atoi(instr[1]) + if err != nil { + value = register[instr[1]] + } + if value == 0 { + index++ + } else { + jump, err := strconv.Atoi(instr[2]) + if err != nil { + index += register[instr[2]] + } else { + index += jump + } + } + case "tgl": + toChange := index + register[instr[1]] + if toChange < len(code) && toChange >= 0 { + switch len(strings.Split(code[toChange], " ")) { + case 2: + if code[toChange][:3] == "inc" { + code[toChange] = "dec" + code[toChange][3:] + } else { + code[toChange] = "inc" + code[toChange][3:] + } + case 3: + if code[toChange][:3] == "jnz" { + code[toChange] = "cpy" + code[toChange][3:] + } else { + code[toChange] = "jnz" + code[toChange][3:] + } + } + } + index++ + } + /* + fmt.Println("New registers", register) + fmt.Println("New code", code) + bufio.NewReader(os.Stdin).ReadBytes('\n') + */ + } + + return register +} + +func Part1(puzzle tools.AoCPuzzle) interface{} { + register := map[string]int{ + "a": 7, + "b": 0, + "c": 0, + "d": 0, + } + + register = run(puzzle.GetInputArray(), register) + + return register["a"] +} + +func Part2(puzzle tools.AoCPuzzle) interface{} { + register := map[string]int{ + "a": 12, + "b": 0, + "c": 1, + "d": 0, + } + + register = run(puzzle.GetInputArray(), register) + + return register["a"] +} diff --git a/inputs/23 b/inputs/23 new file mode 100644 index 0000000..dff3e42 --- /dev/null +++ b/inputs/23 @@ -0,0 +1,26 @@ +cpy a b +dec b +cpy a d +cpy 0 a +cpy b c +inc a +dec c +jnz c -2 +dec d +jnz d -5 +dec b +cpy b c +cpy c d +dec d +inc c +jnz d -2 +tgl c +cpy -16 c +jnz 1 c +cpy 84 c +jnz 71 d +inc a +inc d +jnz d -2 +inc c +jnz c -5 \ No newline at end of file diff --git a/inputs/23_test b/inputs/23_test new file mode 100644 index 0000000..95ee4aa --- /dev/null +++ b/inputs/23_test @@ -0,0 +1,7 @@ +cpy 2 a +tgl a +tgl a +tgl a +cpy 1 a +dec a +dec a \ No newline at end of file diff --git a/main.go b/main.go index 46f9410..a795cbc 100644 --- a/main.go +++ b/main.go @@ -20,6 +20,7 @@ import ( "aoc2016/day18" "aoc2016/day19" "aoc2016/day20" + "aoc2016/day23" "flag" "fmt" "os" @@ -59,7 +60,7 @@ func initDayFunctions() { 20: {1: day20.Part1, 2: day20.Part2}, // 21: {1: day21.Part1, 2: day21.Part2}, // 22: {1: day22.Part1, 2: day22.Part2}, - // 23: {1: day23.Part1, 2: day23.Part2}, + 23: {1: day23.Part1, 2: day23.Part2}, // 24: {1: day24.Part1, 2: day24.Part2}, // 25: {1: day25.Part1, 2: day25.Part2}, }