Day 8: registers
This commit is contained in:
parent
7530c41af3
commit
680a7edce4
4
08dec/input_test
Normal file
4
08dec/input_test
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
b inc 5 if a > 1
|
||||||
|
a inc 1 if b < 5
|
||||||
|
c dec -10 if a >= 1
|
||||||
|
c inc -20 if c == 10
|
100
08dec/main.go
Normal file
100
08dec/main.go
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
var (
|
||||||
|
registers map[string]int
|
||||||
|
)
|
||||||
|
|
||||||
|
type Instr struct {
|
||||||
|
TargetReg string
|
||||||
|
Op string
|
||||||
|
Var int
|
||||||
|
CondReg string
|
||||||
|
Cond string
|
||||||
|
CondVal int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i Instr) String() string {
|
||||||
|
return i.TargetReg + " " + i.Op + " " + strconv.Itoa(i.Var) + " if " + i.CondReg + " " + i.Cond + " " + strconv.Itoa(i.CondVal)
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
registers = make(map[string]int)
|
||||||
|
sc := bufio.NewScanner(os.Stdin)
|
||||||
|
for sc.Scan() {
|
||||||
|
instr := parseLine(sc.Text())
|
||||||
|
if cond(instr) {
|
||||||
|
run(instr)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var maxreg string
|
||||||
|
var maxval int
|
||||||
|
for reg, val := range registers {
|
||||||
|
if val >= maxval {
|
||||||
|
maxval = val
|
||||||
|
maxreg = reg
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fmt.Println(registers)
|
||||||
|
fmt.Println(maxreg)
|
||||||
|
fmt.Println(maxval)
|
||||||
|
}
|
||||||
|
|
||||||
|
func cond(instr Instr) bool {
|
||||||
|
switch instr.Cond {
|
||||||
|
case "<":
|
||||||
|
return registers[instr.CondReg] < instr.CondVal
|
||||||
|
case ">":
|
||||||
|
return registers[instr.CondReg] > instr.CondVal
|
||||||
|
case ">=":
|
||||||
|
return registers[instr.CondReg] >= instr.CondVal
|
||||||
|
case "<=":
|
||||||
|
return registers[instr.CondReg] <= instr.CondVal
|
||||||
|
case "==":
|
||||||
|
return registers[instr.CondReg] == instr.CondVal
|
||||||
|
case "!=":
|
||||||
|
return registers[instr.CondReg] != instr.CondVal
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func run(instr Instr) {
|
||||||
|
switch instr.Op {
|
||||||
|
case "inc":
|
||||||
|
registers[instr.TargetReg] = registers[instr.TargetReg] + instr.Var
|
||||||
|
case "dec":
|
||||||
|
registers[instr.TargetReg] = registers[instr.TargetReg] - instr.Var
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func parseLine(in string) Instr {
|
||||||
|
//fmt.Println(in)
|
||||||
|
toks := strings.Split(in, " ")
|
||||||
|
if len(toks) != 7 {
|
||||||
|
log.Fatalln("Invalid instruction", in)
|
||||||
|
}
|
||||||
|
v, _ := strconv.Atoi(toks[2])
|
||||||
|
c, _ := strconv.Atoi(toks[6])
|
||||||
|
i := Instr{
|
||||||
|
toks[0],
|
||||||
|
toks[1],
|
||||||
|
v,
|
||||||
|
toks[4],
|
||||||
|
toks[5],
|
||||||
|
c,
|
||||||
|
}
|
||||||
|
//fmt.Println(i)
|
||||||
|
if in != i.String() {
|
||||||
|
log.Fatalln("Parse error")
|
||||||
|
}
|
||||||
|
return i
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user