day 8 solution
This commit is contained in:
parent
13d5d6c9d1
commit
690f55f0ad
122
2020/Day08.cs
Normal file
122
2020/Day08.cs
Normal file
@ -0,0 +1,122 @@
|
||||
using System;
|
||||
using static System.Console;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Text.RegularExpressions;
|
||||
using Xunit;
|
||||
|
||||
namespace AdventOfCode {
|
||||
|
||||
public class Day08 {
|
||||
|
||||
public class GameConsole {
|
||||
int accumulator = 0;
|
||||
int pointer = 0;
|
||||
|
||||
// Returns a (bool, int) tuple, where the bool indicates whether the program terminated
|
||||
// normally (if false, it executed an infinite loop), and the int indicates the value of
|
||||
// the accumulator at the time of termination.
|
||||
public (bool, int) Execute(List<Instruction> code) {
|
||||
var instructionsExecuted = new HashSet<int>();
|
||||
while (pointer < code.Count()) {
|
||||
if (instructionsExecuted.Contains(pointer)) {
|
||||
return (false, accumulator); // loop detected
|
||||
}
|
||||
instructionsExecuted.Add(pointer);
|
||||
Instruction instruction = code[pointer];
|
||||
switch (instruction.Op) {
|
||||
case "nop":
|
||||
pointer++;
|
||||
break;
|
||||
case "acc":
|
||||
pointer++;
|
||||
accumulator += instruction.Value;
|
||||
break;
|
||||
case "jmp":
|
||||
pointer += instruction.Value;
|
||||
break;
|
||||
default:
|
||||
throw new Exception("invalid op");
|
||||
}
|
||||
}
|
||||
return (true, accumulator); // normal termination
|
||||
}
|
||||
}
|
||||
|
||||
public record Instruction(string Op, int Value);
|
||||
|
||||
public static int RepairBrokenInstruction(List<Instruction> code) {
|
||||
for (int i = 0; i < code.Count(); i++) {
|
||||
if (code[i].Op == "acc") {
|
||||
continue; // this line can't be the broken one
|
||||
}
|
||||
List<Instruction> repaired = new List<Instruction>(code);
|
||||
if (repaired[i].Op == "nop") {
|
||||
repaired[i] = new Instruction("jmp", repaired[i].Value);
|
||||
} else {
|
||||
repaired[i] = new Instruction("nop", repaired[i].Value);
|
||||
}
|
||||
var (success, result) = new GameConsole().Execute(repaired);
|
||||
if (success) {
|
||||
return result;
|
||||
}
|
||||
}
|
||||
throw new Exception("didn't find a valid instruction to repair");
|
||||
}
|
||||
|
||||
static List<Instruction> ParseInstructions(string[] code) {
|
||||
var result = new List<Instruction>();
|
||||
foreach (string line in code) {
|
||||
string[] tokens = line.Split(' ');
|
||||
result.Add(new Instruction(tokens[0], int.Parse(tokens[1])));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
static int Part1() {
|
||||
string[] input = File.ReadAllLines(Util.RootDir + "day08.txt");
|
||||
List<Instruction> code = ParseInstructions(input);
|
||||
(bool finished, int result) = new GameConsole().Execute(code);
|
||||
return result;
|
||||
}
|
||||
|
||||
static int Part2() {
|
||||
string[] input = File.ReadAllLines(Util.RootDir + "day08.txt");
|
||||
List<Instruction> code = ParseInstructions(input);
|
||||
return RepairBrokenInstruction(code);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public static void Test() {
|
||||
string[] example =
|
||||
@"nop +0
|
||||
acc +1
|
||||
jmp +4
|
||||
acc +3
|
||||
jmp -3
|
||||
acc -99
|
||||
acc +1
|
||||
jmp -4
|
||||
acc +6".Split('\n');
|
||||
List<Instruction> parsed = ParseInstructions(example);
|
||||
Assert.Equal(9, parsed.Count());
|
||||
Assert.Equal((false, 5), new GameConsole().Execute(parsed));
|
||||
Assert.Equal(1610, Part1());
|
||||
|
||||
string[] example2 =
|
||||
@"nop +0
|
||||
acc +1
|
||||
jmp +4
|
||||
acc +3
|
||||
jmp -3
|
||||
acc -99
|
||||
acc +1
|
||||
nop -4
|
||||
acc +6".Split('\n');
|
||||
List<Instruction> parsed2 = ParseInstructions(example2);
|
||||
Assert.Equal((true, 8), new GameConsole().Execute(parsed2));
|
||||
Assert.Equal(1703, Part2());
|
||||
}
|
||||
}
|
||||
}
|
651
2020/day08.txt
Normal file
651
2020/day08.txt
Normal file
@ -0,0 +1,651 @@
|
||||
jmp +1
|
||||
acc -18
|
||||
acc +19
|
||||
acc +19
|
||||
jmp +202
|
||||
acc +15
|
||||
acc +42
|
||||
acc +30
|
||||
acc -7
|
||||
jmp +535
|
||||
acc +31
|
||||
acc +9
|
||||
jmp +581
|
||||
nop +501
|
||||
acc +44
|
||||
acc +18
|
||||
acc -4
|
||||
jmp +545
|
||||
acc +9
|
||||
acc +5
|
||||
nop -2
|
||||
acc +3
|
||||
jmp +475
|
||||
acc -10
|
||||
acc +14
|
||||
acc +29
|
||||
nop +471
|
||||
jmp +470
|
||||
acc +2
|
||||
nop +375
|
||||
acc +31
|
||||
acc +6
|
||||
jmp +420
|
||||
acc -1
|
||||
acc +2
|
||||
nop +185
|
||||
jmp +490
|
||||
acc +2
|
||||
jmp +317
|
||||
nop +282
|
||||
jmp +457
|
||||
acc +37
|
||||
jmp +254
|
||||
acc +19
|
||||
jmp +436
|
||||
jmp +458
|
||||
acc -7
|
||||
acc -2
|
||||
acc -17
|
||||
jmp +454
|
||||
acc +37
|
||||
jmp +212
|
||||
acc +6
|
||||
acc +5
|
||||
acc -7
|
||||
jmp +104
|
||||
acc +5
|
||||
nop +134
|
||||
acc +46
|
||||
jmp +541
|
||||
acc +4
|
||||
acc +46
|
||||
acc +18
|
||||
jmp -53
|
||||
acc +10
|
||||
jmp +285
|
||||
acc +39
|
||||
acc +34
|
||||
nop +109
|
||||
acc +47
|
||||
jmp +32
|
||||
jmp +1
|
||||
jmp +143
|
||||
acc +36
|
||||
jmp +429
|
||||
acc +45
|
||||
acc +22
|
||||
jmp -59
|
||||
acc +0
|
||||
acc +23
|
||||
acc +30
|
||||
acc -7
|
||||
jmp -45
|
||||
acc +46
|
||||
acc +31
|
||||
jmp +164
|
||||
acc +37
|
||||
acc +34
|
||||
acc +40
|
||||
acc -1
|
||||
jmp +246
|
||||
nop -46
|
||||
acc +2
|
||||
acc +31
|
||||
jmp +221
|
||||
nop +413
|
||||
jmp -51
|
||||
acc -14
|
||||
jmp +145
|
||||
acc +1
|
||||
nop +77
|
||||
jmp +131
|
||||
jmp +370
|
||||
nop +513
|
||||
acc +7
|
||||
jmp +476
|
||||
acc +22
|
||||
acc +37
|
||||
acc +44
|
||||
jmp +334
|
||||
acc +9
|
||||
acc -1
|
||||
acc +5
|
||||
acc +27
|
||||
jmp +351
|
||||
acc +31
|
||||
jmp +220
|
||||
nop -61
|
||||
acc +34
|
||||
jmp +504
|
||||
nop +471
|
||||
acc +6
|
||||
acc +48
|
||||
jmp -17
|
||||
jmp +217
|
||||
acc +13
|
||||
acc +0
|
||||
acc +25
|
||||
jmp +144
|
||||
acc -5
|
||||
acc +17
|
||||
nop +341
|
||||
jmp -26
|
||||
acc -10
|
||||
acc +34
|
||||
jmp +168
|
||||
nop -16
|
||||
acc -6
|
||||
acc -10
|
||||
acc +38
|
||||
jmp +30
|
||||
acc -2
|
||||
acc -14
|
||||
jmp +419
|
||||
acc +40
|
||||
acc -17
|
||||
acc +27
|
||||
acc +8
|
||||
jmp +101
|
||||
nop +370
|
||||
acc +2
|
||||
acc -10
|
||||
acc -7
|
||||
jmp +224
|
||||
nop +437
|
||||
acc +42
|
||||
acc +50
|
||||
acc +39
|
||||
jmp +81
|
||||
jmp +11
|
||||
jmp +143
|
||||
acc +6
|
||||
acc +46
|
||||
jmp -107
|
||||
acc +13
|
||||
jmp -109
|
||||
acc +5
|
||||
jmp +1
|
||||
jmp +467
|
||||
jmp -159
|
||||
nop +421
|
||||
jmp +243
|
||||
acc +44
|
||||
nop +412
|
||||
acc -6
|
||||
acc +13
|
||||
jmp +56
|
||||
acc -12
|
||||
acc +18
|
||||
jmp +313
|
||||
nop +151
|
||||
acc +5
|
||||
acc +49
|
||||
jmp +120
|
||||
acc +46
|
||||
acc +23
|
||||
nop -122
|
||||
acc +21
|
||||
jmp -55
|
||||
acc -15
|
||||
jmp -115
|
||||
acc +19
|
||||
nop +116
|
||||
acc +32
|
||||
acc +21
|
||||
jmp +16
|
||||
acc +27
|
||||
acc +32
|
||||
jmp +359
|
||||
acc +16
|
||||
acc +18
|
||||
acc +15
|
||||
jmp +54
|
||||
nop +182
|
||||
acc +4
|
||||
jmp +361
|
||||
acc +4
|
||||
acc +38
|
||||
acc +49
|
||||
jmp -94
|
||||
jmp +428
|
||||
acc +0
|
||||
acc +9
|
||||
jmp +224
|
||||
jmp +82
|
||||
nop +57
|
||||
acc +6
|
||||
jmp +1
|
||||
jmp +144
|
||||
jmp +20
|
||||
jmp +265
|
||||
jmp +402
|
||||
nop +114
|
||||
acc -12
|
||||
acc -11
|
||||
acc +1
|
||||
jmp +412
|
||||
nop -163
|
||||
acc +50
|
||||
acc +1
|
||||
acc -9
|
||||
jmp -20
|
||||
acc +10
|
||||
acc +6
|
||||
jmp +323
|
||||
acc +10
|
||||
jmp +1
|
||||
acc +42
|
||||
jmp +46
|
||||
acc +35
|
||||
acc +31
|
||||
jmp -139
|
||||
jmp +129
|
||||
jmp -193
|
||||
acc -4
|
||||
nop +247
|
||||
nop -163
|
||||
acc +25
|
||||
jmp -26
|
||||
acc +34
|
||||
acc +26
|
||||
acc +40
|
||||
jmp +220
|
||||
acc -6
|
||||
acc +6
|
||||
jmp +311
|
||||
acc +0
|
||||
acc +14
|
||||
acc +41
|
||||
acc +6
|
||||
jmp +284
|
||||
acc +32
|
||||
jmp -13
|
||||
nop +157
|
||||
acc -4
|
||||
acc +47
|
||||
jmp -146
|
||||
acc +34
|
||||
acc +6
|
||||
nop +196
|
||||
acc +5
|
||||
jmp +268
|
||||
acc -8
|
||||
jmp -176
|
||||
acc +34
|
||||
acc +17
|
||||
jmp +1
|
||||
jmp +114
|
||||
acc +32
|
||||
acc +39
|
||||
nop +313
|
||||
acc +38
|
||||
jmp -237
|
||||
jmp -273
|
||||
acc +21
|
||||
acc +26
|
||||
acc +31
|
||||
jmp -231
|
||||
acc +17
|
||||
jmp -105
|
||||
nop +333
|
||||
nop +17
|
||||
jmp +11
|
||||
acc -9
|
||||
acc +2
|
||||
jmp -162
|
||||
acc +3
|
||||
acc +0
|
||||
nop +318
|
||||
jmp +215
|
||||
acc +14
|
||||
acc +32
|
||||
jmp -196
|
||||
jmp +33
|
||||
acc -6
|
||||
acc +45
|
||||
acc +27
|
||||
jmp -166
|
||||
acc -1
|
||||
jmp -25
|
||||
acc +0
|
||||
acc +4
|
||||
acc -14
|
||||
acc +0
|
||||
jmp -115
|
||||
nop +118
|
||||
acc +28
|
||||
nop +175
|
||||
acc +45
|
||||
jmp -97
|
||||
jmp +78
|
||||
jmp -284
|
||||
acc +35
|
||||
nop -248
|
||||
acc -18
|
||||
acc -6
|
||||
jmp -308
|
||||
jmp -95
|
||||
acc -2
|
||||
acc +0
|
||||
jmp +255
|
||||
acc +7
|
||||
jmp -24
|
||||
acc +17
|
||||
acc +20
|
||||
jmp -220
|
||||
jmp +172
|
||||
acc +40
|
||||
acc +39
|
||||
acc +19
|
||||
jmp -238
|
||||
nop +44
|
||||
nop -99
|
||||
nop +238
|
||||
jmp +195
|
||||
acc -14
|
||||
acc +36
|
||||
acc +40
|
||||
acc -11
|
||||
jmp -65
|
||||
nop -54
|
||||
nop +47
|
||||
acc -11
|
||||
jmp +18
|
||||
jmp +98
|
||||
jmp +252
|
||||
nop -1
|
||||
acc +1
|
||||
acc +10
|
||||
jmp -4
|
||||
jmp -319
|
||||
jmp -46
|
||||
acc -8
|
||||
acc +50
|
||||
acc +43
|
||||
jmp -174
|
||||
acc +22
|
||||
acc +4
|
||||
acc +32
|
||||
acc -6
|
||||
jmp +73
|
||||
acc +8
|
||||
jmp -31
|
||||
acc +16
|
||||
nop +11
|
||||
acc +26
|
||||
jmp -98
|
||||
acc -11
|
||||
acc +40
|
||||
jmp +101
|
||||
acc +28
|
||||
acc +30
|
||||
acc -16
|
||||
acc +7
|
||||
jmp +239
|
||||
jmp -179
|
||||
acc +47
|
||||
acc +15
|
||||
acc +42
|
||||
acc +26
|
||||
jmp +30
|
||||
acc +17
|
||||
acc +3
|
||||
acc -5
|
||||
nop -98
|
||||
jmp -236
|
||||
acc +2
|
||||
jmp +196
|
||||
acc +39
|
||||
acc -14
|
||||
acc +36
|
||||
acc +49
|
||||
jmp +189
|
||||
jmp +235
|
||||
acc +27
|
||||
acc -2
|
||||
acc +16
|
||||
acc +40
|
||||
jmp -81
|
||||
acc -5
|
||||
acc +17
|
||||
acc -1
|
||||
jmp +1
|
||||
jmp -129
|
||||
nop -171
|
||||
acc +47
|
||||
jmp +169
|
||||
acc -16
|
||||
acc -5
|
||||
jmp +172
|
||||
nop -84
|
||||
acc +8
|
||||
acc +40
|
||||
acc +43
|
||||
jmp -33
|
||||
acc +39
|
||||
nop -12
|
||||
jmp +53
|
||||
acc +36
|
||||
jmp -270
|
||||
acc +17
|
||||
acc -1
|
||||
jmp -255
|
||||
acc +0
|
||||
acc -12
|
||||
jmp -371
|
||||
jmp -216
|
||||
acc +45
|
||||
acc -18
|
||||
acc +23
|
||||
acc -17
|
||||
jmp -37
|
||||
jmp -386
|
||||
nop -302
|
||||
acc -19
|
||||
acc -16
|
||||
jmp -297
|
||||
acc -18
|
||||
acc -7
|
||||
acc +17
|
||||
acc +17
|
||||
jmp -173
|
||||
jmp +114
|
||||
acc +4
|
||||
acc +19
|
||||
nop -296
|
||||
jmp -36
|
||||
acc -18
|
||||
acc -14
|
||||
acc +6
|
||||
nop -27
|
||||
jmp -101
|
||||
acc +15
|
||||
nop -407
|
||||
jmp +44
|
||||
acc -18
|
||||
acc -6
|
||||
acc +33
|
||||
acc +36
|
||||
jmp +80
|
||||
acc +43
|
||||
jmp +73
|
||||
acc -2
|
||||
acc +7
|
||||
acc +4
|
||||
jmp -10
|
||||
acc +46
|
||||
nop -49
|
||||
acc +7
|
||||
jmp +65
|
||||
acc +24
|
||||
jmp +144
|
||||
acc +13
|
||||
acc +26
|
||||
jmp -351
|
||||
jmp +1
|
||||
acc +34
|
||||
nop +62
|
||||
jmp -363
|
||||
acc -4
|
||||
acc -5
|
||||
jmp +23
|
||||
jmp +82
|
||||
acc -7
|
||||
acc -7
|
||||
acc +15
|
||||
jmp -468
|
||||
acc +7
|
||||
nop -423
|
||||
jmp -178
|
||||
nop -425
|
||||
acc +23
|
||||
jmp -181
|
||||
acc +6
|
||||
acc -11
|
||||
jmp -321
|
||||
acc +3
|
||||
jmp -122
|
||||
acc +12
|
||||
jmp +44
|
||||
acc -5
|
||||
acc -16
|
||||
acc +16
|
||||
jmp -281
|
||||
acc +33
|
||||
acc -4
|
||||
acc +15
|
||||
jmp +9
|
||||
jmp +63
|
||||
acc +35
|
||||
nop -12
|
||||
acc +25
|
||||
acc -10
|
||||
jmp -452
|
||||
acc +1
|
||||
jmp -148
|
||||
acc +8
|
||||
acc +40
|
||||
acc +48
|
||||
jmp +2
|
||||
jmp -315
|
||||
nop -325
|
||||
acc -4
|
||||
acc +16
|
||||
acc -4
|
||||
jmp -369
|
||||
acc +21
|
||||
acc +3
|
||||
jmp -153
|
||||
nop -25
|
||||
acc +0
|
||||
jmp -84
|
||||
acc +32
|
||||
jmp +19
|
||||
acc -18
|
||||
acc -1
|
||||
jmp -385
|
||||
jmp +1
|
||||
jmp -357
|
||||
acc -13
|
||||
acc -13
|
||||
jmp -360
|
||||
jmp -393
|
||||
acc +4
|
||||
nop -102
|
||||
jmp -316
|
||||
jmp -248
|
||||
acc +4
|
||||
nop -487
|
||||
jmp -339
|
||||
acc +3
|
||||
jmp -190
|
||||
acc +24
|
||||
acc +31
|
||||
jmp -166
|
||||
jmp -482
|
||||
acc +22
|
||||
acc +32
|
||||
jmp -290
|
||||
acc +22
|
||||
acc +48
|
||||
acc +5
|
||||
acc -6
|
||||
jmp -330
|
||||
nop -203
|
||||
acc +7
|
||||
acc +1
|
||||
jmp -287
|
||||
acc +15
|
||||
acc +3
|
||||
jmp -230
|
||||
acc +37
|
||||
nop -162
|
||||
jmp +33
|
||||
jmp -147
|
||||
acc +16
|
||||
acc +39
|
||||
acc +49
|
||||
jmp -560
|
||||
acc +26
|
||||
jmp +26
|
||||
jmp -283
|
||||
jmp -486
|
||||
acc -9
|
||||
jmp +1
|
||||
acc +25
|
||||
acc +1
|
||||
jmp -514
|
||||
acc +46
|
||||
jmp -166
|
||||
acc -5
|
||||
acc +35
|
||||
nop -204
|
||||
jmp -175
|
||||
nop -30
|
||||
nop +11
|
||||
jmp -400
|
||||
acc +15
|
||||
acc -7
|
||||
acc -1
|
||||
jmp +18
|
||||
acc +31
|
||||
acc +16
|
||||
acc +43
|
||||
acc +33
|
||||
jmp -260
|
||||
acc +1
|
||||
acc +23
|
||||
acc +25
|
||||
acc -1
|
||||
jmp -200
|
||||
acc -15
|
||||
jmp -314
|
||||
jmp -238
|
||||
jmp -75
|
||||
jmp -192
|
||||
acc +30
|
||||
jmp -525
|
||||
acc -14
|
||||
jmp +17
|
||||
acc +7
|
||||
acc +9
|
||||
acc -6
|
||||
nop -312
|
||||
jmp -559
|
||||
acc +28
|
||||
jmp -305
|
||||
jmp -239
|
||||
acc +0
|
||||
acc -5
|
||||
acc +9
|
||||
jmp -471
|
||||
nop -327
|
||||
acc -5
|
||||
acc -19
|
||||
jmp -496
|
||||
acc +17
|
||||
jmp +1
|
||||
jmp +1
|
||||
acc +29
|
||||
jmp +1
|
Loading…
Reference in New Issue
Block a user