AdventOfCode/AoC_2025/Day01.cs

87 lines
2.5 KiB
C#

using System;
using System.IO;
using System.Linq;
using AdvenOfCode.Contracts;
namespace AoC_2025;
public class Day01 : IPuzzleSolver<int>
{
private string[] ParsePuzzleInput(string path)
{
var puzzleInput = File.ReadAllLines(path)
.Where(l => !string.IsNullOrWhiteSpace(l))
.ToArray();
return puzzleInput;
}
public int SolvePart1(string pathToPuzzleInput)
{
var rotationInstructions = ParsePuzzleInput(pathToPuzzleInput);
var dialPosition = 50;
var timesZeroWasHit = 0;
foreach (var rotationAmount in rotationInstructions.Select(ParseRotationAmount))
{
dialPosition = (dialPosition + rotationAmount) % 100;
if (dialPosition == 0)
timesZeroWasHit++;
}
return timesZeroWasHit;
}
public int SolvePart2(string pathToPuzzleInput)
{
var rotationInstructions = ParsePuzzleInput(pathToPuzzleInput);
var dialPosition = 50;
var timesZeroWasHit = 0;
foreach (var rotationAmount in rotationInstructions.Select(ParseRotationAmount))
{
var actualRotationAmount = 0;
if (rotationAmount < 0)
{
(var fullTurns, actualRotationAmount) = DivMod(rotationAmount, -100);
timesZeroWasHit += fullTurns;
if (dialPosition != 0 && dialPosition + actualRotationAmount <= 0)
timesZeroWasHit++;
}
else
{
(var fullTurns, actualRotationAmount) = DivMod(rotationAmount, 100);
timesZeroWasHit += fullTurns;
if (dialPosition + actualRotationAmount >= 100)
timesZeroWasHit++;
}
dialPosition = Mod(dialPosition + actualRotationAmount, 100);
}
return timesZeroWasHit;
}
private (int div, int mod) DivMod(int number, int divisor)
{
return (number / divisor, Mod(number, divisor));
}
private int Mod(int number, int divident)
{
var mod = number % divident;
if (number < 0 && divident > 0)
{
mod = divident + mod;
}
return mod;
}
private static int ParseRotationAmount(string puzzleInput)
{
var direction = puzzleInput[..1];
var rotationAmount = int.Parse(puzzleInput[1..]);
if (direction == "L")
{
rotationAmount *= -1;
}
return rotationAmount;
}
}