287 lines
5.0 KiB
C#
287 lines
5.0 KiB
C#
using Spectre.Console;
|
|
|
|
namespace AdventOfCode.Days;
|
|
|
|
public class Day10 : Day
|
|
{
|
|
public override int Number => 10;
|
|
public override string Name => "Cathode-Ray Tube";
|
|
public override void RunPart1(bool display = true)
|
|
{
|
|
int cycle = 1;
|
|
int x = 1;
|
|
long sum = 0;
|
|
|
|
// Increment sum when needed
|
|
void IncrementCycle()
|
|
{
|
|
cycle++;
|
|
|
|
// Check for signal stength at the start of a cycle
|
|
if ((cycle + 20) % 40 == 0)
|
|
{
|
|
sum += x * cycle;
|
|
}
|
|
}
|
|
|
|
foreach (var line in Input.ReadAllLines())
|
|
{
|
|
// noop
|
|
if (line == "noop")
|
|
{
|
|
// noop finished, go to next cycle
|
|
IncrementCycle();
|
|
}
|
|
// addx
|
|
else
|
|
{
|
|
var split = line.Split(' ');
|
|
var v = int.Parse(split[1]);
|
|
|
|
// Prepare addx
|
|
IncrementCycle();
|
|
|
|
// addx finished, add to x and then go to next cycle
|
|
x += v;
|
|
IncrementCycle();
|
|
}
|
|
}
|
|
|
|
if (display)
|
|
{
|
|
AnsiConsole.MarkupLine($"[green]Sum of signal strengths: [yellow]{sum}[/][/]");
|
|
}
|
|
}
|
|
|
|
public override void RunPart2(bool display = true)
|
|
{
|
|
// Setup the CRT
|
|
const char litPixel = '#';
|
|
const char darkPixel = '.';
|
|
|
|
const int rowCount = 6;
|
|
const int columnCount = 40;
|
|
var crt = new char[rowCount, columnCount];
|
|
var crtCanvas = new Canvas(columnCount, rowCount);
|
|
|
|
// Now cycle is the position where the CRT is drawing (need to offset by 1 in the grid)
|
|
int cycle = 1;
|
|
// x is the position of the sprite
|
|
int x = 1;
|
|
|
|
// Draw first pixel
|
|
crt[0, 0] = litPixel;
|
|
crtCanvas.SetPixel(0, 0, Color.Red);
|
|
|
|
// Increment sum when needed
|
|
void IncrementCycle()
|
|
{
|
|
cycle++;
|
|
|
|
// We're done drawing the crt
|
|
if (cycle > 240)
|
|
{
|
|
return;
|
|
}
|
|
|
|
// Draw a white or black pixel
|
|
int row = (cycle - 1) / columnCount;
|
|
int column = (cycle - 1) % columnCount;
|
|
|
|
// The CRT is drawing on the sprite
|
|
if (column == x - 1 || column == x || column == x + 1)
|
|
{
|
|
crt[row, column] = litPixel;
|
|
crtCanvas.SetPixel(column, row, (cycle + row) % 2 == 0 ? Color.Green : Color.Red);
|
|
}
|
|
else
|
|
{
|
|
crt[row, column] = darkPixel;
|
|
crtCanvas.SetPixel(column, row, Color.Black);
|
|
}
|
|
}
|
|
|
|
foreach (var line in Input.ReadAllLines())
|
|
{
|
|
// noop
|
|
if (line == "noop")
|
|
{
|
|
// noop finished, go to next cycle
|
|
IncrementCycle();
|
|
}
|
|
// addx
|
|
else
|
|
{
|
|
var split = line.Split(' ');
|
|
var v = int.Parse(split[1]);
|
|
|
|
// Prepare addx
|
|
IncrementCycle();
|
|
|
|
// addx finished, add to x and then go to next cycle
|
|
x += v;
|
|
IncrementCycle();
|
|
}
|
|
}
|
|
|
|
// Print the CRT
|
|
if (display)
|
|
{
|
|
AnsiConsole.Write(crtCanvas);
|
|
}
|
|
}
|
|
|
|
#region Input
|
|
|
|
public const string Input =
|
|
"""
|
|
noop
|
|
noop
|
|
addx 15
|
|
addx -10
|
|
noop
|
|
noop
|
|
addx 3
|
|
noop
|
|
noop
|
|
addx 7
|
|
addx 1
|
|
addx 4
|
|
addx -1
|
|
addx 1
|
|
addx 5
|
|
addx 1
|
|
noop
|
|
noop
|
|
addx 5
|
|
addx -1
|
|
noop
|
|
addx 3
|
|
noop
|
|
addx 3
|
|
addx -38
|
|
noop
|
|
addx 3
|
|
addx 2
|
|
addx 5
|
|
addx 2
|
|
addx 26
|
|
addx -21
|
|
addx -2
|
|
addx 5
|
|
addx 2
|
|
addx -14
|
|
addx 15
|
|
noop
|
|
addx 7
|
|
noop
|
|
addx 2
|
|
addx -22
|
|
addx 23
|
|
addx 2
|
|
addx 5
|
|
addx -40
|
|
noop
|
|
noop
|
|
addx 3
|
|
addx 2
|
|
noop
|
|
addx 24
|
|
addx -19
|
|
noop
|
|
noop
|
|
noop
|
|
addx 5
|
|
addx 5
|
|
addx 2
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
addx 7
|
|
noop
|
|
addx 3
|
|
noop
|
|
addx 3
|
|
addx -2
|
|
addx 2
|
|
addx 5
|
|
addx -38
|
|
noop
|
|
noop
|
|
noop
|
|
addx 5
|
|
addx 2
|
|
addx -1
|
|
addx 2
|
|
addx 30
|
|
addx -23
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
addx 3
|
|
addx 5
|
|
addx -11
|
|
addx 12
|
|
noop
|
|
addx 6
|
|
addx 1
|
|
noop
|
|
addx 4
|
|
addx 3
|
|
noop
|
|
addx -40
|
|
addx 4
|
|
addx 28
|
|
addx -27
|
|
addx 5
|
|
addx 2
|
|
addx 5
|
|
noop
|
|
noop
|
|
addx -2
|
|
addx 2
|
|
addx 5
|
|
addx 3
|
|
noop
|
|
addx 2
|
|
addx -25
|
|
addx 30
|
|
noop
|
|
addx 3
|
|
addx -2
|
|
addx 2
|
|
addx 5
|
|
addx -39
|
|
addx 29
|
|
addx -27
|
|
addx 5
|
|
noop
|
|
noop
|
|
noop
|
|
addx 4
|
|
noop
|
|
addx 1
|
|
addx 2
|
|
addx 5
|
|
addx 2
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
addx 5
|
|
addx 1
|
|
noop
|
|
addx 2
|
|
addx 5
|
|
addx -32
|
|
addx 34
|
|
noop
|
|
noop
|
|
noop
|
|
noop
|
|
""";
|
|
|
|
#endregion
|
|
} |