79 lines
1.4 KiB
Go
79 lines
1.4 KiB
Go
|
package main
|
||
|
|
||
|
import (
|
||
|
"bufio"
|
||
|
"fmt"
|
||
|
"log"
|
||
|
"os"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
var regs = map[string]int{
|
||
|
"a": 0,
|
||
|
"b": 0,
|
||
|
"c": 1,
|
||
|
"d": 0,
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
input := stdinToStringSlice()
|
||
|
curr := 0
|
||
|
for curr < len(input) {
|
||
|
ins := strings.Fields(input[curr])
|
||
|
curr++
|
||
|
switch ins[0] {
|
||
|
case "cpy":
|
||
|
src := ins[1]
|
||
|
dst := ins[2]
|
||
|
// check if the src is a register
|
||
|
if v, ok := regs[src]; ok {
|
||
|
regs[dst] = v
|
||
|
} else {
|
||
|
// It's not, must be an int
|
||
|
regs[dst] = atoi(src)
|
||
|
}
|
||
|
case "inc":
|
||
|
regs[ins[1]] = regs[ins[1]] + 1
|
||
|
case "dec":
|
||
|
regs[ins[1]] = regs[ins[1]] - 1
|
||
|
case "jnz":
|
||
|
v, ok := regs[ins[1]]
|
||
|
if !ok {
|
||
|
v = atoi(ins[1])
|
||
|
}
|
||
|
if v != 0 {
|
||
|
// Subtract 1 from the jump because we incremented already
|
||
|
curr += atoi(ins[2]) - 1
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
PrintState()
|
||
|
}
|
||
|
|
||
|
// Fancy State Printing
|
||
|
func PrintState() {
|
||
|
datLine := fmt.Sprint("\u2502 a:", regs["a"], " b:", regs["b"], " c:", regs["c"], " d:", regs["d"], " \u2502")
|
||
|
fmt.Println("\u250C" + strings.Repeat("\u2500", len(datLine)-6) + "\u2510")
|
||
|
fmt.Println(datLine)
|
||
|
fmt.Println("\u2514" + strings.Repeat("\u2500", len(datLine)-6) + "\u2518")
|
||
|
}
|
||
|
|
||
|
func stdinToStringSlice() []string {
|
||
|
var input []string
|
||
|
scanner := bufio.NewScanner(os.Stdin)
|
||
|
for scanner.Scan() {
|
||
|
input = append(input, scanner.Text())
|
||
|
}
|
||
|
return input
|
||
|
}
|
||
|
|
||
|
func atoi(i string) int {
|
||
|
var ret int
|
||
|
var err error
|
||
|
if ret, err = strconv.Atoi(i); err != nil {
|
||
|
log.Fatal("Invalid Atoi:" + i)
|
||
|
}
|
||
|
return ret
|
||
|
}
|