From 2dd05efae2849b76c6e0d6505706a5f08045008f Mon Sep 17 00:00:00 2001 From: alexchao26 Date: Sun, 27 Dec 2020 20:30:40 -0500 Subject: [PATCH] 2015-day23: an actually easy assembly computer --- 2015/day23/main.go | 75 +++++++++++++++++++++++++++-------------- 2015/day23/main_test.go | 29 +++++----------- 2 files changed, 58 insertions(+), 46 deletions(-) diff --git a/2015/day23/main.go b/2015/day23/main.go index 4901f3c..7d4c01f 100644 --- a/2015/day23/main.go +++ b/2015/day23/main.go @@ -15,32 +15,57 @@ func main() { flag.Parse() fmt.Println("Running part", part) - if part == 1 { - ans := part1(util.ReadFile("./input.txt")) - util.CopyToClipboard(fmt.Sprintf("%v", ans)) - fmt.Println("Output:", ans) - } else { - ans := part2(util.ReadFile("./input.txt")) - util.CopyToClipboard(fmt.Sprintf("%v", ans)) - fmt.Println("Output:", ans) + ans := simpleAssemblyComputer(util.ReadFile("./input.txt"), part) + fmt.Println("Output:", ans) +} + +func simpleAssemblyComputer(input string, part int) int { + instructions := strings.Split(input, "\n") + var index int + + registers := map[string]int{} + if part == 2 { + registers["a"] = 1 } -} -func part1(input string) int { - parsed := parseInput(input) - _ = parsed - - return 0 -} - -func part2(input string) int { - return 0 -} - -func parseInput(input string) (ans []int) { - lines := strings.Split(input, "\n") - for _, l := range lines { - ans = append(ans, cast.ToInt(l)) + for index < len(instructions) { + parts := strings.Split(instructions[index], " ") + switch parts[0] { + case "hlf": + reg := parts[1] + registers[reg] /= 2 + index++ + case "tpl": + reg := parts[1] + registers[reg] *= 3 + index++ + case "inc": + reg := parts[1] + registers[reg]++ + index++ + case "jmp": + diff := cast.ToInt(parts[1]) + index += diff + case "jie": + reg := strings.Trim(parts[1], ",") + diff := cast.ToInt(parts[2]) + if registers[reg]%2 == 0 { + index += diff + } else { + index++ + } + case "jio": + reg := strings.Trim(parts[1], ",") + diff := cast.ToInt(parts[2]) + if registers[reg] == 1 { + index += diff + } else { + index++ + } + default: + panic("unhandled instruction type: " + parts[0]) + } } - return ans + + return registers["b"] } diff --git a/2015/day23/main_test.go b/2015/day23/main_test.go index 22a4487..3fa3d98 100644 --- a/2015/day23/main_test.go +++ b/2015/day23/main_test.go @@ -2,37 +2,24 @@ package main import ( "testing" + + "github.com/alexchao26/advent-of-code-go/util" ) -func Test_part1(t *testing.T) { +func Test_simpleAssemblyComputer(t *testing.T) { tests := []struct { name string input string + part int want int }{ - // {"actual", util.ReadFile("input.txt"), ACTUAL_ANSWER}, + {"actual", util.ReadFile("input.txt"), 1, 307}, + {"actual", util.ReadFile("input.txt"), 2, 160}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - if got := part1(tt.input); got != tt.want { - t.Errorf("part1() = %v, want %v", got, tt.want) - } - }) - } -} - -func Test_part2(t *testing.T) { - tests := []struct { - name string - input string - want int - }{ - // {"actual", util.ReadFile("input.txt"), ACTUAL_ANSWER}, - } - for _, tt := range tests { - t.Run(tt.name, func(t *testing.T) { - if got := part2(tt.input); got != tt.want { - t.Errorf("part2() = %v, want %v", got, tt.want) + if got := simpleAssemblyComputer(tt.input, tt.part); got != tt.want { + t.Errorf("simpleAssemblyComputer() = %v, want %v", got, tt.want) } }) }