package main import ( "bufio" "fmt" "log" "os" "strconv" "strings" ) const ( // Conditions EQL = "==" NEQ = "!=" GTN = ">" LTN = "<" GEQ = ">=" LEQ = "<=" // Operations DEC = "dec" INC = "inc" ) var registers map[string]int func main() { registers = make(map[string]int) inp := StdinToStrings() allocMem := 0 for i := range inp { pts := strings.Split(inp[i], " ") var condMet bool switch pts[5] { case EQL: condMet = getReg(pts[4]) == Atoi(pts[6]) case NEQ: condMet = getReg(pts[4]) != Atoi(pts[6]) case GTN: condMet = getReg(pts[4]) > Atoi(pts[6]) case LTN: condMet = getReg(pts[4]) < Atoi(pts[6]) case GEQ: condMet = getReg(pts[4]) >= Atoi(pts[6]) case LEQ: condMet = getReg(pts[4]) <= Atoi(pts[6]) } if condMet { doOp(pts[0], pts[1], Atoi(pts[2])) } if getReg(pts[4]) > allocMem { allocMem = getReg(pts[4]) } } var hReg string var hVal int for k, v := range registers { if v > hVal { hReg = k hVal = v } } fmt.Println(hReg, ":", hVal) fmt.Println("Needed Memory:", allocMem) } func doOp(reg, op string, val int) { st := getReg(reg) switch op { case DEC: st -= val case INC: st += val } setReg(reg, st) } func getReg(nm string) int { if _, ok := registers[nm]; !ok { registers[nm] = 0 } return registers[nm] } func setReg(nm string, val int) { registers[nm] = val } func StdinToStrings() []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") } return ret }