main.go (1247B)
1 package main 2 3 import ( 4 "bufio" 5 "fmt" 6 "os" 7 "strconv" 8 "strings" 9 ) 10 11 const ( 12 NOP = iota 13 ACC 14 JMP 15 ) 16 17 func readInput(filename string) (ops []int, args []int) { 18 file, _ := os.Open(filename) 19 defer file.Close() 20 op_table := map[string]int{ 21 "nop": NOP, 22 "acc": ACC, 23 "jmp": JMP, 24 } 25 scanner := bufio.NewScanner(file) 26 for scanner.Scan() { 27 inst := strings.Split(scanner.Text(), " ") 28 ops = append(ops, op_table[inst[0]]) 29 arg, _ := strconv.Atoi(inst[1]) 30 args = append(args, arg) 31 } 32 return 33 } 34 35 func main() { 36 ops, args := readInput("./input.txt") 37 // 1179 38 fmt.Println(part1(ops, args)) 39 // 1089 40 fmt.Println(part2(ops, args)) 41 } 42 43 func part1(ops []int, args []int) (acc int, fin bool) { 44 exec := make([]bool, len(ops)) 45 ip := 0 46 for ip < len(exec) && !exec[ip] { 47 exec[ip] = true 48 switch ops[ip] { 49 case NOP: 50 ip += 1 51 case JMP: 52 ip += args[ip] 53 case ACC: 54 acc += args[ip] 55 ip += 1 56 } 57 } 58 fin = ip >= len(exec) 59 return 60 } 61 62 func part2(ops []int, args []int) (acc int, fin bool) { 63 for i := 0; i < len(ops); i++ { 64 old_op := ops[i] 65 switch ops[i] { 66 case ACC: 67 continue 68 case JMP: 69 ops[i] = NOP 70 case NOP: 71 ops[i] = JMP 72 } 73 acc, fin = part1(ops, args) 74 ops[i] = old_op 75 if fin { 76 return 77 } 78 } 79 return 0, false 80 }