You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

60 lines
1.1 KiB

package main
import (
"fmt"
"strings"
h "git.bullercodeworks.com/brian/adventofcode/helpers"
)
func main() {
fmt.Println("# Day 8")
inp := h.StdinToStringSlice()
FixProg(inp)
}
func RunProg(inp []string) {
var acc int
var ptr int
hist := make(map[int]int)
for ptr < len(inp) {
if _, ok := hist[ptr]; ok {
fmt.Printf("Instruction %d repeated. Acc: %d\n", ptr, acc)
return
}
hist[ptr] = acc
pts := strings.Split(inp[ptr], " ")
switch pts[0] {
case "acc":
acc = acc + h.Atoi(pts[1])
ptr++
case "jmp":
ptr = ptr + h.Atoi(pts[1])
case "nop":
ptr++
}
}
}
func FixProg(inp []string) {
p := NewProgram(inp)
chchch := p.CountOpCodes(NOP, JMP)
for ch := 1; ch <= chchch; ch++ {
np := p.Copy()
chOp := np.FindNthOp(ch, NOP, JMP)
if chOp >= 0 {
if np.Instructions[chOp].OpCode == NOP {
np.Instructions[chOp].OpCode = JMP
} else if np.Instructions[chOp].OpCode == JMP {
np.Instructions[chOp].OpCode = NOP
}
res := np.Run()
if res == 0 {
fmt.Println("Accumulator:", np.Accumulator)
return
}
}
fmt.Println("Changing", ch, "didn't fix it")
}
fmt.Println("Failed to fix program")
}