Files
AdventOfCode/Days/Day1.cs
2025-01-24 10:19:10 +01:00

64 lines
1.7 KiB
C#

using Spectre.Console;
namespace AdventOfCode.Days;
public class Day1 : Day
{
public override int Number => 1;
public override string Name => "Historian Hysteria";
public override void RunPart1(bool display = true)
{
List<int> leftNumbers = [];
List<int> rightNumbers = [];
foreach (var line in Input.AsSpan().EnumerateLines())
{
var separatorIndex = line.IndexOf(' ');
leftNumbers.Add(int.Parse(line[..separatorIndex]));
rightNumbers.Add(int.Parse(line[(separatorIndex + 1)..]));
}
leftNumbers.Sort();
rightNumbers.Sort();
var totalDistance = leftNumbers.Zip(rightNumbers, (a, b) => Math.Abs(a - b)).Sum();
if (display)
{
AnsiConsole.MarkupLine($"[green]Total distance is: [yellow]{totalDistance}[/][/]");
}
}
public override void RunPart2(bool display = true)
{
List<int> leftNumbers = [];
Dictionary<int, int> rightNumbersCount = [];
var similarityScore = 0;
foreach (var line in Input.AsSpan().EnumerateLines())
{
var separatorIndex = line.IndexOf(' ');
leftNumbers.Add(int.Parse(line[..separatorIndex]));
var rightNumber = int.Parse(line[(separatorIndex + 1)..]);
if (!rightNumbersCount.TryAdd(rightNumber, 1))
{
rightNumbersCount[rightNumber]++;
}
}
foreach (var leftNumber in leftNumbers)
{
similarityScore += leftNumber * rightNumbersCount.GetValueOrDefault(leftNumber);
}
if (display)
{
AnsiConsole.MarkupLine($"[green]Similarity score is: [yellow]{similarityScore}[/][/]");
}
}
}