mirror of
https://github.com/Threnklyn/advent-of-code-go.git
synced 2026-05-18 19:13:27 +02:00
2020 day 8 - game console/assmebly language computer
This commit is contained in:
Executable
+596
@@ -0,0 +1,596 @@
|
||||
acc +40
|
||||
jmp +187
|
||||
acc +47
|
||||
acc +20
|
||||
acc -12
|
||||
jmp +225
|
||||
nop +488
|
||||
acc +13
|
||||
nop +462
|
||||
jmp +374
|
||||
acc +15
|
||||
acc +42
|
||||
jmp +116
|
||||
acc +23
|
||||
nop +216
|
||||
acc -15
|
||||
jmp +398
|
||||
jmp +103
|
||||
acc +17
|
||||
acc +7
|
||||
jmp +571
|
||||
jmp +1
|
||||
jmp +217
|
||||
acc +7
|
||||
jmp +1
|
||||
acc +35
|
||||
jmp +257
|
||||
acc +24
|
||||
nop +20
|
||||
jmp +309
|
||||
acc +2
|
||||
acc -15
|
||||
acc -13
|
||||
nop +457
|
||||
jmp +19
|
||||
acc +46
|
||||
acc +45
|
||||
acc +35
|
||||
jmp +295
|
||||
acc -15
|
||||
acc +49
|
||||
acc +22
|
||||
jmp +400
|
||||
jmp +202
|
||||
nop -38
|
||||
jmp +381
|
||||
acc +0
|
||||
jmp +137
|
||||
acc +27
|
||||
jmp +196
|
||||
acc +46
|
||||
acc -15
|
||||
jmp +348
|
||||
jmp +457
|
||||
acc +50
|
||||
acc +8
|
||||
jmp +452
|
||||
acc -14
|
||||
nop +321
|
||||
acc +39
|
||||
jmp +273
|
||||
acc -9
|
||||
jmp +413
|
||||
acc +32
|
||||
jmp +64
|
||||
acc +18
|
||||
jmp +152
|
||||
acc -4
|
||||
acc +9
|
||||
acc +10
|
||||
acc -1
|
||||
jmp +433
|
||||
acc +40
|
||||
jmp -55
|
||||
acc +28
|
||||
nop +279
|
||||
jmp +145
|
||||
acc +24
|
||||
nop +416
|
||||
acc +45
|
||||
jmp +45
|
||||
acc +0
|
||||
acc +49
|
||||
acc -14
|
||||
jmp +44
|
||||
acc +17
|
||||
acc +18
|
||||
nop +224
|
||||
acc +3
|
||||
jmp +261
|
||||
jmp -84
|
||||
acc -11
|
||||
acc +29
|
||||
acc +42
|
||||
jmp -13
|
||||
acc -5
|
||||
jmp +210
|
||||
acc +26
|
||||
acc -19
|
||||
acc -19
|
||||
jmp -82
|
||||
acc +29
|
||||
acc +31
|
||||
acc -4
|
||||
jmp +53
|
||||
acc +46
|
||||
jmp +139
|
||||
acc +45
|
||||
acc +30
|
||||
jmp +1
|
||||
jmp +418
|
||||
jmp +248
|
||||
acc +24
|
||||
acc +15
|
||||
acc +34
|
||||
acc +17
|
||||
jmp +52
|
||||
acc +23
|
||||
acc +18
|
||||
jmp +65
|
||||
jmp +1
|
||||
acc +37
|
||||
acc +25
|
||||
jmp +385
|
||||
jmp +281
|
||||
nop +345
|
||||
jmp -25
|
||||
jmp +149
|
||||
acc +21
|
||||
acc +28
|
||||
acc +15
|
||||
jmp -74
|
||||
jmp +179
|
||||
jmp +287
|
||||
acc +14
|
||||
acc -3
|
||||
acc -7
|
||||
jmp -9
|
||||
acc +17
|
||||
acc -8
|
||||
jmp +344
|
||||
jmp +1
|
||||
acc +36
|
||||
acc -16
|
||||
acc -17
|
||||
jmp -82
|
||||
jmp +1
|
||||
acc +41
|
||||
acc -8
|
||||
acc +27
|
||||
jmp +381
|
||||
acc -10
|
||||
nop -71
|
||||
acc +23
|
||||
nop +377
|
||||
jmp -125
|
||||
jmp +319
|
||||
nop +119
|
||||
nop +309
|
||||
nop +195
|
||||
jmp +307
|
||||
acc +8
|
||||
acc +31
|
||||
jmp +1
|
||||
acc -15
|
||||
jmp +398
|
||||
jmp +265
|
||||
jmp -55
|
||||
nop +143
|
||||
jmp -36
|
||||
acc +38
|
||||
nop -38
|
||||
jmp +298
|
||||
acc -17
|
||||
acc +39
|
||||
acc -13
|
||||
jmp -38
|
||||
acc +23
|
||||
jmp +133
|
||||
acc +23
|
||||
jmp -90
|
||||
acc +14
|
||||
jmp +1
|
||||
jmp +100
|
||||
nop +230
|
||||
jmp +346
|
||||
acc +36
|
||||
jmp +14
|
||||
jmp +126
|
||||
jmp -32
|
||||
jmp -142
|
||||
acc +25
|
||||
jmp +146
|
||||
nop +118
|
||||
acc -3
|
||||
jmp +1
|
||||
acc -8
|
||||
jmp +101
|
||||
nop +277
|
||||
acc +27
|
||||
jmp +328
|
||||
acc -11
|
||||
acc +17
|
||||
nop +135
|
||||
jmp +196
|
||||
acc -9
|
||||
jmp +39
|
||||
nop +110
|
||||
acc +14
|
||||
nop +3
|
||||
jmp +17
|
||||
jmp +220
|
||||
acc +17
|
||||
jmp +5
|
||||
acc +18
|
||||
acc +39
|
||||
acc -12
|
||||
jmp -204
|
||||
jmp +317
|
||||
acc +37
|
||||
jmp +222
|
||||
nop +146
|
||||
nop +248
|
||||
jmp +182
|
||||
acc +48
|
||||
acc -13
|
||||
jmp +174
|
||||
jmp +342
|
||||
nop -189
|
||||
jmp +324
|
||||
acc +35
|
||||
acc +25
|
||||
acc +21
|
||||
jmp -152
|
||||
nop -92
|
||||
acc -3
|
||||
acc -15
|
||||
acc +30
|
||||
jmp -157
|
||||
acc -17
|
||||
acc +37
|
||||
acc +7
|
||||
acc +5
|
||||
jmp -225
|
||||
jmp -177
|
||||
acc +21
|
||||
jmp +244
|
||||
acc +42
|
||||
acc -4
|
||||
jmp -116
|
||||
nop +225
|
||||
nop -63
|
||||
acc +20
|
||||
jmp +195
|
||||
acc +20
|
||||
acc +21
|
||||
jmp +228
|
||||
acc +16
|
||||
acc -8
|
||||
acc +12
|
||||
nop +188
|
||||
jmp +9
|
||||
acc +6
|
||||
acc -13
|
||||
acc +36
|
||||
jmp -86
|
||||
jmp -253
|
||||
nop -60
|
||||
acc +25
|
||||
jmp -174
|
||||
acc +10
|
||||
nop -114
|
||||
jmp -65
|
||||
jmp +1
|
||||
acc +24
|
||||
jmp -150
|
||||
acc +27
|
||||
jmp -47
|
||||
acc +50
|
||||
nop -58
|
||||
acc -17
|
||||
acc -16
|
||||
jmp -170
|
||||
jmp -104
|
||||
jmp -177
|
||||
acc +46
|
||||
jmp +106
|
||||
jmp -206
|
||||
acc +2
|
||||
acc +10
|
||||
acc +17
|
||||
nop -107
|
||||
jmp -126
|
||||
jmp +1
|
||||
acc +50
|
||||
acc -14
|
||||
acc +29
|
||||
jmp -234
|
||||
nop +144
|
||||
acc +43
|
||||
acc +34
|
||||
jmp +221
|
||||
jmp +1
|
||||
nop +97
|
||||
acc +39
|
||||
jmp -60
|
||||
acc +44
|
||||
jmp -240
|
||||
acc +11
|
||||
acc +36
|
||||
jmp -71
|
||||
acc -5
|
||||
jmp +149
|
||||
jmp +54
|
||||
acc +38
|
||||
jmp +44
|
||||
jmp -165
|
||||
acc +14
|
||||
jmp -134
|
||||
acc +3
|
||||
acc +22
|
||||
nop +46
|
||||
acc -12
|
||||
jmp -57
|
||||
acc +49
|
||||
acc +24
|
||||
acc +16
|
||||
jmp +27
|
||||
acc +6
|
||||
nop -5
|
||||
acc +45
|
||||
acc +34
|
||||
jmp -175
|
||||
jmp -76
|
||||
acc +3
|
||||
acc +15
|
||||
acc -19
|
||||
jmp +1
|
||||
nop -226
|
||||
acc -2
|
||||
jmp -55
|
||||
jmp -284
|
||||
acc +2
|
||||
jmp +1
|
||||
jmp +15
|
||||
acc +11
|
||||
acc +12
|
||||
acc -1
|
||||
acc +2
|
||||
jmp +179
|
||||
acc +19
|
||||
acc +17
|
||||
jmp -329
|
||||
jmp -272
|
||||
jmp -104
|
||||
acc +41
|
||||
nop +189
|
||||
acc +47
|
||||
jmp -88
|
||||
acc +4
|
||||
acc +16
|
||||
acc +43
|
||||
acc +25
|
||||
jmp +71
|
||||
acc -2
|
||||
acc +45
|
||||
jmp -173
|
||||
jmp +1
|
||||
acc +44
|
||||
acc +33
|
||||
jmp -53
|
||||
acc +45
|
||||
acc +9
|
||||
acc +0
|
||||
acc +12
|
||||
jmp +178
|
||||
jmp -100
|
||||
acc +14
|
||||
jmp -67
|
||||
acc +42
|
||||
jmp +201
|
||||
acc +30
|
||||
jmp -319
|
||||
nop -4
|
||||
nop -211
|
||||
acc -3
|
||||
nop -165
|
||||
jmp -175
|
||||
acc +12
|
||||
acc -10
|
||||
acc -14
|
||||
jmp -53
|
||||
acc -13
|
||||
nop -143
|
||||
jmp +159
|
||||
acc -5
|
||||
nop +18
|
||||
nop -5
|
||||
acc +13
|
||||
jmp -248
|
||||
jmp +114
|
||||
acc +10
|
||||
nop -396
|
||||
nop -246
|
||||
jmp +16
|
||||
acc -3
|
||||
acc +33
|
||||
nop +174
|
||||
acc +48
|
||||
jmp -289
|
||||
nop +98
|
||||
acc +18
|
||||
acc -17
|
||||
jmp -137
|
||||
jmp +1
|
||||
acc +34
|
||||
acc +36
|
||||
jmp -216
|
||||
acc +11
|
||||
jmp -102
|
||||
acc +10
|
||||
jmp +10
|
||||
acc +26
|
||||
acc +35
|
||||
acc -9
|
||||
jmp -83
|
||||
acc +15
|
||||
nop -397
|
||||
jmp -140
|
||||
nop +111
|
||||
jmp +139
|
||||
jmp -165
|
||||
acc +16
|
||||
jmp -343
|
||||
acc +8
|
||||
acc +35
|
||||
acc -17
|
||||
acc -8
|
||||
jmp +29
|
||||
acc +50
|
||||
nop -256
|
||||
jmp -268
|
||||
jmp +132
|
||||
acc +13
|
||||
acc +38
|
||||
acc -6
|
||||
acc -7
|
||||
jmp -327
|
||||
acc -8
|
||||
jmp -256
|
||||
nop -139
|
||||
acc +30
|
||||
jmp -60
|
||||
acc -1
|
||||
acc +11
|
||||
jmp -216
|
||||
acc -12
|
||||
nop -390
|
||||
acc +17
|
||||
acc +39
|
||||
jmp +101
|
||||
acc +28
|
||||
jmp +1
|
||||
acc -7
|
||||
acc -18
|
||||
jmp -277
|
||||
jmp -90
|
||||
acc -10
|
||||
jmp -326
|
||||
jmp -368
|
||||
nop -396
|
||||
jmp -320
|
||||
acc +42
|
||||
acc +3
|
||||
jmp -430
|
||||
acc +47
|
||||
acc +11
|
||||
acc +19
|
||||
acc +41
|
||||
jmp -354
|
||||
acc +30
|
||||
acc +7
|
||||
nop -106
|
||||
jmp -420
|
||||
acc +22
|
||||
acc -15
|
||||
jmp -296
|
||||
acc -7
|
||||
acc +48
|
||||
jmp -19
|
||||
jmp -148
|
||||
acc +10
|
||||
jmp +1
|
||||
jmp +17
|
||||
nop -273
|
||||
acc +42
|
||||
acc -4
|
||||
nop -130
|
||||
jmp +47
|
||||
nop -436
|
||||
acc -7
|
||||
jmp +1
|
||||
acc +42
|
||||
jmp -330
|
||||
acc +35
|
||||
jmp +56
|
||||
acc -19
|
||||
jmp -440
|
||||
jmp -335
|
||||
jmp -279
|
||||
nop -390
|
||||
jmp +74
|
||||
acc -5
|
||||
jmp -456
|
||||
acc +38
|
||||
acc +3
|
||||
jmp +47
|
||||
acc +50
|
||||
acc +26
|
||||
acc +46
|
||||
acc -7
|
||||
jmp -491
|
||||
acc -4
|
||||
acc -7
|
||||
acc +14
|
||||
nop -105
|
||||
jmp -487
|
||||
jmp -326
|
||||
nop -360
|
||||
jmp -378
|
||||
jmp -285
|
||||
acc +46
|
||||
jmp -190
|
||||
acc +10
|
||||
jmp -346
|
||||
acc +49
|
||||
jmp -492
|
||||
acc -9
|
||||
acc -17
|
||||
jmp -147
|
||||
acc +20
|
||||
jmp -217
|
||||
nop -183
|
||||
acc +35
|
||||
jmp -268
|
||||
nop -51
|
||||
jmp +1
|
||||
jmp -440
|
||||
acc +22
|
||||
acc +24
|
||||
jmp +1
|
||||
acc +26
|
||||
jmp -451
|
||||
acc -14
|
||||
acc +48
|
||||
acc +3
|
||||
jmp -363
|
||||
acc +21
|
||||
acc +24
|
||||
acc +36
|
||||
jmp -418
|
||||
jmp -108
|
||||
jmp -323
|
||||
jmp +20
|
||||
acc +1
|
||||
acc +21
|
||||
nop -212
|
||||
acc -3
|
||||
jmp -338
|
||||
acc +36
|
||||
acc -19
|
||||
jmp -192
|
||||
acc +49
|
||||
jmp -380
|
||||
acc -12
|
||||
acc +14
|
||||
acc +38
|
||||
acc +4
|
||||
jmp -228
|
||||
acc +2
|
||||
jmp -197
|
||||
jmp -41
|
||||
jmp -265
|
||||
jmp -113
|
||||
jmp -459
|
||||
jmp +1
|
||||
acc +38
|
||||
jmp -79
|
||||
acc +16
|
||||
nop -456
|
||||
jmp -129
|
||||
acc +12
|
||||
acc +29
|
||||
nop -575
|
||||
acc -7
|
||||
jmp +1
|
||||
+97
-12
@@ -16,36 +16,121 @@ func main() {
|
||||
|
||||
if part == 1 {
|
||||
ans := part1(util.ReadFile("./input.txt"))
|
||||
util.CopyToClipboard(fmt.Sprintf("%v", ans))
|
||||
fmt.Println("Output:", ans)
|
||||
} else {
|
||||
ans := part2(util.ReadFile("./input.txt"))
|
||||
util.CopyToClipboard(fmt.Sprintf("%v", ans))
|
||||
fmt.Println("Output:", ans)
|
||||
}
|
||||
}
|
||||
|
||||
func part1(input string) int {
|
||||
parsed := parseInput(input)
|
||||
_ = parsed
|
||||
comp := newComputerFromInput(input)
|
||||
|
||||
return 0
|
||||
// keep track of all the indices of instructions that have run
|
||||
// if it has already been run, break
|
||||
ranInstructionsIndices := map[int]bool{}
|
||||
for {
|
||||
nextInst := comp.index
|
||||
if ranInstructionsIndices[nextInst] {
|
||||
break
|
||||
}
|
||||
ranInstructionsIndices[nextInst] = true
|
||||
|
||||
comp.step()
|
||||
}
|
||||
|
||||
return comp.accumulator
|
||||
}
|
||||
|
||||
func part2(input string) int {
|
||||
parsed := parseInput(input)
|
||||
_ = parsed
|
||||
comp := newComputerFromInput(input)
|
||||
|
||||
return 0
|
||||
// iterate through instruction indices
|
||||
for i := range comp.instructions {
|
||||
// make new computer each time
|
||||
newComputer := newComputerFromInput(input)
|
||||
|
||||
// flip this index's instruction if a jmp or nop
|
||||
switch newComputer.instructions[i].instType {
|
||||
case "jmp":
|
||||
newComputer.instructions[i].instType = "nop"
|
||||
case "nop":
|
||||
newComputer.instructions[i].instType = "jmp"
|
||||
case "acc":
|
||||
continue
|
||||
}
|
||||
|
||||
// run isInfiniteLoop check which returns final global value
|
||||
if ans, isLoop := isInfiniteLoop(newComputer); !isLoop {
|
||||
return ans
|
||||
}
|
||||
}
|
||||
|
||||
// this should never be hit
|
||||
fmt.Println("ERROR: No terminating set of instructions found")
|
||||
return -1
|
||||
}
|
||||
|
||||
func parseInput(input string) []int {
|
||||
var ans []int
|
||||
type instruction struct {
|
||||
instType string
|
||||
value int
|
||||
}
|
||||
|
||||
func newComputerFromInput(input string) computer {
|
||||
var instructions []instruction
|
||||
|
||||
lines := strings.Split(input, "\n")
|
||||
for _, l := range lines {
|
||||
ans = append(ans, util.StrToInt(l))
|
||||
inst := instruction{}
|
||||
fmt.Sscanf(l, "%s %d", &inst.instType, &inst.value)
|
||||
instructions = append(instructions, inst)
|
||||
}
|
||||
|
||||
return ans
|
||||
return computer{instructions: instructions}
|
||||
}
|
||||
|
||||
type computer struct {
|
||||
instructions []instruction
|
||||
index int
|
||||
accumulator int
|
||||
}
|
||||
|
||||
func (c *computer) acc(val int) {
|
||||
c.accumulator += val
|
||||
c.index++
|
||||
}
|
||||
func (c *computer) jmp(val int) {
|
||||
c.index += val
|
||||
}
|
||||
func (c *computer) nop(val int) {
|
||||
c.index++
|
||||
}
|
||||
|
||||
func (c *computer) step() {
|
||||
switch inst := c.instructions[c.index]; inst.instType {
|
||||
case "acc":
|
||||
c.acc(inst.value)
|
||||
case "jmp":
|
||||
c.jmp(inst.value)
|
||||
case "nop":
|
||||
c.nop(inst.value)
|
||||
}
|
||||
}
|
||||
|
||||
func isInfiniteLoop(comp computer) (finalAccumulatorVal int, isLoop bool) {
|
||||
ranInstructionsIndices := map[int]bool{}
|
||||
for comp.index < len(comp.instructions) {
|
||||
nextInst := comp.index
|
||||
// is an infinite loop, return out
|
||||
if ranInstructionsIndices[nextInst] {
|
||||
return 0, true
|
||||
}
|
||||
ranInstructionsIndices[nextInst] = true
|
||||
|
||||
comp.step()
|
||||
}
|
||||
|
||||
// instructions finished, return final accumulator & indicate it was not an
|
||||
// infinite loop
|
||||
return comp.accumulator, false
|
||||
}
|
||||
|
||||
@@ -1,14 +1,17 @@
|
||||
package main
|
||||
|
||||
import "testing"
|
||||
import (
|
||||
"testing"
|
||||
|
||||
"github.com/alexchao26/advent-of-code-go/util"
|
||||
)
|
||||
|
||||
var tests1 = []struct {
|
||||
name string
|
||||
want int
|
||||
input string
|
||||
// add extra args if needed
|
||||
}{
|
||||
// {"actual", ACTUAL_ANSWER, util.ReadFile("input.txt")},
|
||||
{"actual", 1137, util.ReadFile("input.txt")},
|
||||
}
|
||||
|
||||
func TestPart1(t *testing.T) {
|
||||
@@ -25,9 +28,8 @@ var tests2 = []struct {
|
||||
name string
|
||||
want int
|
||||
input string
|
||||
// add extra args if needed
|
||||
}{
|
||||
// {"actual", ACTUAL_ANSWER, util.ReadFile("input.txt")},
|
||||
{"actual", 1125, util.ReadFile("input.txt")},
|
||||
}
|
||||
|
||||
func TestPart2(t *testing.T) {
|
||||
|
||||
Reference in New Issue
Block a user