Files
advent-of-code-go/2015/day23/main.go
T
2020-12-27 20:30:40 -05:00

72 lines
1.3 KiB
Go

package main
import (
"flag"
"fmt"
"strings"
"github.com/alexchao26/advent-of-code-go/cast"
"github.com/alexchao26/advent-of-code-go/util"
)
func main() {
var part int
flag.IntVar(&part, "part", 1, "part 1 or 2")
flag.Parse()
fmt.Println("Running part", part)
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
}
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 registers["b"]
}