2017 Day 08 Complete!
This commit is contained in:
106
2017/day08/day08.go
Normal file
106
2017/day08/day08.go
Normal file
@@ -0,0 +1,106 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user