87 lines
2.5 KiB
C#
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;
|
|
}
|
|
} |