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}"); + } + } +}