From 2d0f5c1937dac134822bf19b603c7b748d893532 Mon Sep 17 00:00:00 2001 From: Amatsugu Date: Sat, 10 Dec 2022 14:23:32 -0500 Subject: [PATCH] Day 10 --- AdventOfCode/AdventOfCode.csproj | 7 + .../Problems/AOC2022/Day10/CathodeCPU.cs | 74 +++++++++ .../Problems/AOC2022/Day10/CathodeRayTube.cs | 56 +++++++ AdventOfCode/Problems/AOC2022/Day10/input.txt | 144 +++++++++++++++++ AdventOfCode/Problems/AOC2022/Day10/sara.txt | 139 +++++++++++++++++ .../Problems/AOC2022/Day10/simple.txt | 3 + AdventOfCode/Problems/AOC2022/Day10/test.txt | 146 ++++++++++++++++++ 7 files changed, 569 insertions(+) create mode 100644 AdventOfCode/Problems/AOC2022/Day10/CathodeCPU.cs create mode 100644 AdventOfCode/Problems/AOC2022/Day10/CathodeRayTube.cs create mode 100644 AdventOfCode/Problems/AOC2022/Day10/input.txt create mode 100644 AdventOfCode/Problems/AOC2022/Day10/sara.txt create mode 100644 AdventOfCode/Problems/AOC2022/Day10/simple.txt create mode 100644 AdventOfCode/Problems/AOC2022/Day10/test.txt diff --git a/AdventOfCode/AdventOfCode.csproj b/AdventOfCode/AdventOfCode.csproj index 0e77297..144fa59 100644 --- a/AdventOfCode/AdventOfCode.csproj +++ b/AdventOfCode/AdventOfCode.csproj @@ -22,6 +22,10 @@ + + + + @@ -32,6 +36,9 @@ + + + diff --git a/AdventOfCode/Problems/AOC2022/Day10/CathodeCPU.cs b/AdventOfCode/Problems/AOC2022/Day10/CathodeCPU.cs new file mode 100644 index 0000000..6903bfa --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/CathodeCPU.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace AdventOfCode.Problems.AOC2022.Day10; +internal class CathodeCPU +{ + public enum Instruction + { + NoOp, + AddX + } + + public int X { get; private set; } = 1; + private int _cycleNumber = 1; + private int _programCounter; + private int _pending = -1; + + public int[] ExecuteCode((Instruction ins, int value)[] code, int[] outputCycles, Func? processor = null) + { + var result = new int[outputCycles.Length]; + + var ridx = 0; + + if (processor == null) + processor = (c, x) => c * x; + + ExecuteCode(code, (c, x) => + { + if (ridx < outputCycles.Length && c == outputCycles[ridx]) + { + result[ridx] = processor(c, x); + ridx++; + } + }); + + return result; + } + public void ExecuteCode((Instruction ins, int value)[] code, Action processor) + { + + while (_programCounter < code.Length) + { + var (ins, value) = code[_programCounter]; + + processor(_cycleNumber, X); + + switch ((ins, _pending)) + { + case { ins: Instruction.NoOp }: + _programCounter++; + break; + case { ins: Instruction.AddX, _pending : -1 }: + _pending = 1; + break; + case { ins: Instruction.AddX, _pending: 0 }: + X += value; + _programCounter++; + break; + } + + + + if(_pending >= 0) + _pending--; + _cycleNumber++; + } + + } + + +} diff --git a/AdventOfCode/Problems/AOC2022/Day10/CathodeRayTube.cs b/AdventOfCode/Problems/AOC2022/Day10/CathodeRayTube.cs new file mode 100644 index 0000000..ade13dd --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/CathodeRayTube.cs @@ -0,0 +1,56 @@ +using AdventOfCode.Runner.Attributes; + +namespace AdventOfCode.Problems.AOC2022.Day10; + +[ProblemInfo(2022, 10, "Cathode-Ray Tube")] +internal class CathodeRayTube : Problem +{ + private (CathodeCPU.Instruction ins, int value)[] _code = Array.Empty<(CathodeCPU.Instruction ins, int value)>(); + + public override void CalculatePart1() + { + var cpu = new CathodeCPU(); + var result = cpu.ExecuteCode(_code, new[] { 20, 60, 100, 140, 180, 220 }); + Part1 = result.Sum(); + } + + public override void CalculatePart2() + { + var output = Enumerable.Repeat(' ', 6 * 40).ToArray(); + + var cpu = new CathodeCPU(); + cpu.ExecuteCode(_code, (cycle, signal) => + { + cycle -= 1; + if (cycle > output.Length) + return; + + + var pos = signal % 40; + var head = (cycle % 40); + var sprite = Math.Abs(pos - head); + if(sprite <= 1) + output[cycle] = '█'; + }); + + var lines = output.Chunk(40).Select(r => new string(r)); + Part2 = $"\n{string.Join("\n", lines)}"; + } + + public override void LoadInput() + { + var lines = ReadInputLines("input.txt"); + _code = new (CathodeCPU.Instruction ins, int value)[lines.Length]; + for (int i = 0; i < lines.Length; i++) + { + var ln = lines[i]; + if (ln == "noop") + _code[i] = (CathodeCPU.Instruction.NoOp, 0); + else + { + var instruction = ln.Split(' '); + _code[i] = (Enum.Parse(instruction[0], true), int.Parse(instruction[1])); + } + } + } +} \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day10/input.txt b/AdventOfCode/Problems/AOC2022/Day10/input.txt new file mode 100644 index 0000000..f4814f8 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/input.txt @@ -0,0 +1,144 @@ +addx 1 +noop +addx 29 +addx -24 +addx 4 +addx 3 +addx -2 +addx 3 +addx 1 +addx 5 +addx 3 +addx -2 +addx 2 +noop +noop +addx 7 +noop +noop +noop +addx 5 +addx 1 +noop +addx -38 +addx 21 +addx 8 +noop +addx -19 +addx -2 +addx 2 +addx 5 +addx 2 +addx -12 +addx 13 +addx 2 +addx 5 +addx 2 +addx -18 +addx 23 +noop +addx -15 +addx 16 +addx 7 +noop +noop +addx -38 +noop +noop +noop +noop +noop +noop +addx 8 +addx 2 +addx 3 +addx -2 +addx 4 +noop +noop +addx 5 +addx 3 +noop +addx 2 +addx 5 +noop +noop +addx -2 +noop +addx 3 +addx 6 +noop +addx -38 +addx -1 +addx 35 +addx -6 +addx -19 +addx -2 +addx 2 +addx 5 +addx 2 +addx 3 +noop +addx 2 +addx 3 +addx -2 +addx 2 +noop +addx -9 +addx 16 +noop +addx 9 +addx -3 +addx -36 +addx -2 +addx 11 +addx 22 +addx -28 +noop +addx 3 +addx 2 +addx 5 +addx 2 +addx 3 +addx -2 +addx 2 +noop +addx 3 +addx 2 +noop +addx -11 +addx 16 +addx 2 +addx 5 +addx -31 +noop +addx -6 +noop +noop +noop +noop +noop +addx 7 +addx 30 +addx -24 +addx -1 +addx 5 +noop +noop +noop +noop +noop +addx 5 +noop +addx 5 +noop +addx 1 +noop +addx 2 +addx 5 +addx 2 +addx 1 +noop +noop +noop +noop \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day10/sara.txt b/AdventOfCode/Problems/AOC2022/Day10/sara.txt new file mode 100644 index 0000000..bda9d87 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/sara.txt @@ -0,0 +1,139 @@ +noop +noop +addx 5 +addx 31 +addx -30 +addx 2 +addx 7 +noop +noop +addx -4 +addx 5 +addx 6 +noop +addx -1 +addx 5 +addx -1 +addx 5 +addx 1 +noop +addx 5 +noop +addx -1 +addx -35 +addx 3 +noop +addx 2 +addx 3 +addx -2 +addx 2 +noop +addx 8 +addx -3 +addx 5 +addx -17 +addx 22 +addx -2 +addx 2 +addx 5 +addx -2 +addx -26 +addx 31 +addx 2 +addx 5 +addx -40 +addx 30 +addx -27 +addx 4 +addx 2 +addx 3 +addx -3 +addx 8 +noop +noop +addx 2 +addx 21 +addx -15 +addx -2 +addx 2 +noop +addx 15 +addx -16 +addx 8 +noop +addx 3 +addx 5 +addx -38 +noop +noop +noop +addx 5 +addx -5 +addx 6 +addx 2 +addx 7 +noop +noop +addx 4 +addx -3 +noop +noop +addx 7 +addx 2 +addx 2 +addx -1 +noop +addx 3 +addx 6 +noop +addx 1 +noop +noop +addx -38 +noop +noop +addx 7 +addx 3 +noop +addx 2 +addx -2 +addx 7 +addx -2 +addx 5 +addx 2 +addx 5 +addx -4 +addx 2 +addx 5 +addx 2 +addx -21 +addx 9 +addx 15 +noop +addx 3 +addx -38 +addx 7 +noop +noop +addx 18 +addx -17 +addx 4 +noop +addx 1 +addx 2 +addx 5 +addx 3 +noop +noop +addx 14 +addx -9 +noop +noop +addx 4 +addx 1 +noop +addx 4 +addx 3 +noop +addx -8 +noop \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day10/simple.txt b/AdventOfCode/Problems/AOC2022/Day10/simple.txt new file mode 100644 index 0000000..cc361e0 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/simple.txt @@ -0,0 +1,3 @@ +noop +addx 3 +addx -5 \ No newline at end of file diff --git a/AdventOfCode/Problems/AOC2022/Day10/test.txt b/AdventOfCode/Problems/AOC2022/Day10/test.txt new file mode 100644 index 0000000..7011a13 --- /dev/null +++ b/AdventOfCode/Problems/AOC2022/Day10/test.txt @@ -0,0 +1,146 @@ +addx 15 +addx -11 +addx 6 +addx -3 +addx 5 +addx -1 +addx -8 +addx 13 +addx 4 +noop +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx 5 +addx -1 +addx -35 +addx 1 +addx 24 +addx -19 +addx 1 +addx 16 +addx -11 +noop +noop +addx 21 +addx -15 +noop +noop +addx -3 +addx 9 +addx 1 +addx -3 +addx 8 +addx 1 +addx 5 +noop +noop +noop +noop +noop +addx -36 +noop +addx 1 +addx 7 +noop +noop +noop +addx 2 +addx 6 +noop +noop +noop +noop +noop +addx 1 +noop +noop +addx 7 +addx 1 +noop +addx -13 +addx 13 +addx 7 +noop +addx 1 +addx -33 +noop +noop +noop +addx 2 +noop +noop +noop +addx 8 +noop +addx -1 +addx 2 +addx 1 +noop +addx 17 +addx -9 +addx 1 +addx 1 +addx -3 +addx 11 +noop +noop +addx 1 +noop +addx 1 +noop +noop +addx -13 +addx -19 +addx 1 +addx 3 +addx 26 +addx -30 +addx 12 +addx -1 +addx 3 +addx 1 +noop +noop +noop +addx -9 +addx 18 +addx 1 +addx 2 +noop +noop +addx 9 +noop +noop +noop +addx -1 +addx 2 +addx -37 +addx 1 +addx 3 +noop +addx 15 +addx -21 +addx 22 +addx -6 +addx 1 +noop +addx 2 +addx 1 +noop +addx -10 +noop +noop +addx 20 +addx 1 +addx 2 +addx 2 +addx -6 +addx -11 +noop +noop +noop \ No newline at end of file