adventofcode/2015/day23/main.go

104 lines
2.0 KiB
Go

package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
)
var registers map[string]int
func main() {
registers = make(map[string]int)
if len(os.Args) > 1 {
if os.Args[1] == "-help" {
fmt.Println("Usage: day23 [register presets]")
fmt.Println(" Register presets are given in the form:")
fmt.Println(" name=value")
fmt.Println(" If more than one, separate with spaces.")
fmt.Println(" If none are given, all registers start at 0")
os.Exit(1)
}
for i := range os.Args {
if strings.Contains(os.Args[i], "=") {
presets := strings.Split(os.Args[i], "=")
registers[presets[0]] = mustAtoi(presets[1])
}
}
}
var input []string
scanner := bufio.NewScanner(os.Stdin)
for scanner.Scan() {
input = append(input, strings.ToLower(scanner.Text()))
}
// We manually manage i
var i, cnt int
for i < len(input) {
printRegisters()
fmt.Print(" ")
cnt++
fmt.Print(input[i])
parts := strings.Split(input[i], " ")
switch parts[0] {
case "hlf":
registers[parts[1]] = registers[parts[1]] / 2
i++
case "tpl":
registers[parts[1]] = registers[parts[1]] * 3
i++
case "inc":
registers[parts[1]]++
i++
case "jmp":
i += mustAtoi(parts[1])
case "jie":
parts[1] = string(parts[1][len(parts[1])-2])
if registers[parts[1]]%2 == 0 {
i += mustAtoi(parts[2])
} else {
i++
}
case "jio":
parts[1] = string(parts[1][len(parts[1])-2])
if registers[parts[1]] == 1 {
i += mustAtoi(parts[2])
} else {
i++
}
}
fmt.Print(" ")
printRegistersLn()
}
printRegistersLn()
}
func printRegistersLn() {
printRegisters()
fmt.Println()
}
func printRegisters() {
fmt.Print("[")
for k := range registers {
printRegister(k)
fmt.Print(" ")
}
fmt.Print("]")
}
func printRegister(n string) {
fmt.Print(n + ": " + strconv.Itoa(registers[n]))
}
func mustAtoi(s string) int {
var i int
var err error
if i, err = strconv.Atoi(s); err != nil {
fmt.Println("Tried to atoi " + s)
os.Exit(1)
}
return i
}