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
}
