Colin McMillen
3 years ago
2 changed files with 773 additions and 0 deletions
-
1222020/Day08.cs
-
6512020/day08.txt
@ -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()); |
|||
} |
|||
} |
|||
} |
@ -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 |
Write
Preview
Loading…
Cancel
Save
Reference in new issue