[2k25] Add day 4
This commit is contained in:
156
Days/Day4.cs
Normal file
156
Days/Day4.cs
Normal file
@@ -0,0 +1,156 @@
|
||||
using Spectre.Console;
|
||||
|
||||
namespace AdventOfCode.Days;
|
||||
|
||||
public class Day4 : Day
|
||||
{
|
||||
public override int Number => 4;
|
||||
public override string Name => "Printing Department";
|
||||
|
||||
public const int Length = 136;
|
||||
|
||||
public override void RunPart1(bool display = true)
|
||||
{
|
||||
var accessibleRollsOfPaper = 0;
|
||||
|
||||
var map = ParseMap(Input);
|
||||
|
||||
Span<(int i, int j)> adjacentPositions =
|
||||
[
|
||||
(-1, -1), (-1, 0), (-1, 1),
|
||||
( 0, -1), ( 0, 1),
|
||||
( 1, -1), ( 1, 0), ( 1, 1)
|
||||
];
|
||||
|
||||
for (var i = 0; i < Length; i++)
|
||||
{
|
||||
for (var j = 0; j < Length; j++)
|
||||
{
|
||||
// There is no paper roll at position (i, j)
|
||||
if (!map[i, j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if a paper roll is accessible
|
||||
var adjacentRolls = 0;
|
||||
foreach (var adjacentPosition in adjacentPositions)
|
||||
{
|
||||
var targetI = i + adjacentPosition.i;
|
||||
var targetJ = j + adjacentPosition.j;
|
||||
|
||||
// Check that the adjacent position is not out of bounds
|
||||
if (targetI is < 0 or >= Length || targetJ is < 0 or >= Length)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (map[targetI, targetJ])
|
||||
{
|
||||
adjacentRolls++;
|
||||
}
|
||||
}
|
||||
|
||||
if (adjacentRolls < 4)
|
||||
{
|
||||
accessibleRollsOfPaper++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (display)
|
||||
{
|
||||
AnsiConsole.MarkupLine($"[green]Accessible rolls of paper: [yellow]{accessibleRollsOfPaper}[/][/]");
|
||||
}
|
||||
}
|
||||
|
||||
public override void RunPart2(bool display = true)
|
||||
{
|
||||
var accessibleRollsOfPaper = 0;
|
||||
|
||||
var map = ParseMap(Input);
|
||||
|
||||
Span<(int i, int j)> adjacentPositions =
|
||||
[
|
||||
(-1, -1), (-1, 0), (-1, 1),
|
||||
( 0, -1), ( 0, 1),
|
||||
( 1, -1), ( 1, 0), ( 1, 1)
|
||||
];
|
||||
|
||||
int removedRollsOfPaper;
|
||||
// Loop until we cannot remove any roll anymore
|
||||
do
|
||||
{
|
||||
removedRollsOfPaper = 0;
|
||||
|
||||
for (var i = 0; i < Length; i++)
|
||||
{
|
||||
for (var j = 0; j < Length; j++)
|
||||
{
|
||||
// There is no paper roll at position (i, j)
|
||||
if (!map[i, j])
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
// Check if a paper roll is accessible
|
||||
var adjacentRolls = 0;
|
||||
foreach (var adjacentPosition in adjacentPositions)
|
||||
{
|
||||
var targetI = i + adjacentPosition.i;
|
||||
var targetJ = j + adjacentPosition.j;
|
||||
|
||||
// Check that the adjacent position is not out of bounds
|
||||
if (targetI is < 0 or >= Length || targetJ is < 0 or >= Length)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (map[targetI, targetJ])
|
||||
{
|
||||
adjacentRolls++;
|
||||
}
|
||||
}
|
||||
|
||||
if (adjacentRolls < 4)
|
||||
{
|
||||
removedRollsOfPaper++;
|
||||
|
||||
// Remove roll of paper
|
||||
map[i, j] = false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
accessibleRollsOfPaper += removedRollsOfPaper;
|
||||
} while (removedRollsOfPaper > 0);
|
||||
|
||||
if (display)
|
||||
{
|
||||
AnsiConsole.MarkupLine($"[green]Accessible rolls of paper: [yellow]{accessibleRollsOfPaper}[/][/]");
|
||||
}
|
||||
}
|
||||
|
||||
private static bool[,] ParseMap(string input)
|
||||
{
|
||||
// Map is a square
|
||||
var map = new bool[Length, Length];
|
||||
|
||||
var i = 0;
|
||||
foreach (var line in input.EnumerateLines())
|
||||
{
|
||||
var j = 0;
|
||||
|
||||
foreach (var value in line)
|
||||
{
|
||||
map[i, j] = value is '@';
|
||||
|
||||
j++;
|
||||
}
|
||||
|
||||
i++;
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user