aoc2021/aoc2021/Day11.cs

62 lines
2.0 KiB
C#

namespace aoc2021;
/// <summary>
/// Day 11: <see href="https://adventofcode.com/2021/day/11"/>
/// </summary>
public sealed class Day11 : Day
{
private int _flashTally;
private readonly int _flashesAfter100, _totalTurns;
private readonly int[][] _octopusField;
public Day11() : base(11, "Dumbo Octopus")
{
_octopusField = Input.Select(line => line.Select(c => int.Parse($"{c}")).ToArray()).ToArray();
while (true)
{
_totalTurns++;
// increment all octopuses
for (var row = 0; row < _octopusField.Length; row++)
for (var col = 0; col < _octopusField[row].Length; col++)
_octopusField[row][col]++;
// flash any that exceeded 10
for (var row = 0; row < _octopusField.Length; row++)
for (var col = 0; col < _octopusField[row].Length; col++)
if (_octopusField[row][col] == 10)
FlashAt(row, col);
var done = true;
for (var row = 0; row < _octopusField.Length; row++)
for (var col = 0; col < _octopusField[row].Length; col++)
if (_octopusField[row][col] == -1)
_octopusField[row][col] = 0;
else
done = false;
if (_totalTurns == 100) _flashesAfter100 = _flashTally;
if (done) break;
}
}
private void FlashAt(int r, int c)
{
_flashTally++;
_octopusField[r][c] = -1;
foreach (var rr in new[] { -1, 0, 1 }.Select(dr => dr + r))
foreach (var cc in new[] { -1, 0, 1 }.Select(dc => dc + c))
if (0 <= rr && rr < _octopusField.Length && 0 <= cc && cc < _octopusField[0].Length && _octopusField[rr][cc] != -1)
{
_octopusField[rr][cc]++;
if (_octopusField[rr][cc] >= 10)
FlashAt(rr, cc);
}
}
public override object Part1() => _flashesAfter100;
public override object Part2() => _totalTurns;
}