Day 8.
parent
2212a59b86
commit
f7bf844b03
|
@ -0,0 +1,621 @@
|
||||||
|
acc -9
|
||||||
|
jmp +1
|
||||||
|
acc +3
|
||||||
|
acc +32
|
||||||
|
jmp +118
|
||||||
|
acc +8
|
||||||
|
nop +405
|
||||||
|
jmp +179
|
||||||
|
acc +43
|
||||||
|
acc +24
|
||||||
|
acc +11
|
||||||
|
jmp +545
|
||||||
|
acc +26
|
||||||
|
acc -6
|
||||||
|
acc +24
|
||||||
|
jmp +560
|
||||||
|
acc +39
|
||||||
|
acc +42
|
||||||
|
jmp +1
|
||||||
|
jmp +457
|
||||||
|
acc +36
|
||||||
|
acc +7
|
||||||
|
jmp +190
|
||||||
|
acc -12
|
||||||
|
acc -10
|
||||||
|
acc +30
|
||||||
|
jmp +110
|
||||||
|
acc +20
|
||||||
|
acc +22
|
||||||
|
acc +20
|
||||||
|
jmp +513
|
||||||
|
acc +7
|
||||||
|
jmp +110
|
||||||
|
acc +35
|
||||||
|
acc +4
|
||||||
|
jmp +51
|
||||||
|
acc +42
|
||||||
|
acc +23
|
||||||
|
jmp +158
|
||||||
|
acc +7
|
||||||
|
jmp +156
|
||||||
|
acc -15
|
||||||
|
acc -7
|
||||||
|
acc +27
|
||||||
|
jmp +30
|
||||||
|
jmp +141
|
||||||
|
acc +33
|
||||||
|
jmp +12
|
||||||
|
acc +5
|
||||||
|
acc +4
|
||||||
|
nop +49
|
||||||
|
jmp +296
|
||||||
|
acc +46
|
||||||
|
nop +358
|
||||||
|
acc -3
|
||||||
|
jmp +276
|
||||||
|
acc -1
|
||||||
|
acc +22
|
||||||
|
jmp +220
|
||||||
|
nop +178
|
||||||
|
acc +34
|
||||||
|
jmp +363
|
||||||
|
jmp +4
|
||||||
|
acc +2
|
||||||
|
jmp +173
|
||||||
|
jmp +484
|
||||||
|
acc +26
|
||||||
|
acc +2
|
||||||
|
acc -10
|
||||||
|
jmp +58
|
||||||
|
nop +137
|
||||||
|
acc -17
|
||||||
|
acc +15
|
||||||
|
jmp -14
|
||||||
|
acc +27
|
||||||
|
jmp +512
|
||||||
|
jmp +415
|
||||||
|
jmp +489
|
||||||
|
jmp -12
|
||||||
|
acc +34
|
||||||
|
acc +31
|
||||||
|
jmp +438
|
||||||
|
acc +4
|
||||||
|
acc +31
|
||||||
|
acc +47
|
||||||
|
jmp +302
|
||||||
|
nop +446
|
||||||
|
acc -8
|
||||||
|
acc +42
|
||||||
|
jmp +305
|
||||||
|
nop +504
|
||||||
|
jmp +89
|
||||||
|
acc +25
|
||||||
|
acc -2
|
||||||
|
nop +279
|
||||||
|
acc +5
|
||||||
|
jmp +19
|
||||||
|
acc +38
|
||||||
|
jmp +121
|
||||||
|
jmp +87
|
||||||
|
acc +26
|
||||||
|
acc -18
|
||||||
|
acc -18
|
||||||
|
acc +34
|
||||||
|
jmp +500
|
||||||
|
acc +0
|
||||||
|
acc -1
|
||||||
|
acc +38
|
||||||
|
jmp +1
|
||||||
|
jmp -46
|
||||||
|
acc +39
|
||||||
|
acc -14
|
||||||
|
acc +48
|
||||||
|
acc +19
|
||||||
|
jmp +480
|
||||||
|
acc -3
|
||||||
|
acc -7
|
||||||
|
nop +316
|
||||||
|
jmp +1
|
||||||
|
jmp +406
|
||||||
|
acc -3
|
||||||
|
jmp -44
|
||||||
|
acc +21
|
||||||
|
acc -5
|
||||||
|
acc -3
|
||||||
|
jmp +447
|
||||||
|
jmp +478
|
||||||
|
jmp +53
|
||||||
|
acc -2
|
||||||
|
nop +202
|
||||||
|
jmp +264
|
||||||
|
acc -17
|
||||||
|
acc +16
|
||||||
|
jmp +405
|
||||||
|
acc +28
|
||||||
|
jmp +393
|
||||||
|
jmp +320
|
||||||
|
acc +35
|
||||||
|
acc +38
|
||||||
|
acc -19
|
||||||
|
acc +11
|
||||||
|
jmp +86
|
||||||
|
acc -8
|
||||||
|
jmp -97
|
||||||
|
jmp +350
|
||||||
|
jmp +35
|
||||||
|
nop +448
|
||||||
|
acc +7
|
||||||
|
acc -6
|
||||||
|
acc +6
|
||||||
|
jmp +444
|
||||||
|
acc +11
|
||||||
|
acc +42
|
||||||
|
acc -15
|
||||||
|
acc +44
|
||||||
|
jmp +145
|
||||||
|
acc +1
|
||||||
|
jmp +46
|
||||||
|
acc -6
|
||||||
|
acc +1
|
||||||
|
nop +183
|
||||||
|
acc +20
|
||||||
|
jmp +413
|
||||||
|
acc +42
|
||||||
|
acc -9
|
||||||
|
jmp +391
|
||||||
|
jmp +197
|
||||||
|
acc +27
|
||||||
|
acc +7
|
||||||
|
jmp +68
|
||||||
|
acc -11
|
||||||
|
jmp -140
|
||||||
|
acc +11
|
||||||
|
jmp +238
|
||||||
|
acc -11
|
||||||
|
acc +33
|
||||||
|
acc +41
|
||||||
|
jmp +391
|
||||||
|
acc +2
|
||||||
|
jmp +389
|
||||||
|
jmp -134
|
||||||
|
acc +2
|
||||||
|
acc +29
|
||||||
|
jmp +1
|
||||||
|
acc +34
|
||||||
|
jmp +358
|
||||||
|
acc +39
|
||||||
|
acc +2
|
||||||
|
acc -12
|
||||||
|
acc +16
|
||||||
|
jmp +97
|
||||||
|
acc +25
|
||||||
|
jmp +412
|
||||||
|
acc +42
|
||||||
|
jmp +129
|
||||||
|
jmp -21
|
||||||
|
acc +39
|
||||||
|
acc -9
|
||||||
|
jmp +130
|
||||||
|
acc +21
|
||||||
|
jmp +1
|
||||||
|
acc +5
|
||||||
|
jmp -97
|
||||||
|
acc -16
|
||||||
|
jmp -188
|
||||||
|
acc +15
|
||||||
|
jmp +72
|
||||||
|
jmp -76
|
||||||
|
acc -2
|
||||||
|
acc +33
|
||||||
|
acc +13
|
||||||
|
jmp -175
|
||||||
|
jmp +250
|
||||||
|
acc +4
|
||||||
|
acc +25
|
||||||
|
jmp -163
|
||||||
|
jmp +184
|
||||||
|
acc -17
|
||||||
|
jmp -195
|
||||||
|
acc +20
|
||||||
|
acc +45
|
||||||
|
jmp -18
|
||||||
|
acc +28
|
||||||
|
acc +48
|
||||||
|
acc +43
|
||||||
|
nop +53
|
||||||
|
jmp -111
|
||||||
|
nop +51
|
||||||
|
acc -15
|
||||||
|
acc -16
|
||||||
|
acc +46
|
||||||
|
jmp +150
|
||||||
|
nop +121
|
||||||
|
acc +46
|
||||||
|
acc +11
|
||||||
|
nop -65
|
||||||
|
jmp -62
|
||||||
|
acc +37
|
||||||
|
acc -7
|
||||||
|
acc -16
|
||||||
|
jmp +19
|
||||||
|
jmp +1
|
||||||
|
jmp +187
|
||||||
|
acc +6
|
||||||
|
acc -2
|
||||||
|
jmp +217
|
||||||
|
nop +32
|
||||||
|
nop +186
|
||||||
|
acc +5
|
||||||
|
jmp -134
|
||||||
|
acc -3
|
||||||
|
acc +49
|
||||||
|
acc +19
|
||||||
|
jmp -34
|
||||||
|
nop -127
|
||||||
|
acc +0
|
||||||
|
acc -4
|
||||||
|
acc +43
|
||||||
|
jmp +253
|
||||||
|
acc -18
|
||||||
|
nop -183
|
||||||
|
acc +6
|
||||||
|
acc +32
|
||||||
|
jmp +76
|
||||||
|
nop -37
|
||||||
|
acc +0
|
||||||
|
nop +65
|
||||||
|
acc +12
|
||||||
|
jmp +275
|
||||||
|
jmp +263
|
||||||
|
acc +22
|
||||||
|
acc +38
|
||||||
|
jmp +59
|
||||||
|
acc -10
|
||||||
|
acc +14
|
||||||
|
acc -7
|
||||||
|
jmp +141
|
||||||
|
jmp +156
|
||||||
|
acc +3
|
||||||
|
acc +20
|
||||||
|
acc -11
|
||||||
|
jmp -74
|
||||||
|
acc -1
|
||||||
|
acc +0
|
||||||
|
acc +35
|
||||||
|
acc +48
|
||||||
|
jmp +57
|
||||||
|
acc -16
|
||||||
|
acc +27
|
||||||
|
jmp +1
|
||||||
|
acc -2
|
||||||
|
jmp +82
|
||||||
|
acc +34
|
||||||
|
acc +5
|
||||||
|
acc +12
|
||||||
|
nop +233
|
||||||
|
jmp +32
|
||||||
|
jmp +79
|
||||||
|
acc +27
|
||||||
|
jmp -30
|
||||||
|
jmp +1
|
||||||
|
nop +210
|
||||||
|
acc -18
|
||||||
|
jmp +84
|
||||||
|
jmp +221
|
||||||
|
nop -297
|
||||||
|
acc +35
|
||||||
|
jmp +1
|
||||||
|
jmp +304
|
||||||
|
jmp +266
|
||||||
|
acc +26
|
||||||
|
acc +2
|
||||||
|
acc +16
|
||||||
|
acc +14
|
||||||
|
jmp -148
|
||||||
|
nop -193
|
||||||
|
acc -9
|
||||||
|
jmp -181
|
||||||
|
jmp -282
|
||||||
|
acc +16
|
||||||
|
jmp +1
|
||||||
|
acc +18
|
||||||
|
jmp +102
|
||||||
|
acc -17
|
||||||
|
nop +70
|
||||||
|
jmp -109
|
||||||
|
nop -83
|
||||||
|
jmp +4
|
||||||
|
jmp +128
|
||||||
|
acc +34
|
||||||
|
jmp +172
|
||||||
|
acc +47
|
||||||
|
acc +7
|
||||||
|
jmp -121
|
||||||
|
nop -107
|
||||||
|
acc -6
|
||||||
|
acc -12
|
||||||
|
nop -206
|
||||||
|
jmp +187
|
||||||
|
acc +35
|
||||||
|
acc +44
|
||||||
|
jmp -68
|
||||||
|
jmp +87
|
||||||
|
jmp -185
|
||||||
|
acc -6
|
||||||
|
acc +50
|
||||||
|
jmp -3
|
||||||
|
acc +40
|
||||||
|
jmp -79
|
||||||
|
acc +14
|
||||||
|
nop -50
|
||||||
|
acc -5
|
||||||
|
jmp -286
|
||||||
|
acc +39
|
||||||
|
jmp +44
|
||||||
|
acc +3
|
||||||
|
acc +40
|
||||||
|
acc -17
|
||||||
|
acc +41
|
||||||
|
jmp -318
|
||||||
|
jmp +131
|
||||||
|
jmp +1
|
||||||
|
jmp -220
|
||||||
|
acc +22
|
||||||
|
acc +11
|
||||||
|
acc +35
|
||||||
|
acc +48
|
||||||
|
jmp -7
|
||||||
|
acc +34
|
||||||
|
acc -10
|
||||||
|
acc +45
|
||||||
|
nop +233
|
||||||
|
jmp -202
|
||||||
|
acc +38
|
||||||
|
jmp -27
|
||||||
|
jmp +193
|
||||||
|
nop -345
|
||||||
|
acc +0
|
||||||
|
jmp -109
|
||||||
|
acc +24
|
||||||
|
jmp -357
|
||||||
|
acc +15
|
||||||
|
jmp -72
|
||||||
|
acc -15
|
||||||
|
nop +10
|
||||||
|
nop -126
|
||||||
|
jmp -309
|
||||||
|
acc +2
|
||||||
|
jmp -35
|
||||||
|
acc +7
|
||||||
|
acc +31
|
||||||
|
jmp +1
|
||||||
|
nop -313
|
||||||
|
jmp +145
|
||||||
|
acc -19
|
||||||
|
nop +209
|
||||||
|
jmp +98
|
||||||
|
jmp -282
|
||||||
|
jmp -80
|
||||||
|
jmp -203
|
||||||
|
jmp +41
|
||||||
|
acc +33
|
||||||
|
acc -1
|
||||||
|
jmp +108
|
||||||
|
acc +15
|
||||||
|
jmp -306
|
||||||
|
acc +9
|
||||||
|
acc +8
|
||||||
|
acc +28
|
||||||
|
acc -3
|
||||||
|
jmp -324
|
||||||
|
acc -10
|
||||||
|
jmp -242
|
||||||
|
acc -11
|
||||||
|
acc +14
|
||||||
|
acc +35
|
||||||
|
jmp -85
|
||||||
|
acc -7
|
||||||
|
acc +24
|
||||||
|
acc +38
|
||||||
|
jmp -341
|
||||||
|
acc +21
|
||||||
|
acc -15
|
||||||
|
jmp -92
|
||||||
|
acc +18
|
||||||
|
acc -14
|
||||||
|
jmp -148
|
||||||
|
nop -341
|
||||||
|
jmp +166
|
||||||
|
jmp +82
|
||||||
|
acc -13
|
||||||
|
acc +36
|
||||||
|
jmp +100
|
||||||
|
acc +18
|
||||||
|
acc +40
|
||||||
|
acc +1
|
||||||
|
jmp -384
|
||||||
|
acc +26
|
||||||
|
nop +87
|
||||||
|
acc +28
|
||||||
|
jmp -298
|
||||||
|
acc +35
|
||||||
|
nop -132
|
||||||
|
acc +19
|
||||||
|
acc +24
|
||||||
|
jmp +57
|
||||||
|
acc -4
|
||||||
|
acc +17
|
||||||
|
acc -7
|
||||||
|
jmp +83
|
||||||
|
acc +36
|
||||||
|
jmp -208
|
||||||
|
nop -429
|
||||||
|
acc +0
|
||||||
|
acc +19
|
||||||
|
jmp -432
|
||||||
|
acc +24
|
||||||
|
acc -19
|
||||||
|
nop -406
|
||||||
|
jmp -209
|
||||||
|
acc +19
|
||||||
|
jmp -98
|
||||||
|
acc +33
|
||||||
|
acc +30
|
||||||
|
nop -328
|
||||||
|
jmp -238
|
||||||
|
acc +41
|
||||||
|
acc +9
|
||||||
|
acc -14
|
||||||
|
acc -11
|
||||||
|
jmp -139
|
||||||
|
jmp +145
|
||||||
|
acc +18
|
||||||
|
nop +102
|
||||||
|
acc +38
|
||||||
|
jmp -132
|
||||||
|
acc -3
|
||||||
|
acc +6
|
||||||
|
jmp -386
|
||||||
|
acc +7
|
||||||
|
acc +3
|
||||||
|
acc +6
|
||||||
|
jmp -430
|
||||||
|
acc +32
|
||||||
|
acc +28
|
||||||
|
acc +40
|
||||||
|
acc +0
|
||||||
|
jmp -83
|
||||||
|
acc +0
|
||||||
|
jmp +1
|
||||||
|
jmp -283
|
||||||
|
acc +11
|
||||||
|
jmp -299
|
||||||
|
jmp -224
|
||||||
|
nop +34
|
||||||
|
acc +21
|
||||||
|
nop -34
|
||||||
|
acc -10
|
||||||
|
jmp +27
|
||||||
|
acc -7
|
||||||
|
acc +8
|
||||||
|
jmp +67
|
||||||
|
nop -436
|
||||||
|
acc -15
|
||||||
|
acc +3
|
||||||
|
jmp -22
|
||||||
|
acc -12
|
||||||
|
nop -421
|
||||||
|
acc -13
|
||||||
|
acc -18
|
||||||
|
jmp -388
|
||||||
|
acc +30
|
||||||
|
acc +13
|
||||||
|
jmp -408
|
||||||
|
acc -3
|
||||||
|
acc -9
|
||||||
|
acc +34
|
||||||
|
acc +0
|
||||||
|
jmp -137
|
||||||
|
acc +4
|
||||||
|
acc +22
|
||||||
|
acc +7
|
||||||
|
acc +48
|
||||||
|
jmp +61
|
||||||
|
jmp +70
|
||||||
|
jmp -484
|
||||||
|
acc +19
|
||||||
|
jmp -382
|
||||||
|
acc +45
|
||||||
|
jmp +75
|
||||||
|
acc +34
|
||||||
|
jmp -144
|
||||||
|
jmp -381
|
||||||
|
jmp +1
|
||||||
|
acc +48
|
||||||
|
acc +48
|
||||||
|
acc +0
|
||||||
|
jmp -108
|
||||||
|
acc +0
|
||||||
|
jmp +1
|
||||||
|
jmp -477
|
||||||
|
acc +48
|
||||||
|
jmp +62
|
||||||
|
acc +1
|
||||||
|
jmp +1
|
||||||
|
jmp +49
|
||||||
|
acc -13
|
||||||
|
acc +20
|
||||||
|
jmp -406
|
||||||
|
acc +48
|
||||||
|
acc +3
|
||||||
|
acc -9
|
||||||
|
acc +32
|
||||||
|
jmp -124
|
||||||
|
acc -16
|
||||||
|
jmp -131
|
||||||
|
acc +27
|
||||||
|
acc -4
|
||||||
|
acc +36
|
||||||
|
acc -12
|
||||||
|
jmp -255
|
||||||
|
acc +0
|
||||||
|
jmp +1
|
||||||
|
acc +8
|
||||||
|
acc +41
|
||||||
|
jmp -407
|
||||||
|
jmp -543
|
||||||
|
jmp -73
|
||||||
|
nop +4
|
||||||
|
acc -6
|
||||||
|
jmp -504
|
||||||
|
jmp -28
|
||||||
|
nop -450
|
||||||
|
jmp -226
|
||||||
|
jmp -274
|
||||||
|
acc +1
|
||||||
|
jmp -568
|
||||||
|
acc +29
|
||||||
|
jmp -570
|
||||||
|
jmp +1
|
||||||
|
jmp -494
|
||||||
|
acc +29
|
||||||
|
acc -12
|
||||||
|
jmp -127
|
||||||
|
acc +32
|
||||||
|
jmp -135
|
||||||
|
jmp -383
|
||||||
|
nop -59
|
||||||
|
acc -19
|
||||||
|
acc +2
|
||||||
|
acc +26
|
||||||
|
jmp -446
|
||||||
|
acc +47
|
||||||
|
jmp +1
|
||||||
|
acc -18
|
||||||
|
acc -10
|
||||||
|
acc +32
|
||||||
|
nop -423
|
||||||
|
jmp -476
|
||||||
|
acc +39
|
||||||
|
acc +27
|
||||||
|
acc -9
|
||||||
|
acc +28
|
||||||
|
jmp -325
|
||||||
|
acc +37
|
||||||
|
acc +28
|
||||||
|
nop -81
|
||||||
|
jmp -310
|
||||||
|
acc -2
|
||||||
|
acc +8
|
||||||
|
acc +28
|
||||||
|
jmp -43
|
||||||
|
jmp -141
|
||||||
|
acc +5
|
||||||
|
nop -2
|
||||||
|
jmp -457
|
||||||
|
acc +25
|
||||||
|
acc +13
|
||||||
|
acc +0
|
||||||
|
jmp +1
|
||||||
|
jmp +1
|
|
@ -0,0 +1,78 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Instruction struct {
|
||||||
|
Type string
|
||||||
|
Argument int
|
||||||
|
}
|
||||||
|
|
||||||
|
type Code []*Instruction
|
||||||
|
|
||||||
|
type Processor struct {
|
||||||
|
Accumulator int
|
||||||
|
Index int
|
||||||
|
Code Code
|
||||||
|
ExecutedInstructions []bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) LoadCode(code Code) {
|
||||||
|
p.Code = code
|
||||||
|
p.ExecutedInstructions = make([]bool, len(code))
|
||||||
|
p.Accumulator = 0
|
||||||
|
p.Index = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) RunCurrent() (dupe bool) {
|
||||||
|
instruction := p.Code[p.Index]
|
||||||
|
switch instruction.Type {
|
||||||
|
case "acc":
|
||||||
|
p.Accumulator += instruction.Argument
|
||||||
|
p.Index++
|
||||||
|
case "jmp":
|
||||||
|
p.Index += instruction.Argument
|
||||||
|
case "nop":
|
||||||
|
p.Index++
|
||||||
|
default:
|
||||||
|
panic("invalid instruction found: " + instruction.Type)
|
||||||
|
}
|
||||||
|
dupe = p.ExecutedInstructions[p.Index]
|
||||||
|
p.ExecutedInstructions[p.Index] = true
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f, err := os.Open("input")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// "compile" code
|
||||||
|
code := Code{}
|
||||||
|
for {
|
||||||
|
instruction := new(Instruction)
|
||||||
|
_, err := fmt.Fscanf(f, "%s %d\n", &instruction.Type, &instruction.Argument)
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
code = append(code, instruction)
|
||||||
|
}
|
||||||
|
|
||||||
|
// run code until we find dupe
|
||||||
|
processor := new(Processor)
|
||||||
|
processor.LoadCode(code)
|
||||||
|
for {
|
||||||
|
dupe := processor.RunCurrent()
|
||||||
|
if dupe {
|
||||||
|
fmt.Printf("Detected dupe run, accumulator is %d\n", processor.Accumulator)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,125 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Instruction struct {
|
||||||
|
Type string
|
||||||
|
Argument int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (i *Instruction) String() string {
|
||||||
|
return fmt.Sprintf("%s %+0d", i.Type, i.Argument)
|
||||||
|
}
|
||||||
|
|
||||||
|
type Code []*Instruction
|
||||||
|
|
||||||
|
type Processor struct {
|
||||||
|
Accumulator int
|
||||||
|
Index int
|
||||||
|
Code Code
|
||||||
|
ExecutedInstructions []bool
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) LoadCode(code Code) {
|
||||||
|
p.Code = code
|
||||||
|
p.ExecutedInstructions = make([]bool, len(code))
|
||||||
|
p.Accumulator = 0
|
||||||
|
p.Index = 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) RunCurrent() (dupe bool) {
|
||||||
|
if p.EndOfCode() {
|
||||||
|
panic("tried to run code past end")
|
||||||
|
}
|
||||||
|
instruction := p.Code[p.Index]
|
||||||
|
switch instruction.Type {
|
||||||
|
case "acc":
|
||||||
|
p.Accumulator += instruction.Argument
|
||||||
|
p.Index++
|
||||||
|
case "jmp":
|
||||||
|
p.Index += instruction.Argument
|
||||||
|
case "nop":
|
||||||
|
p.Index++
|
||||||
|
default:
|
||||||
|
panic("invalid instruction found: " + instruction.Type)
|
||||||
|
}
|
||||||
|
if !p.EndOfCode() {
|
||||||
|
dupe = p.ExecutedInstructions[p.Index]
|
||||||
|
p.ExecutedInstructions[p.Index] = true
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) EndOfCode() bool {
|
||||||
|
return p.Index >= len(p.Code)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Processor) HasCodeLoaded() bool {
|
||||||
|
return p.Code != nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
f, err := os.Open("input")
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
// "compile" code
|
||||||
|
code := Code{}
|
||||||
|
for {
|
||||||
|
instruction := new(Instruction)
|
||||||
|
_, err := fmt.Fscanf(f, "%s %d\n", &instruction.Type, &instruction.Argument)
|
||||||
|
if err == io.EOF {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
code = append(code, instruction)
|
||||||
|
}
|
||||||
|
|
||||||
|
// go through code and replace exactly one jmp->nop or nop->jmp
|
||||||
|
processor := new(Processor)
|
||||||
|
patching:
|
||||||
|
for patchIndex := 0; patchIndex < len(code) && (!processor.HasCodeLoaded() || !processor.EndOfCode()); patchIndex++ {
|
||||||
|
patchedCode := make(Code, len(code))
|
||||||
|
copy(patchedCode, code)
|
||||||
|
|
||||||
|
switch patchedCode[patchIndex].Type {
|
||||||
|
case "jmp":
|
||||||
|
patchedCode[patchIndex] = &Instruction{
|
||||||
|
Type: "nop",
|
||||||
|
Argument: patchedCode[patchIndex].Argument,
|
||||||
|
}
|
||||||
|
case "nop":
|
||||||
|
patchedCode[patchIndex] = &Instruction{
|
||||||
|
Type: "jmp",
|
||||||
|
Argument: patchedCode[patchIndex].Argument,
|
||||||
|
}
|
||||||
|
default:
|
||||||
|
//fmt.Printf("Skipping instruction %d\n", patchIndex)
|
||||||
|
continue patching
|
||||||
|
}
|
||||||
|
fmt.Printf("Patched instruction %d from %s to %s\n", patchIndex, code[patchIndex], patchedCode[patchIndex])
|
||||||
|
|
||||||
|
processor.LoadCode(patchedCode)
|
||||||
|
for !processor.EndOfCode() {
|
||||||
|
dupe := processor.RunCurrent()
|
||||||
|
if dupe {
|
||||||
|
fmt.Printf("=> Detected dupe run, accumulator is %d\n", processor.Accumulator)
|
||||||
|
continue patching
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// end of code reached!
|
||||||
|
fmt.Printf("=> Code terminated with accumulator %d\n", processor.Accumulator)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Println("End of code reached")
|
||||||
|
//spew.Dump(processor)
|
||||||
|
}
|
Loading…
Reference in New Issue