Add day 1

This commit is contained in:
2025-01-24 10:19:10 +01:00
parent 828f9bc3dc
commit 2590458b13
3 changed files with 1031 additions and 1066 deletions

View File

@@ -2,9 +2,10 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net8.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<LangVersion>latest</LangVersion>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -13,8 +14,8 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<None Remove="Inputs\Day1.txt" /> <None Remove="Inputs\*" />
<EmbeddedResource Include="Inputs\Day1.txt" /> <EmbeddedResource Include="Inputs\*" />
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -5,96 +5,60 @@ namespace AdventOfCode.Days;
public class Day1 : Day public class Day1 : Day
{ {
public override int Number => 1; public override int Number => 1;
public override string Name => "Trebuchet?!"; public override string Name => "Historian Hysteria";
private static readonly (string, int)[] WrittenDigits =
[
("one" , 1),
("two" , 2),
("three", 3),
("four" , 4),
("five" , 5),
("six" , 6),
("seven", 7),
("eight", 8),
("nine" , 9)
];
public override void RunPart1(bool display = true) public override void RunPart1(bool display = true)
{ {
var calibrationSum = 0; List<int> leftNumbers = [];
List<int> rightNumbers = [];
foreach (var line in Input.AsSpan().EnumerateLines()) foreach (var line in Input.AsSpan().EnumerateLines())
{ {
var firstDigitIndex = line.IndexOfAnyInRange('0', '9'); var separatorIndex = line.IndexOf(' ');
var lastDigitIndex = line.LastIndexOfAnyInRange('0', '9');
var firstDigit = line[firstDigitIndex] - '0'; leftNumbers.Add(int.Parse(line[..separatorIndex]));
var lastDigit = line[lastDigitIndex] - '0'; rightNumbers.Add(int.Parse(line[(separatorIndex + 1)..]));
calibrationSum += firstDigit * 10 + lastDigit;
} }
leftNumbers.Sort();
rightNumbers.Sort();
var totalDistance = leftNumbers.Zip(rightNumbers, (a, b) => Math.Abs(a - b)).Sum();
if (display) if (display)
{ {
AnsiConsole.MarkupLine($"[green]Sum of calibration values is: [yellow]{calibrationSum}[/][/]"); AnsiConsole.MarkupLine($"[green]Total distance is: [yellow]{totalDistance}[/][/]");
} }
} }
public override void RunPart2(bool display = true) public override void RunPart2(bool display = true)
{ {
var calibrationSum = 0; List<int> leftNumbers = [];
Dictionary<int, int> rightNumbersCount = [];
var similarityScore = 0;
foreach (var line in Input.AsSpan().EnumerateLines()) foreach (var line in Input.AsSpan().EnumerateLines())
{ {
var minFirstDigitIndex = line.IndexOfAnyInRange('0', '9'); var separatorIndex = line.IndexOf(' ');
var maxLastDigitIndex = line.LastIndexOfAnyInRange('0', '9');
var firstDigitValue = 0; leftNumbers.Add(int.Parse(line[..separatorIndex]));
if (minFirstDigitIndex == -1)
{
minFirstDigitIndex = int.MaxValue;
}
else
{
firstDigitValue = line[minFirstDigitIndex] - '0';
}
var lastDigitValue = 0; var rightNumber = int.Parse(line[(separatorIndex + 1)..]);
if (maxLastDigitIndex == -1)
{
maxLastDigitIndex = int.MinValue;
}
else
{
lastDigitValue = line[maxLastDigitIndex] - '0';
}
foreach (var (writtenDigit, value) in WrittenDigits) if (!rightNumbersCount.TryAdd(rightNumber, 1))
{ {
var firstWrittenDigitIndex = line.IndexOf(writtenDigit); rightNumbersCount[rightNumber]++;
if (firstWrittenDigitIndex != -1 && firstWrittenDigitIndex < minFirstDigitIndex)
{
minFirstDigitIndex = firstWrittenDigitIndex;
firstDigitValue = value;
}
var lastWrittenDigitIndex = line.LastIndexOf(writtenDigit);
if (lastWrittenDigitIndex != -1 && lastWrittenDigitIndex > maxLastDigitIndex)
{
maxLastDigitIndex = lastWrittenDigitIndex;
lastDigitValue = value;
} }
} }
calibrationSum += 10 * firstDigitValue + lastDigitValue; foreach (var leftNumber in leftNumbers)
{
similarityScore += leftNumber * rightNumbersCount.GetValueOrDefault(leftNumber);
} }
if (display) if (display)
{ {
AnsiConsole.MarkupLine($"[green]Sum of calibration values is: [yellow]{calibrationSum}[/][/]"); AnsiConsole.MarkupLine($"[green]Similarity score is: [yellow]{similarityScore}[/][/]");
} }
} }
} }

File diff suppressed because it is too large Load Diff