master
Icedream 2020-12-09 23:37:58 +01:00
parent 2212a59b86
commit f7bf844b03
Signed by: icedream
GPG Key ID: 1573F6D8EFE4D0CF
3 changed files with 824 additions and 0 deletions

621
day8/input Normal file
View File

@ -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

78
day8/part1/main.go Normal file
View File

@ -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
}
}
}

125
day8/part2/main.go Normal file
View File

@ -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)
}