diff --git a/08input.txt b/08input.txt
new file mode 100644
index 0000000..51a4550
--- /dev/null
+++ b/08input.txt
@@ -0,0 +1,635 @@
+acc +13
+jmp +412
+nop +137
+nop +144
+acc +33
+acc -11
+jmp +445
+nop +327
+acc -10
+jmp +1
+jmp +578
+jmp +1
+jmp +415
+acc +25
+acc +21
+jmp +58
+jmp +180
+jmp +96
+nop +190
+acc +20
+jmp +167
+jmp +194
+acc +24
+acc +9
+acc +14
+jmp +1
+jmp +443
+jmp +1
+acc +18
+jmp +465
+jmp +245
+jmp +219
+nop +280
+acc +13
+acc +23
+jmp +133
+jmp +300
+acc +35
+acc +50
+acc +24
+acc +32
+jmp +458
+acc +36
+acc +14
+jmp +103
+nop +262
+jmp +233
+acc +14
+nop +313
+jmp +30
+acc +7
+jmp +324
+acc +12
+jmp +1
+acc +12
+jmp +326
+acc +14
+nop +151
+acc +2
+jmp -14
+jmp +1
+nop +18
+jmp +288
+acc +24
+acc +7
+acc +0
+jmp +268
+jmp +267
+acc +3
+acc +4
+acc +35
+jmp +25
+jmp -16
+acc +14
+acc +38
+acc +41
+jmp +3
+acc -16
+jmp +546
+acc +42
+acc -6
+acc +38
+acc +18
+jmp +391
+acc +45
+jmp +464
+jmp +144
+acc +33
+acc -18
+acc +36
+jmp +313
+jmp +286
+acc +34
+nop -72
+acc -17
+jmp +430
+acc +35
+acc -18
+acc -1
+jmp +75
+acc +48
+acc -2
+jmp -76
+acc -13
+nop +453
+acc +0
+nop +48
+jmp +40
+acc +40
+acc -5
+acc +14
+acc +1
+jmp +323
+acc +16
+acc +17
+nop +408
+acc +22
+jmp +126
+acc +2
+jmp +404
+acc +22
+nop +373
+acc -15
+jmp +134
+nop +242
+jmp +1
+acc +19
+jmp +372
+acc +18
+acc +33
+acc +31
+acc -12
+jmp +417
+acc +27
+acc -4
+jmp +84
+nop -86
+jmp -87
+jmp +174
+acc -19
+acc +17
+nop +353
+jmp +301
+acc +14
+acc -16
+acc +2
+jmp -109
+acc +24
+jmp +366
+acc -8
+acc -14
+acc +20
+acc +38
+jmp -62
+acc +4
+jmp +1
+nop +423
+jmp +33
+acc -19
+acc +50
+jmp -128
+acc +10
+acc +2
+jmp +371
+acc +31
+acc +12
+acc +12
+jmp +337
+acc +42
+acc -19
+jmp +64
+jmp +1
+nop -52
+jmp -19
+acc +34
+jmp +287
+acc -6
+jmp +130
+acc +22
+acc +22
+acc +46
+acc -18
+jmp +190
+acc +13
+acc -18
+acc +26
+jmp +283
+acc +15
+jmp +193
+jmp -168
+nop +165
+acc -3
+acc +26
+jmp -54
+acc -4
+jmp -174
+jmp +96
+acc +44
+acc -18
+acc +8
+acc +23
+jmp -164
+acc -11
+acc -13
+acc +30
+jmp +114
+acc -9
+jmp +386
+acc -15
+jmp +98
+nop -74
+acc +31
+acc -4
+acc +15
+jmp +113
+acc -3
+acc +36
+jmp +362
+jmp +225
+jmp +131
+acc +14
+acc +48
+acc -16
+nop +302
+jmp +383
+acc -14
+jmp +97
+acc +5
+acc -6
+jmp -4
+acc +27
+jmp +165
+acc +49
+jmp +36
+nop -213
+acc +30
+acc +18
+jmp +1
+jmp +54
+nop +73
+nop +185
+acc -4
+jmp -156
+acc +17
+jmp +1
+acc +30
+jmp +357
+nop +60
+jmp +1
+jmp -186
+acc -17
+acc +26
+acc +45
+jmp +74
+acc +27
+acc +1
+jmp -109
+acc +49
+acc +4
+jmp +298
+acc +12
+jmp -42
+acc -16
+jmp -195
+acc +19
+acc -13
+acc +31
+acc +31
+jmp +201
+jmp +274
+jmp +1
+acc +27
+acc +41
+acc +35
+jmp +9
+nop +32
+jmp -190
+acc +2
+jmp +1
+jmp +172
+acc +10
+acc -13
+jmp -95
+acc -10
+acc -12
+acc -4
+jmp +290
+nop -91
+nop +288
+acc +45
+acc +40
+jmp +322
+acc +9
+jmp +314
+acc -10
+acc +3
+nop -62
+acc +46
+jmp +186
+acc +14
+acc +40
+acc +49
+acc +29
+jmp -175
+acc +37
+acc -8
+jmp +254
+jmp +48
+acc +30
+acc +40
+jmp +1
+jmp -172
+acc -9
+acc +42
+nop -269
+jmp -154
+nop +109
+acc +0
+jmp -68
+acc +40
+jmp +310
+acc +4
+jmp +266
+jmp +80
+acc +15
+acc -14
+jmp -206
+acc +17
+jmp +156
+acc -19
+acc +25
+nop +82
+acc +13
+jmp +243
+jmp +259
+jmp +258
+acc +29
+acc +9
+jmp -76
+acc +5
+acc +41
+acc +49
+acc +17
+jmp +161
+acc +29
+nop +215
+jmp +179
+acc +45
+acc +23
+jmp +208
+acc +3
+acc +30
+jmp +38
+nop +204
+jmp -62
+jmp +1
+acc +10
+jmp +78
+acc +32
+acc +29
+jmp -269
+acc +20
+acc +24
+jmp +1
+jmp -114
+jmp +160
+acc -19
+jmp +137
+nop -312
+acc +8
+acc +3
+jmp -181
+jmp +122
+acc +9
+jmp -166
+jmp -106
+jmp +98
+jmp -152
+acc -7
+acc +19
+jmp +180
+jmp +195
+acc -17
+acc +19
+acc +8
+acc +21
+jmp +193
+jmp +226
+acc +5
+jmp +14
+jmp +228
+acc +44
+nop +112
+acc +0
+acc +12
+jmp +223
+acc +21
+nop +87
+acc +32
+acc +42
+jmp -264
+acc +31
+jmp +49
+acc -3
+acc +16
+nop -277
+acc +45
+jmp +50
+acc +0
+acc +7
+nop -223
+acc +11
+jmp +113
+acc +32
+acc +20
+jmp +108
+acc -7
+acc +30
+jmp +66
+acc -12
+acc +34
+acc -9
+acc +39
+jmp +126
+jmp -351
+jmp -89
+jmp -45
+acc +4
+acc +7
+acc -1
+acc +41
+jmp -229
+acc -9
+acc +29
+jmp -115
+acc +27
+acc -11
+jmp +187
+acc -10
+acc +11
+acc +29
+acc +46
+jmp -115
+nop -116
+acc +31
+jmp -202
+acc +12
+jmp +1
+acc +16
+acc +15
+jmp -25
+acc -7
+jmp -439
+acc +10
+acc +26
+acc +13
+jmp -75
+nop -214
+acc +2
+nop -202
+jmp +105
+jmp -65
+acc -15
+acc +6
+jmp +1
+jmp -182
+acc +13
+acc -19
+jmp +26
+acc +20
+acc -16
+acc +14
+jmp -59
+jmp -204
+acc +27
+acc +44
+nop -33
+acc +36
+jmp -300
+acc +48
+acc +28
+acc +29
+acc +39
+jmp -249
+acc +33
+acc +31
+jmp +1
+acc +33
+jmp -269
+acc +8
+acc +31
+acc +10
+acc +5
+jmp -194
+jmp -477
+nop -196
+acc +50
+acc -13
+jmp -47
+nop +77
+acc +45
+jmp -293
+acc +39
+jmp -19
+nop -391
+acc +28
+acc +50
+acc +16
+jmp -209
+acc -1
+acc +39
+acc -17
+nop -233
+jmp -283
+acc +19
+acc +0
+acc +22
+acc +22
+jmp -488
+acc +39
+nop -286
+acc +33
+jmp -23
+jmp -173
+jmp -274
+acc +5
+acc +45
+acc +0
+acc -14
+jmp -342
+acc +16
+acc +28
+nop -155
+jmp -488
+acc +12
+acc +28
+nop -181
+acc +17
+jmp -447
+acc +40
+acc +40
+acc +13
+jmp -38
+acc -12
+nop -494
+acc +43
+jmp -533
+acc +30
+jmp -518
+acc +39
+acc +4
+nop -179
+jmp -127
+acc +31
+acc +42
+acc +17
+jmp -82
+nop -520
+jmp -521
+jmp -193
+acc -8
+jmp -142
+jmp +1
+acc +39
+jmp -532
+acc +30
+acc +3
+acc +22
+nop -84
+jmp +2
+jmp -402
+jmp -468
+acc +0
+acc -4
+acc -19
+jmp -379
+jmp -357
+acc +0
+jmp -159
+acc +13
+acc +24
+acc -3
+acc +0
+jmp -387
+acc +31
+acc +20
+acc +27
+jmp -308
+jmp -161
+acc -6
+nop -163
+acc -3
+jmp -585
+nop -586
+nop -6
+acc +10
+acc +42
+jmp -590
+acc +0
+acc +34
+acc +16
+acc +9
+jmp -175
+acc +29
+jmp -217
+acc +0
+jmp -234
+jmp -47
+acc +28
+acc +0
+acc +25
+acc -5
+jmp -556
+nop -144
+jmp +1
+acc +27
+jmp -117
+jmp -10
+acc +24
+acc -17
+acc +9
+acc +18
+jmp -310
+jmp -455
+nop -437
+jmp -593
+acc +15
+acc +50
+acc -3
+jmp -50
+acc -13
+acc +14
+acc +34
+acc -16
+jmp +1
\ No newline at end of file
diff --git a/2020.csproj b/2020.csproj
index da7fca3..657aef0 100644
--- a/2020.csproj
+++ b/2020.csproj
@@ -6,6 +6,10 @@
_2020
+
+
+
+
PreserveNewest
@@ -28,6 +32,9 @@
PreserveNewest
+
+ PreserveNewest
+
diff --git a/Program.cs b/Program.cs
index ecc7b0b..82eb92a 100644
--- a/Program.cs
+++ b/Program.cs
@@ -11,6 +11,7 @@
Q05.Go();
Q06.Go();
Q07.Go();
+ Q08.Go();
}
}
}
diff --git a/Q08.cs b/Q08.cs
new file mode 100644
index 0000000..d150145
--- /dev/null
+++ b/Q08.cs
@@ -0,0 +1,150 @@
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.IO;
+using System.Linq;
+
+namespace _2020
+{
+ class Q08
+ {
+ static List> instructions = new List>();
+
+ public static void Go()
+ {
+ MakeList();
+ Part1();
+ Part2();
+ }
+
+ static void MakeList()
+ {
+ foreach (var line in File.ReadAllLines("08input.txt"))
+ {
+ var parts = line.Split(' ');
+ if (parts.Count() != 2)
+ {
+ throw new Exception("malformed input");
+ }
+
+ instructions.Add(new Tuple(parts[0], Convert.ToInt32(parts[1])));
+ }
+ }
+
+ static void ProcessInstruction(List> inst, ref int i, ref int accum)
+ {
+ switch (inst[i].Item1)
+ {
+ case "acc":
+ accum += inst[i].Item2;
+ i++;
+ break;
+
+ case "jmp":
+ i += inst[i].Item2;
+ break;
+
+ case "nop":
+ i++;
+ break;
+ }
+ }
+
+ static Tuple RunProgram(List> program)
+ {
+ var accum = 0;
+ var executed = new Dictionary();
+ for (var i = 0; ;)
+ {
+ if (program.Count <= i)
+ {
+ return new Tuple(accum, true);
+ }
+
+ if (executed.ContainsKey(i))
+ {
+ break;
+ }
+
+ executed.Add(i, 1);
+
+ ProcessInstruction(program, ref i, ref accum);
+ }
+
+ return new Tuple(accum, false);
+ }
+
+ static void Part1()
+ {
+ var result = RunProgram(instructions);
+ if (result.Item2)
+ {
+ throw new Exception("Exited normally - shouldn't have");
+ }
+
+ Debug.WriteLine($"Q08Part1: accum value={result.Item1}");
+ }
+
+ static void Part2()
+ {
+ // should probably have used RunProgram here, but ended up replacing the first-encountered instruction instead of
+ // moving through the program and changing the first unchanged instruction i came across. this seemed possibly
+ // more efficient? i don't know.
+
+ bool bExited = false;
+ var instructionToChange = "jmp";
+ var instructionToReplace = "nop";
+ var replacedInstructions = new List();
+ var accum = 0;
+ while (!bExited)
+ {
+ accum = 0;
+ var copy = new List>(instructions);
+ var executed = new Dictionary();
+ bool bChanged = false;
+ for (var i = 0; ;)
+ {
+ if (copy.Count <= i)
+ {
+ bExited = true;
+ break;
+ }
+
+ if (executed.ContainsKey(i))
+ {
+ if (!bChanged)
+ {
+ // this whole section is hacky
+ if (instructionToChange != "jmp")
+ {
+ throw new Exception("nothing worked");
+ }
+
+ Debug.WriteLine($"changing {instructionToChange} to {instructionToReplace} didn't work - flipping");
+ var tmp = instructionToChange;
+ instructionToChange = instructionToReplace;
+ instructionToReplace = tmp;
+
+ replacedInstructions = new List();
+ }
+
+ break;
+ }
+
+ executed.Add(i, 1);
+
+ if (copy[i].Item1 == instructionToChange && !bChanged && !replacedInstructions.Contains(i))
+ {
+ replacedInstructions.Add(i);
+ bChanged = true;
+ copy[i] = new Tuple(instructionToReplace, copy[i].Item2);
+ }
+
+ ProcessInstruction(copy, ref i, ref accum);
+ }
+ }
+
+ Debug.WriteLine($"Q08Part2: accum value={accum}");
+ }
+ }
+}