64 lines
1.7 KiB
C#
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}[/][/]");
|
|
}
|
|
}
|
|
} |