Combine AoC Repos
This commit is contained in:
103
2015/day23/main.go
Normal file
103
2015/day23/main.go
Normal file
@@ -0,0 +1,103 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user