Compare commits

14 Commits

Author SHA1 Message Date
31e0259e24 Sync 2025-08-01 06:15:44 +02:00
b68ee2259a AdventOfCode2024 Day04 2024-12-05 01:23:46 +01:00
7a06bc7172 AdventOfCode2024 Day03 Part 2 2024-12-03 12:04:17 +01:00
2662c17c60 AdventOfCode2024 Day03 Part 1 2024-12-03 11:53:06 +01:00
a5173f623d AdventOfCode2024 Day02 2024-12-02 08:21:07 +01:00
f8342dea26 Use target-type new. 2024-12-02 07:55:58 +01:00
e440e7aae1 Apply nullability 2024-12-02 01:37:52 +01:00
dafd2526d1 Code formatting and warning fixing. 2024-12-01 17:36:23 +01:00
9f8d966b7a AdventOfCode2024 Day01 Part 2 2024-12-01 07:55:28 +01:00
39b543346d AdventOfCode2024 Day01 Part 1 2024-12-01 07:49:47 +01:00
c30fc4bf51 Migrate to SLNX solution file format. 2024-12-01 07:40:14 +01:00
c2d956ac88 Add AdventOfCode2024 projects 2024-12-01 07:36:28 +01:00
0571e443b8 WIP 2024-05-20 20:03:04 +02:00
1efbc4acd6 Update to dotnet 8 2024-04-16 23:07:37 +02:00
113 changed files with 3683 additions and 952 deletions

View File

@@ -1,10 +1,9 @@
[*] [*]
# Microsoft .NET properties # Microsoft .NET properties
csharp_indent_braces = false csharp_indent_braces = false
csharp_new_line_before_members_in_object_initializers = false csharp_new_line_before_members_in_object_initializers = false
csharp_new_line_before_open_brace = accessors,anonymous_methods,control_blocks,events,indexers,lambdas,local_functions,methods,properties,types csharp_new_line_before_open_brace = accessors, anonymous_methods, control_blocks, events, indexers, lambdas, local_functions, methods, properties, types
csharp_preferred_modifier_order = private, public, protected, internal, file, new, readonly, abstract, virtual, sealed, static, override, extern, unsafe, volatile, async, required:suggestion csharp_preferred_modifier_order = private, public, protected, internal, file, new, readonly, abstract, virtual, sealed, static, override, extern, unsafe, volatile, async, required:suggestion
csharp_prefer_braces = true:none csharp_prefer_braces = true:none
csharp_preserve_single_line_blocks = true csharp_preserve_single_line_blocks = true

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="DeveloperToolsToolWindowSettingsV1" lastSelectedContentNodeId="base64-encoder-decoder">
<developerToolsConfigurations />
</component>
</project>

View File

@@ -0,0 +1,3 @@
<component name="ProjectDictionaryState">
<dictionary name="var" />
</component>

View File

@@ -1,10 +1,10 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode.Common</RootNamespace>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode.Common</RootNamespace>
</PropertyGroup> </PropertyGroup>
</Project> </Project>

View File

@@ -14,8 +14,8 @@ public static class DayHelper
} }
return null; return null;
} }
public static void RunDay(string eventName, int dayNumber) private static void RunDay(string eventName, int dayNumber)
{ {
Console.WriteLine($"Day {dayNumber:00}"); Console.WriteLine($"Day {dayNumber:00}");
Console.WriteLine("------"); Console.WriteLine("------");
@@ -63,8 +63,8 @@ public static class DayHelper
Console.WriteLine(ex.StackTrace); Console.WriteLine(ex.StackTrace);
} }
} }
public static void RunDay(string eventName) private static void RunDay(string eventName)
{ {
for (int currentDay = 1; currentDay < 25; currentDay++) for (int currentDay = 1; currentDay < 25; currentDay++)
{ {
@@ -74,7 +74,7 @@ public static class DayHelper
Console.WriteLine(string.Empty); Console.WriteLine(string.Empty);
} }
} }
public static void RunDay(string eventName, string[] args) public static void RunDay(string eventName, string[] args)
{ {
if (args.Length > 0) if (args.Length > 0)

View File

@@ -1,73 +0,0 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 16
VisualStudioVersion = 16.0.30711.63
MinimumVisualStudioVersion = 10.0.40219.1
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "AdventOfCode2020", "AdventOfCode2020\AdventOfCode2020.csproj", "{CD1829F6-166D-4F78-AB95-C58916F42494}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2020.Tests", "AdventOfCode2020.Tests\AdventOfCode2020.Tests.csproj", "{2B079D7D-08D4-4FFB-A000-858FFDD945FA}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2017", "AdventOfCode2017\AdventOfCode2017.csproj", "{49C8A67C-D94C-4CFB-B7FB-C19A1A83CA66}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2017.Tests", "AdventOfCode2017.Tests\AdventOfCode2017.Tests.csproj", "{3537CE59-1C57-481B-85F7-3F2A1F0EDE1D}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2018", "AdventOfCode2018\AdventOfCode2018.csproj", "{43DAF84F-369A-48C5-9292-536094336F8F}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2018.Tests", "AdventOfCode2018.Tests\AdventOfCode2018.Tests.csproj", "{EE35694D-97C1-485D-9FFE-73912FA97446}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2023", "AdventOfCode2023\AdventOfCode2023.csproj", "{0D90084C-D2D9-489E-BFC3-5E63AE9947B3}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode2023.Tests", "AdventOfCode2023.Tests\AdventOfCode2023.Tests.csproj", "{00869F26-F53E-451D-BEA2-4E3FFE2216FB}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode.Common", "AdventOfCode.Common\AdventOfCode.Common.csproj", "{D6C2B27F-22C3-49E2-9591-225B7132452D}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{CD1829F6-166D-4F78-AB95-C58916F42494}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{CD1829F6-166D-4F78-AB95-C58916F42494}.Debug|Any CPU.Build.0 = Debug|Any CPU
{CD1829F6-166D-4F78-AB95-C58916F42494}.Release|Any CPU.ActiveCfg = Release|Any CPU
{CD1829F6-166D-4F78-AB95-C58916F42494}.Release|Any CPU.Build.0 = Release|Any CPU
{2B079D7D-08D4-4FFB-A000-858FFDD945FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{2B079D7D-08D4-4FFB-A000-858FFDD945FA}.Debug|Any CPU.Build.0 = Debug|Any CPU
{2B079D7D-08D4-4FFB-A000-858FFDD945FA}.Release|Any CPU.ActiveCfg = Release|Any CPU
{2B079D7D-08D4-4FFB-A000-858FFDD945FA}.Release|Any CPU.Build.0 = Release|Any CPU
{49C8A67C-D94C-4CFB-B7FB-C19A1A83CA66}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{49C8A67C-D94C-4CFB-B7FB-C19A1A83CA66}.Debug|Any CPU.Build.0 = Debug|Any CPU
{49C8A67C-D94C-4CFB-B7FB-C19A1A83CA66}.Release|Any CPU.ActiveCfg = Release|Any CPU
{49C8A67C-D94C-4CFB-B7FB-C19A1A83CA66}.Release|Any CPU.Build.0 = Release|Any CPU
{3537CE59-1C57-481B-85F7-3F2A1F0EDE1D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{3537CE59-1C57-481B-85F7-3F2A1F0EDE1D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{3537CE59-1C57-481B-85F7-3F2A1F0EDE1D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{3537CE59-1C57-481B-85F7-3F2A1F0EDE1D}.Release|Any CPU.Build.0 = Release|Any CPU
{43DAF84F-369A-48C5-9292-536094336F8F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{43DAF84F-369A-48C5-9292-536094336F8F}.Debug|Any CPU.Build.0 = Debug|Any CPU
{43DAF84F-369A-48C5-9292-536094336F8F}.Release|Any CPU.ActiveCfg = Release|Any CPU
{43DAF84F-369A-48C5-9292-536094336F8F}.Release|Any CPU.Build.0 = Release|Any CPU
{EE35694D-97C1-485D-9FFE-73912FA97446}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{EE35694D-97C1-485D-9FFE-73912FA97446}.Debug|Any CPU.Build.0 = Debug|Any CPU
{EE35694D-97C1-485D-9FFE-73912FA97446}.Release|Any CPU.ActiveCfg = Release|Any CPU
{EE35694D-97C1-485D-9FFE-73912FA97446}.Release|Any CPU.Build.0 = Release|Any CPU
{0D90084C-D2D9-489E-BFC3-5E63AE9947B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{0D90084C-D2D9-489E-BFC3-5E63AE9947B3}.Debug|Any CPU.Build.0 = Debug|Any CPU
{0D90084C-D2D9-489E-BFC3-5E63AE9947B3}.Release|Any CPU.ActiveCfg = Release|Any CPU
{0D90084C-D2D9-489E-BFC3-5E63AE9947B3}.Release|Any CPU.Build.0 = Release|Any CPU
{00869F26-F53E-451D-BEA2-4E3FFE2216FB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{00869F26-F53E-451D-BEA2-4E3FFE2216FB}.Debug|Any CPU.Build.0 = Debug|Any CPU
{00869F26-F53E-451D-BEA2-4E3FFE2216FB}.Release|Any CPU.ActiveCfg = Release|Any CPU
{00869F26-F53E-451D-BEA2-4E3FFE2216FB}.Release|Any CPU.Build.0 = Release|Any CPU
{D6C2B27F-22C3-49E2-9591-225B7132452D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D6C2B27F-22C3-49E2-9591-225B7132452D}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D6C2B27F-22C3-49E2-9591-225B7132452D}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D6C2B27F-22C3-49E2-9591-225B7132452D}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {4BAE59D7-7AFF-42B6-A391-CD22CD443B03}
EndGlobalSection
EndGlobal

View File

@@ -6,9 +6,12 @@
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VY/@EntryIndexedValue">VY</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=VY/@EntryIndexedValue">VY</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=Locals/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /&gt;</s:String> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue">&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=61a991a4_002Dd0a3_002D4d19_002D90a5_002Df8f4d75c30c1/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local variables"&gt;&lt;ElementKinds&gt;&lt;Kind Name="LOCAL_VARIABLE" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a0b4bc4d_002Dd13b_002D4a37_002Db37e_002Dc9c6864e4302/@EntryIndexedValue">&lt;Policy&gt;&lt;Descriptor Staticness="Any" AccessRightKinds="Any" Description="Types and namespaces"&gt;&lt;ElementKinds&gt;&lt;Kind Name="NAMESPACE" /&gt;&lt;Kind Name="CLASS" /&gt;&lt;Kind Name="STRUCT" /&gt;&lt;Kind Name="ENUM" /&gt;&lt;Kind Name="DELEGATE" /&gt;&lt;/ElementKinds&gt;&lt;/Descriptor&gt;&lt;Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /&gt;&lt;/Policy&gt;</s:String>
<s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=AdventOfCode_002A_002ETests_003B_002A_003B_002A_003B_002A/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=AdventOfCode_002A_002ETests_003B_002A_003B_002A_003B_002A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=AdventOfCode_002ECommon_003B_002A_003B_002A_003B_002A/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=AdventOfCode_002ECommon_003B_002A_003B_002A_003B_002A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=_002A_003B_002A_003BProgram_003B_002A/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/Environment/Filtering/ExcludeCoverageFilters/=_002A_003B_002A_003BProgram_003B_002A/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/Environment/SettingsMigration/IsMigratorApplied/=JetBrains_002EReSharper_002EPsi_002ECSharp_002ECodeStyle_002ESettingsUpgrade_002EPredefinedNamingRulesToUserRulesUpgrade/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Chrono/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Chrono/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=Extrapolator/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=Extrapolator/@EntryIndexedValue">True</s:Boolean>
<s:Boolean x:Key="/Default/UserDictionary/Words/=extrapolators/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary> <s:Boolean x:Key="/Default/UserDictionary/Words/=extrapolators/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>

13
AdventOfCode.slnx Normal file
View File

@@ -0,0 +1,13 @@
<Solution>
<Project Path="AdventOfCode.Common\AdventOfCode.Common.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2017.Tests\AdventOfCode2017.Tests.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2017\AdventOfCode2017.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2018.Tests\AdventOfCode2018.Tests.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2018\AdventOfCode2018.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2020.Tests\AdventOfCode2020.Tests.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2020\AdventOfCode2020.csproj"/>
<Project Path="AdventOfCode2023.Tests\AdventOfCode2023.Tests.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2023\AdventOfCode2023.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2024.Tests\AdventOfCode2024.Tests.csproj" Type="Classic C#"/>
<Project Path="AdventOfCode2024\AdventOfCode2024.csproj" Type="Classic C#"/>
</Solution>

View File

@@ -1,24 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2017.Tests</RootNamespace> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2017.Tests</RootNamespace>
<IsPackable>false</IsPackable>
</PropertyGroup>
<ItemGroup> <IsPackable>false</IsPackable>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <IsTestProject>true</IsTestProject>
<PackageReference Include="xunit" Version="2.6.3" /> </PropertyGroup>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode2017\AdventOfCode2017.csproj" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
</ItemGroup> <PackageReference Include="xunit" Version="2.6.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AdventOfCode2017\AdventOfCode2017.csproj"/>
</ItemGroup>
</Project> </Project>

View File

@@ -9,7 +9,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "1122", }); string result = day01.ResolvePart1(["1122"]);
Assert.Equal("3", result); Assert.Equal("3", result);
} }
@@ -19,7 +19,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "1111", }); string result = day01.ResolvePart1(["1111"]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }
@@ -29,7 +29,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "1234", }); string result = day01.ResolvePart1(["1234"]);
Assert.Equal("0", result); Assert.Equal("0", result);
} }
@@ -39,7 +39,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "91212129", }); string result = day01.ResolvePart1(["91212129"]);
Assert.Equal("9", result); Assert.Equal("9", result);
} }
@@ -47,13 +47,13 @@ public class Day01_Tests
#endregion ResolvePart1 #endregion ResolvePart1
#region ResolvePart2 #region ResolvePart2
[Fact] [Fact]
public void ResolvePart2__Test1() public void ResolvePart2__Test1()
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "1212", }); string result = day01.ResolvePart2(["1212"]);
Assert.Equal("6", result); Assert.Equal("6", result);
} }
@@ -63,7 +63,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "1221", }); string result = day01.ResolvePart2(["1221"]);
Assert.Equal("0", result); Assert.Equal("0", result);
} }
@@ -73,7 +73,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "123425", }); string result = day01.ResolvePart2(["123425"]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }
@@ -83,7 +83,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "123123", }); string result = day01.ResolvePart2(["123123"]);
Assert.Equal("12", result); Assert.Equal("12", result);
} }
@@ -93,7 +93,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "12131415", }); string result = day01.ResolvePart2(["12131415"]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }

View File

@@ -7,11 +7,11 @@ public class Day02_Tests
{ {
Day02 day02 = new(); Day02 day02 = new();
string result = day02.ResolvePart1(new[] { string result = day02.ResolvePart1([
"5 1 9 5", "5 1 9 5",
"7 5 3", "7 5 3",
"2 4 6 8", "2 4 6 8",
}); ]);
Assert.Equal("18", result); Assert.Equal("18", result);
} }
@@ -21,11 +21,11 @@ public class Day02_Tests
{ {
Day02 day02 = new(); Day02 day02 = new();
string result = day02.ResolvePart2(new[] { string result = day02.ResolvePart2([
"5 9 2 8", "5 9 2 8",
"9 4 7 3", "9 4 7 3",
"3 8 6 5", "3 8 6 5",
}); ]);
Assert.Equal("9", result); Assert.Equal("9", result);
} }

View File

@@ -1,5 +0,0 @@
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="MSTest.TestAdapter" version="1.3.2" targetFramework="net461" />
<package id="MSTest.TestFramework" version="1.3.2" targetFramework="net461" />
</packages>

View File

@@ -1,20 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2017</RootNamespace> <Nullable>enable</Nullable>
</PropertyGroup> <RootNamespace>AdventOfCode2017</RootNamespace>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<None Update="inputs\*"> <None Update="inputs\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" /> <ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -48,10 +48,10 @@ public class Day01 : IDay
{ {
string input = inputs[0]; string input = inputs[0];
int value = 0; int value = 0;
for(int i = 0; i < input.Length; i++) for (int i = 0; i < input.Length; i++)
{ {
int nextI = (i + 1) % input.Length; int nextI = (i + 1) % input.Length;
if(input[i] == input[nextI]) if (input[i] == input[nextI])
{ {
value += (input[i] - '0'); value += (input[i] - '0');
} }

View File

@@ -51,10 +51,10 @@ public class Day02 : IDay
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
int checksum = 0; int checksum = 0;
foreach(string input in inputs) foreach (string input in inputs)
{ {
int[] row = input int[] row = input
.Split(new[] { " ", " " }, StringSplitOptions.RemoveEmptyEntries) .Split([" ", " "], StringSplitOptions.RemoveEmptyEntries)
.Select(cell => Convert.ToInt32(cell)) .Select(cell => Convert.ToInt32(cell))
.ToArray(); .ToArray();
int max = row.Max(); int max = row.Max();
@@ -70,7 +70,7 @@ public class Day02 : IDay
foreach (string input in inputs) foreach (string input in inputs)
{ {
int[] row = input int[] row = input
.Split(new[] { " ", " " }, StringSplitOptions.RemoveEmptyEntries) .Split([" ", " "], StringSplitOptions.RemoveEmptyEntries)
.Select(cell => Convert.ToInt32(cell)) .Select(cell => Convert.ToInt32(cell))
.ToArray(); .ToArray();

View File

@@ -30,11 +30,11 @@ public class Day03 : IDay
{ {
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
return null; return string.Empty;
} }
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
return null; return string.Empty;
} }
} }

View File

@@ -1,24 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2018.Tests</RootNamespace> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2018.Tests</RootNamespace>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> <IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
<PackageReference Include="xunit" Version="2.6.3" /> <PackageReference Include="xunit" Version="2.6.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.5.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode2018\AdventOfCode2018.csproj" /> <ProjectReference Include="..\AdventOfCode2018\AdventOfCode2018.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -9,7 +9,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "+1", "-2", "+3", "+1", }); string result = day01.ResolvePart1(["+1", "-2", "+3", "+1"]);
Assert.Equal("3", result); Assert.Equal("3", result);
} }
@@ -19,7 +19,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "+1", "+1", "+1", }); string result = day01.ResolvePart1(["+1", "+1", "+1"]);
Assert.Equal("3", result); Assert.Equal("3", result);
} }
@@ -29,7 +29,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "+1", "+1", "-2", }); string result = day01.ResolvePart1(["+1", "+1", "-2"]);
Assert.Equal("0", result); Assert.Equal("0", result);
} }
@@ -39,7 +39,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart1(new[] { "-1", "-2", "-3", }); string result = day01.ResolvePart1(["-1", "-2", "-3"]);
Assert.Equal("-6", result); Assert.Equal("-6", result);
} }
@@ -53,7 +53,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "+1", "-2", "+3", "+1", }); string result = day01.ResolvePart2(["+1", "-2", "+3", "+1"]);
Assert.Equal("2", result); Assert.Equal("2", result);
} }
@@ -63,7 +63,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "+1", "-1", }); string result = day01.ResolvePart2(["+1", "-1"]);
Assert.Equal("0", result); Assert.Equal("0", result);
} }
@@ -73,7 +73,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "+3", "+3", "+4", "-2", "-4", }); string result = day01.ResolvePart2(["+3", "+3", "+4", "-2", "-4"]);
Assert.Equal("10", result); Assert.Equal("10", result);
} }
@@ -83,7 +83,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "-6", "+3", "+8", "+5", "-6", }); string result = day01.ResolvePart2(["-6", "+3", "+8", "+5", "-6"]);
Assert.Equal("5", result); Assert.Equal("5", result);
} }
@@ -93,7 +93,7 @@ public class Day01_Tests
{ {
Day01 day01 = new(); Day01 day01 = new();
string result = day01.ResolvePart2(new[] { "+7", "+7", "-2", "-7", "-4", }); string result = day01.ResolvePart2(["+7", "+7", "-2", "-7", "-4"]);
Assert.Equal("14", result); Assert.Equal("14", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day02_Tests
{ {
Day02 day02 = new(); Day02 day02 = new();
string result = day02.ResolvePart1(new[] { string result = day02.ResolvePart1([
"abcdef", "abcdef",
"bababc", "bababc",
"abbcde", "abbcde",
@@ -15,7 +15,7 @@ public class Day02_Tests
"aabcdd", "aabcdd",
"abcdee", "abcdee",
"ababab", "ababab",
}); ]);
Assert.Equal("12", result); Assert.Equal("12", result);
} }
@@ -25,7 +25,7 @@ public class Day02_Tests
{ {
Day02 day02 = new(); Day02 day02 = new();
string result = day02.ResolvePart2(new[] { string result = day02.ResolvePart2([
"abcde", "abcde",
"fghij", "fghij",
"klmno", "klmno",
@@ -33,7 +33,7 @@ public class Day02_Tests
"fguij", "fguij",
"axcye", "axcye",
"wvxyz", "wvxyz",
}); ]);
Assert.Equal("fgij", result); Assert.Equal("fgij", result);
} }

View File

@@ -90,17 +90,17 @@ public class Day03_Tests
} }
#endregion Claim_Overlaps #endregion Claim_Overlaps
[Fact] [Fact]
public void ResolvePart1__Test() public void ResolvePart1__Test()
{ {
Day03 day03 = new(); Day03 day03 = new();
string result = day03.ResolvePart1(new[] { string result = day03.ResolvePart1([
"#1 @ 1,3: 4x4", "#1 @ 1,3: 4x4",
"#2 @ 3,1: 4x4", "#2 @ 3,1: 4x4",
"#3 @ 5,5: 2x2", "#3 @ 5,5: 2x2",
}); ]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }
@@ -110,11 +110,11 @@ public class Day03_Tests
{ {
Day03 day03 = new(); Day03 day03 = new();
string result = day03.ResolvePart2(new[] { string result = day03.ResolvePart2([
"#1 @ 1,3: 4x4", "#1 @ 1,3: 4x4",
"#2 @ 3,1: 4x4", "#2 @ 3,1: 4x4",
"#3 @ 5,5: 2x2", "#3 @ 5,5: 2x2",
}); ]);
Assert.Equal("3", result); Assert.Equal("3", result);
} }

View File

@@ -50,7 +50,7 @@ public class Day04_Tests
[Fact] [Fact]
public void GuardEvent_FromStringArray__TestBase() public void GuardEvent_FromStringArray__TestBase()
{ {
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray(new[] { List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray([
"[1518-11-01 00:00] Guard #10 begins shift", "[1518-11-01 00:00] Guard #10 begins shift",
"[1518-11-01 00:05] falls asleep", "[1518-11-01 00:05] falls asleep",
"[1518-11-01 00:25] wakes up", "[1518-11-01 00:25] wakes up",
@@ -59,7 +59,7 @@ public class Day04_Tests
"[1518-11-01 23:58] Guard #99 begins shift", "[1518-11-01 23:58] Guard #99 begins shift",
"[1518-11-02 00:40] falls asleep", "[1518-11-02 00:40] falls asleep",
"[1518-11-02 00:50] wakes up", "[1518-11-02 00:50] wakes up",
}); ]);
Assert.Equal(10, guardEvents[0].ID); Assert.Equal(10, guardEvents[0].ID);
Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type); Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type);
@@ -89,7 +89,7 @@ public class Day04_Tests
[Fact] [Fact]
public void GuardEvent_FromStringArray__TestBaseUnsorted() public void GuardEvent_FromStringArray__TestBaseUnsorted()
{ {
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray(new[] { List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray([
"[1518-11-01 00:00] Guard #10 begins shift", "[1518-11-01 00:00] Guard #10 begins shift",
"[1518-11-01 23:58] Guard #99 begins shift", "[1518-11-01 23:58] Guard #99 begins shift",
"[1518-11-01 00:30] falls asleep", "[1518-11-01 00:30] falls asleep",
@@ -98,7 +98,7 @@ public class Day04_Tests
"[1518-11-02 00:50] wakes up", "[1518-11-02 00:50] wakes up",
"[1518-11-01 00:55] wakes up", "[1518-11-01 00:55] wakes up",
"[1518-11-01 00:25] wakes up", "[1518-11-01 00:25] wakes up",
}); ]);
Assert.Equal(10, guardEvents[0].ID); Assert.Equal(10, guardEvents[0].ID);
Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type); Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type);
@@ -126,13 +126,13 @@ public class Day04_Tests
} }
#endregion GuardEvent_FromStringArray #endregion GuardEvent_FromStringArray
[Fact] [Fact]
public void ResolvePart1__BaseStatement() public void ResolvePart1__BaseStatement()
{ {
Day04 day04 = new(); Day04 day04 = new();
string result = day04.ResolvePart1(new[] { string result = day04.ResolvePart1([
"[1518-11-01 00:00] Guard #10 begins shift", "[1518-11-01 00:00] Guard #10 begins shift",
"[1518-11-01 00:05] falls asleep", "[1518-11-01 00:05] falls asleep",
"[1518-11-01 00:25] wakes up", "[1518-11-01 00:25] wakes up",
@@ -150,7 +150,7 @@ public class Day04_Tests
"[1518-11-05 00:03] Guard #99 begins shift", "[1518-11-05 00:03] Guard #99 begins shift",
"[1518-11-05 00:45] falls asleep", "[1518-11-05 00:45] falls asleep",
"[1518-11-05 00:55] wakes up", "[1518-11-05 00:55] wakes up",
}); ]);
Assert.Equal("240", result); Assert.Equal("240", result);
} }
@@ -160,7 +160,7 @@ public class Day04_Tests
{ {
Day04 day04 = new(); Day04 day04 = new();
string result = day04.ResolvePart1(new[] { string result = day04.ResolvePart1([
"[1518-11-04 00:36] falls asleep", "[1518-11-04 00:36] falls asleep",
"[1518-11-04 00:46] wakes up", "[1518-11-04 00:46] wakes up",
"[1518-11-05 00:03] Guard #99 begins shift", "[1518-11-05 00:03] Guard #99 begins shift",
@@ -178,7 +178,7 @@ public class Day04_Tests
"[1518-11-01 00:55] wakes up", "[1518-11-01 00:55] wakes up",
"[1518-11-01 23:58] Guard #99 begins shift", "[1518-11-01 23:58] Guard #99 begins shift",
"[1518-11-05 00:55] wakes up", "[1518-11-05 00:55] wakes up",
}); ]);
Assert.Equal("240", result); Assert.Equal("240", result);
} }
@@ -189,7 +189,7 @@ public class Day04_Tests
{ {
Day04 day04 = new(); Day04 day04 = new();
string result = day04.ResolvePart2(new[] { string result = day04.ResolvePart2([
"[1518-11-01 00:00] Guard #10 begins shift", "[1518-11-01 00:00] Guard #10 begins shift",
"[1518-11-01 00:05] falls asleep", "[1518-11-01 00:05] falls asleep",
"[1518-11-01 00:25] wakes up", "[1518-11-01 00:25] wakes up",
@@ -207,7 +207,7 @@ public class Day04_Tests
"[1518-11-05 00:03] Guard #99 begins shift", "[1518-11-05 00:03] Guard #99 begins shift",
"[1518-11-05 00:45] falls asleep", "[1518-11-05 00:45] falls asleep",
"[1518-11-05 00:55] wakes up", "[1518-11-05 00:55] wakes up",
}); ]);
Assert.Equal("4455", result); Assert.Equal("4455", result);
} }
@@ -217,7 +217,7 @@ public class Day04_Tests
{ {
Day04 day04 = new(); Day04 day04 = new();
string result = day04.ResolvePart2(new[] { string result = day04.ResolvePart2([
"[1518-11-04 00:36] falls asleep", "[1518-11-04 00:36] falls asleep",
"[1518-11-04 00:46] wakes up", "[1518-11-04 00:46] wakes up",
"[1518-11-05 00:03] Guard #99 begins shift", "[1518-11-05 00:03] Guard #99 begins shift",
@@ -235,7 +235,7 @@ public class Day04_Tests
"[1518-11-01 00:55] wakes up", "[1518-11-01 00:55] wakes up",
"[1518-11-01 23:58] Guard #99 begins shift", "[1518-11-01 23:58] Guard #99 begins shift",
"[1518-11-05 00:55] wakes up", "[1518-11-05 00:55] wakes up",
}); ]);
Assert.Equal("4455", result); Assert.Equal("4455", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day05_Tests
{ {
Day05 day05 = new(); Day05 day05 = new();
string result = day05.ResolvePart1(new[] { "dabAcCaCBAcCcaDA" }); string result = day05.ResolvePart1(["dabAcCaCBAcCcaDA"]);
Assert.Equal("10", result); Assert.Equal("10", result);
} }
@@ -17,7 +17,7 @@ public class Day05_Tests
{ {
Day05 day05 = new(); Day05 day05 = new();
string result = day05.ResolvePart2(new[] { "dabAcCaCBAcCcaDA" }); string result = day05.ResolvePart2(["dabAcCaCBAcCcaDA"]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }

View File

@@ -7,28 +7,28 @@ public class Day06_Tests
[Fact] [Fact]
public void ChronoPoint_FromString__Test1() public void ChronoPoint_FromString__Test1()
{ {
Day06.ChronoPoint point = Day06.ChronoPoint.FromString("1, 1"); Day06.ChronoPoint? point = Day06.ChronoPoint.FromString("1, 1");
Assert.Equal(1, point.X); Assert.Equal(1, point?.X);
Assert.Equal(1, point.Y); Assert.Equal(1, point?.Y);
} }
[Fact] [Fact]
public void ChronoPoint_FromString__Test2() public void ChronoPoint_FromString__Test2()
{ {
Day06.ChronoPoint point = Day06.ChronoPoint.FromString("1, 6"); Day06.ChronoPoint? point = Day06.ChronoPoint.FromString("1, 6");
Assert.Equal(1, point.X); Assert.Equal(1, point?.X);
Assert.Equal(6, point.Y); Assert.Equal(6, point?.Y);
} }
[Fact] [Fact]
public void ChronoPoint_FromString__Test3() public void ChronoPoint_FromString__Test3()
{ {
Day06.ChronoPoint point = Day06.ChronoPoint.FromString("8, 9"); Day06.ChronoPoint? point = Day06.ChronoPoint.FromString("8, 9");
Assert.Equal(8, point.X); Assert.Equal(8, point?.X);
Assert.Equal(9, point.Y); Assert.Equal(9, point?.Y);
} }
#endregion ChronoPoint_FromString #endregion ChronoPoint_FromString
@@ -38,9 +38,12 @@ public class Day06_Tests
[Fact] [Fact]
public void ChronoPoint_ManhattanDistance__Test1() public void ChronoPoint_ManhattanDistance__Test1()
{ {
Day06.ChronoPoint p0 = Day06.ChronoPoint.FromString("8, 9"); Day06.ChronoPoint? p0 = Day06.ChronoPoint.FromString("8, 9");
Day06.ChronoPoint p1 = Day06.ChronoPoint.FromString("1, 6"); Day06.ChronoPoint? p1 = Day06.ChronoPoint.FromString("1, 6");
Assert.NotNull(p0);
Assert.NotNull(p1);
int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1); int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1);
Assert.Equal(10, distance); Assert.Equal(10, distance);
@@ -49,9 +52,12 @@ public class Day06_Tests
[Fact] [Fact]
public void ChronoPoint_ManhattanDistance__Test2() public void ChronoPoint_ManhattanDistance__Test2()
{ {
Day06.ChronoPoint p0 = Day06.ChronoPoint.FromString("1, 1"); Day06.ChronoPoint? p0 = Day06.ChronoPoint.FromString("1, 1");
Day06.ChronoPoint p1 = Day06.ChronoPoint.FromString("1, 6"); Day06.ChronoPoint? p1 = Day06.ChronoPoint.FromString("1, 6");
Assert.NotNull(p0);
Assert.NotNull(p1);
int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1); int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1);
Assert.Equal(5, distance); Assert.Equal(5, distance);
@@ -64,14 +70,14 @@ public class Day06_Tests
{ {
Day06 day06 = new(); Day06 day06 = new();
string result = day06.ResolvePart1(new[] { string result = day06.ResolvePart1([
"1, 1", "1, 1",
"1, 6", "1, 6",
"8, 3", "8, 3",
"3, 4", "3, 4",
"5, 5", "5, 5",
"8, 9", "8, 9",
}); ]);
Assert.Equal("17", result); Assert.Equal("17", result);
} }
@@ -79,16 +85,16 @@ public class Day06_Tests
[Fact] [Fact]
public void ResolvePart2__Test() public void ResolvePart2__Test()
{ {
Day06 day06 = new() { DistanceThresold = 32, }; Day06 day06 = new() { DistanceThreshold = 32, };
string result = day06.ResolvePart2(new[] { string result = day06.ResolvePart2([
"1, 1", "1, 1",
"1, 6", "1, 6",
"8, 3", "8, 3",
"3, 4", "3, 4",
"5, 5", "5, 5",
"8, 9", "8, 9",
}); ]);
Assert.Equal("16", result); Assert.Equal("16", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day07_Tests
{ {
Day07 day07 = new(); Day07 day07 = new();
string result = day07.ResolvePart1(new[] { string result = day07.ResolvePart1([
"Step C must be finished before step A can begin.", "Step C must be finished before step A can begin.",
"Step C must be finished before step F can begin.", "Step C must be finished before step F can begin.",
"Step A must be finished before step B can begin.", "Step A must be finished before step B can begin.",
@@ -15,7 +15,7 @@ public class Day07_Tests
"Step B must be finished before step E can begin.", "Step B must be finished before step E can begin.",
"Step D must be finished before step E can begin.", "Step D must be finished before step E can begin.",
"Step F must be finished before step E can begin.", "Step F must be finished before step E can begin.",
}); ]);
Assert.Equal("CABDFE", result); Assert.Equal("CABDFE", result);
} }
@@ -25,7 +25,7 @@ public class Day07_Tests
{ {
Day07 day07 = new() { BaseCost = 0, NumberOfWorkers = 2 }; Day07 day07 = new() { BaseCost = 0, NumberOfWorkers = 2 };
string result = day07.ResolvePart2(new[] { string result = day07.ResolvePart2([
"Step C must be finished before step A can begin.", "Step C must be finished before step A can begin.",
"Step C must be finished before step F can begin.", "Step C must be finished before step F can begin.",
"Step A must be finished before step B can begin.", "Step A must be finished before step B can begin.",
@@ -33,7 +33,7 @@ public class Day07_Tests
"Step B must be finished before step E can begin.", "Step B must be finished before step E can begin.",
"Step D must be finished before step E can begin.", "Step D must be finished before step E can begin.",
"Step F must be finished before step E can begin.", "Step F must be finished before step E can begin.",
}); ]);
Assert.Equal("15", result); Assert.Equal("15", result);
} }

View File

@@ -28,13 +28,13 @@ public class Day08_Tests
Assert.Single(result.Childs[1].Childs[0].Metadata); Assert.Single(result.Childs[1].Childs[0].Metadata);
Assert.Equal(99, result.Childs[1].Childs[0].Metadata[0]); Assert.Equal(99, result.Childs[1].Childs[0].Metadata[0]);
} }
[Fact] [Fact]
public void ResolvePart1__Test() public void ResolvePart1__Test()
{ {
Day08 day = new(); Day08 day = new();
string result = day.ResolvePart1(new[] { "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2", }); string result = day.ResolvePart1(["2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"]);
Assert.Equal("138", result); Assert.Equal("138", result);
} }
@@ -44,7 +44,7 @@ public class Day08_Tests
{ {
Day08 day = new(); Day08 day = new();
string result = day.ResolvePart2(new[] { "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2", }); string result = day.ResolvePart2(["2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"]);
Assert.Equal("66", result); Assert.Equal("66", result);
} }

View File

@@ -3,7 +3,7 @@
public class Day09_Tests public class Day09_Tests
{ {
#region MarbleGame_PlayGame #region MarbleGame_PlayGame
[Fact] [Fact]
public void MarbleGame_PlayGame__Test1() public void MarbleGame_PlayGame__Test1()
{ {
@@ -69,15 +69,15 @@ public class Day09_Tests
Assert.Equal(37305, highScore); Assert.Equal(37305, highScore);
} }
#endregion MarbleGame_PlayGame #endregion MarbleGame_PlayGame
[Fact] [Fact]
public void ResolvePart1__Test1() public void ResolvePart1__Test1()
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "9 players; last marble is worth 25 points" }); string result = day.ResolvePart1(["9 players; last marble is worth 25 points"]);
Assert.Equal("32", result); Assert.Equal("32", result);
} }
@@ -87,7 +87,7 @@ public class Day09_Tests
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "10 players; last marble is worth 1618 points" }); string result = day.ResolvePart1(["10 players; last marble is worth 1618 points"]);
Assert.Equal("8317", result); Assert.Equal("8317", result);
} }
@@ -97,7 +97,7 @@ public class Day09_Tests
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "13 players; last marble is worth 7999 points" }); string result = day.ResolvePart1(["13 players; last marble is worth 7999 points"]);
Assert.Equal("146373", result); Assert.Equal("146373", result);
} }
@@ -107,7 +107,7 @@ public class Day09_Tests
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "17 players; last marble is worth 1104 points" }); string result = day.ResolvePart1(["17 players; last marble is worth 1104 points"]);
Assert.Equal("2764", result); Assert.Equal("2764", result);
} }
@@ -117,7 +117,7 @@ public class Day09_Tests
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "21 players; last marble is worth 6111 points" }); string result = day.ResolvePart1(["21 players; last marble is worth 6111 points"]);
Assert.Equal("54718", result); Assert.Equal("54718", result);
} }
@@ -127,7 +127,7 @@ public class Day09_Tests
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(new[] { "30 players; last marble is worth 5807 points" }); string result = day.ResolvePart1(["30 players; last marble is worth 5807 points"]);
Assert.Equal("37305", result); Assert.Equal("37305", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day10_Tests
{ {
Day10 day = new() { Width = 12, Height = 10 }; Day10 day = new() { Width = 12, Height = 10 };
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"position=< 9, 1> velocity=< 0, 2>", "position=< 9, 1> velocity=< 0, 2>",
"position=< 7, 0> velocity=<-1, 0>", "position=< 7, 0> velocity=<-1, 0>",
"position=< 3, -2> velocity=<-1, 1>", "position=< 3, -2> velocity=<-1, 1>",
@@ -39,7 +39,7 @@ public class Day10_Tests
"position=< 5, 9> velocity=< 1, -2>", "position=< 5, 9> velocity=< 1, -2>",
"position=<14, 7> velocity=<-2, 0>", "position=<14, 7> velocity=<-2, 0>",
"position=<-3, 6> velocity=< 2, -1>", "position=<-3, 6> velocity=< 2, -1>",
}); ]);
Assert.Equal( Assert.Equal(
Environment.NewLine + "............" + Environment.NewLine + "............" +
@@ -59,7 +59,7 @@ public class Day10_Tests
{ {
Day10 day = new(); Day10 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"position=< 9, 1> velocity=< 0, 2>", "position=< 9, 1> velocity=< 0, 2>",
"position=< 7, 0> velocity=<-1, 0>", "position=< 7, 0> velocity=<-1, 0>",
"position=< 3, -2> velocity=<-1, 1>", "position=< 3, -2> velocity=<-1, 1>",
@@ -91,7 +91,7 @@ public class Day10_Tests
"position=< 5, 9> velocity=< 1, -2>", "position=< 5, 9> velocity=< 1, -2>",
"position=<14, 7> velocity=<-2, 0>", "position=<14, 7> velocity=<-2, 0>",
"position=<-3, 6> velocity=< 2, -1>", "position=<-3, 6> velocity=< 2, -1>",
}); ]);
Assert.Equal("3", result); Assert.Equal("3", result);
} }

View File

@@ -59,7 +59,7 @@ public class Day11_Tests
public void ResolvePart2__Test1() public void ResolvePart2__Test1()
{ {
Day11 day = new(); Day11 day = new();
string result = day.ResolvePart2(new[] { "18" }); string result = day.ResolvePart2(["18"]);
Assert.Equal("90,269,16", result); Assert.Equal("90,269,16", result);
} }
@@ -67,7 +67,7 @@ public class Day11_Tests
public void ResolvePart2__Test2() public void ResolvePart2__Test2()
{ {
Day11 day = new(); Day11 day = new();
string result = day.ResolvePart2(new[] { "42" }); string result = day.ResolvePart2(["42"]);
Assert.Equal("232,251,12", result); Assert.Equal("232,251,12", result);
} }
} }

View File

@@ -7,8 +7,7 @@ public class Day12_Tests
{ {
Day12 day = new(); Day12 day = new();
string result = day.ResolvePart1(new[] string result = day.ResolvePart1([
{
"initial state: #..#.#..##......###...###", "initial state: #..#.#..##......###...###",
"", "",
"...## => #", "...## => #",
@@ -25,7 +24,7 @@ public class Day12_Tests
"###.. => #", "###.. => #",
"###.# => #", "###.# => #",
"####. => #", "####. => #",
}); ]);
Assert.Equal("325", result); Assert.Equal("325", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day13_Tests
{ {
Day13 day = new(); Day13 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"|", "|",
"v", "v",
"|", "|",
@@ -15,7 +15,7 @@ public class Day13_Tests
"|", "|",
"^", "^",
"|", "|",
}); ]);
Assert.Equal("0,3", result); Assert.Equal("0,3", result);
} }
@@ -25,14 +25,14 @@ public class Day13_Tests
{ {
Day13 day = new(); Day13 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
@"/->-\ ", @"/->-\ ",
@"| | /----\", @"| | /----\",
@"| /-+--+-\ |", @"| /-+--+-\ |",
@"| | | | v |", @"| | | | v |",
@"\-+-/ \-+--/", @"\-+-/ \-+--/",
@" \------/ ", @" \------/ ",
}); ]);
Assert.Equal("7,3", result); Assert.Equal("7,3", result);
} }
@@ -42,7 +42,7 @@ public class Day13_Tests
{ {
Day13 day = new(); Day13 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
@"/>-<\ ", @"/>-<\ ",
@"| | ", @"| | ",
@"| /<+-\", @"| /<+-\",
@@ -50,7 +50,7 @@ public class Day13_Tests
@"\>+</ |", @"\>+</ |",
@" | ^", @" | ^",
@" \<->/", @" \<->/",
}); ]);
Assert.Equal("6,4", result); Assert.Equal("6,4", result);
} }

View File

@@ -9,7 +9,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart1(new[] { "9", }); string result = day.ResolvePart1(["9"]);
Assert.Equal("5158916779", result); Assert.Equal("5158916779", result);
} }
@@ -19,7 +19,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart1(new[] { "5", }); string result = day.ResolvePart1(["5"]);
Assert.Equal("0124515891", result); Assert.Equal("0124515891", result);
} }
@@ -29,7 +29,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart1(new[] { "18", }); string result = day.ResolvePart1(["18"]);
Assert.Equal("9251071085", result); Assert.Equal("9251071085", result);
} }
@@ -39,7 +39,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart1(new[] { "2018", }); string result = day.ResolvePart1(["2018"]);
Assert.Equal("5941429882", result); Assert.Equal("5941429882", result);
} }
@@ -53,7 +53,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart2(new[] { "51589", }); string result = day.ResolvePart2(["51589"]);
Assert.Equal("9", result); Assert.Equal("9", result);
} }
@@ -63,7 +63,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart2(new[] { "01245", }); string result = day.ResolvePart2(["01245"]);
Assert.Equal("5", result); Assert.Equal("5", result);
} }
@@ -73,7 +73,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart2(new[] { "92510", }); string result = day.ResolvePart2(["92510"]);
Assert.Equal("18", result); Assert.Equal("18", result);
} }
@@ -83,7 +83,7 @@ public class Day14_Tests
{ {
Day14 day = new(); Day14 day = new();
string result = day.ResolvePart2(new[] { "59414", }); string result = day.ResolvePart2(["59414"]);
Assert.Equal("2018", result); Assert.Equal("2018", result);
} }

View File

@@ -9,7 +9,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#######", "#######",
"#.G...#", "#.G...#",
"#...EG#", "#...EG#",
@@ -17,7 +17,7 @@ public class Day15_Tests
"#..G#E#", "#..G#E#",
"#.....#", "#.....#",
"#######", "#######",
}); ]);
Assert.Equal("27730", result); Assert.Equal("27730", result);
} }
@@ -27,7 +27,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#######", "#######",
"#G..#E#", "#G..#E#",
"#E#E.E#", "#E#E.E#",
@@ -35,17 +35,17 @@ public class Day15_Tests
"#...#E#", "#...#E#",
"#...E.#", "#...E.#",
"#######", "#######",
}); ]);
Assert.Equal("36334", result); Assert.Equal("36334", result);
} }
[Fact] [Fact]
public void ResolvePart1__Test3() public void ResolvePart1__Test3()
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#######", "#######",
"#E..EG#", "#E..EG#",
"#.#G.E#", "#.#G.E#",
@@ -53,7 +53,7 @@ public class Day15_Tests
"#G..#.#", "#G..#.#",
"#..E#.#", "#..E#.#",
"#######", "#######",
}); ]);
Assert.Equal("39514", result); Assert.Equal("39514", result);
} }
@@ -63,7 +63,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#######", "#######",
"#E.G#.#", "#E.G#.#",
"#.#G..#", "#.#G..#",
@@ -71,7 +71,7 @@ public class Day15_Tests
"#G..#.#", "#G..#.#",
"#...E.#", "#...E.#",
"#######", "#######",
}); ]);
Assert.Equal("27755", result); Assert.Equal("27755", result);
} }
@@ -81,7 +81,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#######", "#######",
"#.E...#", "#.E...#",
"#.#..G#", "#.#..G#",
@@ -89,7 +89,7 @@ public class Day15_Tests
"#E#G#G#", "#E#G#G#",
"#...#G#", "#...#G#",
"#######", "#######",
}); ]);
Assert.Equal("28944", result); Assert.Equal("28944", result);
} }
@@ -99,7 +99,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"#########", "#########",
"#G......#", "#G......#",
"#.E.#...#", "#.E.#...#",
@@ -109,7 +109,7 @@ public class Day15_Tests
"#.G...G.#", "#.G...G.#",
"#.....G.#", "#.....G.#",
"#########", "#########",
}); ]);
Assert.Equal("18740", result); Assert.Equal("18740", result);
} }
@@ -123,7 +123,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"#######", "#######",
"#.G...#", "#.G...#",
"#...EG#", "#...EG#",
@@ -131,17 +131,17 @@ public class Day15_Tests
"#..G#E#", "#..G#E#",
"#.....#", "#.....#",
"#######", "#######",
}); ]);
Assert.Equal("4988", result); Assert.Equal("4988", result);
} }
[Fact] [Fact]
public void ResolvePart2__Test3() public void ResolvePart2__Test3()
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"#######", "#######",
"#E..EG#", "#E..EG#",
"#.#G.E#", "#.#G.E#",
@@ -149,7 +149,7 @@ public class Day15_Tests
"#G..#.#", "#G..#.#",
"#..E#.#", "#..E#.#",
"#######", "#######",
}); ]);
Assert.Equal("31284", result); Assert.Equal("31284", result);
} }
@@ -159,7 +159,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"#######", "#######",
"#E.G#.#", "#E.G#.#",
"#.#G..#", "#.#G..#",
@@ -167,7 +167,7 @@ public class Day15_Tests
"#G..#.#", "#G..#.#",
"#...E.#", "#...E.#",
"#######", "#######",
}); ]);
Assert.Equal("3478", result); Assert.Equal("3478", result);
} }
@@ -177,7 +177,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"#######", "#######",
"#.E...#", "#.E...#",
"#.#..G#", "#.#..G#",
@@ -185,7 +185,7 @@ public class Day15_Tests
"#E#G#G#", "#E#G#G#",
"#...#G#", "#...#G#",
"#######", "#######",
}); ]);
Assert.Equal("6474", result); Assert.Equal("6474", result);
} }
@@ -195,7 +195,7 @@ public class Day15_Tests
{ {
Day15 day = new(); Day15 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"#########", "#########",
"#G......#", "#G......#",
"#.E.#...#", "#.E.#...#",
@@ -205,7 +205,7 @@ public class Day15_Tests
"#.G...G.#", "#.G...G.#",
"#.....G.#", "#.....G.#",
"#########", "#########",
}); ]);
Assert.Equal("1140", result); Assert.Equal("1140", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day16_Tests
{ {
Day16 day = new(); Day16 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"Before: [3, 2, 1, 1]", "Before: [3, 2, 1, 1]",
"9 2 1 2", "9 2 1 2",
"After: [3, 2, 2, 1]", "After: [3, 2, 2, 1]",
@@ -18,7 +18,7 @@ public class Day16_Tests
"", "",
"", "",
"Garbage", "Garbage",
}); ]);
Assert.Equal("2", result); Assert.Equal("2", result);
} }

View File

@@ -7,7 +7,7 @@ public class Day23_Tests
{ {
Day23 day = new(); Day23 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"pos=<0,0,0>, r=4", "pos=<0,0,0>, r=4",
"pos=<1,0,0>, r=1", "pos=<1,0,0>, r=1",
"pos=<4,0,0>, r=3", "pos=<4,0,0>, r=3",
@@ -17,7 +17,7 @@ public class Day23_Tests
"pos=<1,1,1>, r=1", "pos=<1,1,1>, r=1",
"pos=<1,1,2>, r=1", "pos=<1,1,2>, r=1",
"pos=<1,3,1>, r=1", "pos=<1,3,1>, r=1",
}); ]);
Assert.Equal("7", result); Assert.Equal("7", result);
} }
@@ -27,14 +27,14 @@ public class Day23_Tests
{ {
Day23 day = new(); Day23 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"pos=<10,12,12>, r=2", "pos=<10,12,12>, r=2",
"pos=<12,14,12>, r=2", "pos=<12,14,12>, r=2",
"pos=<16,12,12>, r=4", "pos=<16,12,12>, r=4",
"pos=<14,14,14>, r=6", "pos=<14,14,14>, r=6",
"pos=<50,50,50>, r=200", "pos=<50,50,50>, r=200",
"pos=<10,10,10>, r=5", "pos=<10,10,10>, r=5",
}); ]);
Assert.Equal("36", result); Assert.Equal("36", result);
} }

View File

@@ -1,5 +1,5 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<packages> <packages>
<package id="MSTest.TestAdapter" version="1.4.0" targetFramework="net461" /> <package id="MSTest.TestAdapter" version="1.4.0" targetFramework="net461"/>
<package id="MSTest.TestFramework" version="1.4.0" targetFramework="net461" /> <package id="MSTest.TestFramework" version="1.4.0" targetFramework="net461"/>
</packages> </packages>

View File

@@ -1,20 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2018</RootNamespace> <Nullable>enable</Nullable>
</PropertyGroup> <RootNamespace>AdventOfCode2018</RootNamespace>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<None Update="inputs\*"> <None Update="inputs\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" /> <ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -63,8 +63,7 @@ public class Day01 : IDay
int accumulator = 0; int accumulator = 0;
foreach (string input in inputs) foreach (string input in inputs)
{ {
int intInput; if (int.TryParse(input.Substring(1), out int intInput))
if (int.TryParse(input.Substring(1), out intInput))
{ {
if (input[0] == '-') if (input[0] == '-')
{ {
@@ -83,15 +82,14 @@ public class Day01 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
int accumulator = 0; int accumulator = 0;
List<int> accumulatorHistory = new(); List<int> accumulatorHistory = [];
int? repeatedAccumulator = null; int? repeatedAccumulator = null;
while (repeatedAccumulator == null) while (repeatedAccumulator == null)
{ {
foreach (string input in inputs) foreach (string input in inputs)
{ {
accumulatorHistory.Add(accumulator); accumulatorHistory.Add(accumulator);
int intInput; if (int.TryParse(input.Substring(1), out int intInput))
if (int.TryParse(input.Substring(1), out intInput))
{ {
if (input[0] == '-') if (input[0] == '-')
{ {
@@ -110,6 +108,6 @@ public class Day01 : IDay
} }
} }
} }
return repeatedAccumulator.ToString(); return repeatedAccumulator.ToString() ?? string.Empty;
} }
} }

View File

@@ -50,7 +50,7 @@ What letters are common between the two correct box IDs? (In the example above,
public class Day02 : IDay public class Day02 : IDay
{ {
private int CountOccurrencesOfLetter(string text, char letter) private static int CountOccurrencesOfLetter(string text, char letter)
{ {
return text.Count(c => (c == letter)); return text.Count(c => (c == letter));
} }
@@ -75,7 +75,7 @@ public class Day02 : IDay
int tripletsCount = 0; int tripletsCount = 0;
foreach (string input in inputs) foreach (string input in inputs)
{ {
var hasPairsAndTriplets = HasPairsAndTriplets(input); Tuple<bool, bool> hasPairsAndTriplets = HasPairsAndTriplets(input);
if (hasPairsAndTriplets.Item1) { pairsCount++; } if (hasPairsAndTriplets.Item1) { pairsCount++; }
if (hasPairsAndTriplets.Item2) { tripletsCount++; } if (hasPairsAndTriplets.Item2) { tripletsCount++; }
} }
@@ -104,11 +104,10 @@ public class Day02 : IDay
{ {
for (int j = (i + 1); j < inputs.Length; j++) for (int j = (i + 1); j < inputs.Length; j++)
{ {
var result = CompareIDPair(inputs[i], inputs[j]); Tuple<int, string> result = CompareIDPair(inputs[i], inputs[j]);
if (result.Item1 == 1) { return result.Item2; } if (result.Item1 == 1) { return result.Item2; }
} }
} }
return string.Empty; return string.Empty;
} }
} }

View File

@@ -60,7 +60,7 @@ public class Day03 : IDay
{ {
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
List<Claim> claims = inputs.Select(i => Claim.FromString(i)).ToList(); List<Claim> claims = inputs.Select(Claim.FromString).ToList();
const int edgeSize = 1000; const int edgeSize = 1000;
int[,] cells = new int[edgeSize, edgeSize]; int[,] cells = new int[edgeSize, edgeSize];
@@ -92,9 +92,9 @@ public class Day03 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
List<Claim> claims = inputs.Select(i => Claim.FromString(i)).ToList(); List<Claim> claims = inputs.Select(Claim.FromString).ToList();
Claim unoverlappingClaim = null; Claim? unOverlappingClaim = null;
for (int i = 0; i < claims.Count; i++) for (int i = 0; i < claims.Count; i++)
{ {
bool overlaps = false; bool overlaps = false;
@@ -109,29 +109,43 @@ public class Day03 : IDay
} }
if (overlaps == false) if (overlaps == false)
{ {
unoverlappingClaim = claims[i]; unOverlappingClaim = claims[i];
break; break;
} }
} }
return unoverlappingClaim.ID.ToString(); return unOverlappingClaim?.ID.ToString() ?? string.Empty;
} }
public class Claim public class Claim
{ {
public int ID { get; set; } public int ID { get; private set; }
public int Left { get; set; } public int Left { get; private set; }
public int Top { get; set; } public int Top { get; private set; }
public int Width { get; set; } public int Width { get; private set; }
public int Height { get; set; } public int Height { get; private set; }
public int MinX { get { return Left; } } private int MinX
public int MaxX { get { return Left + Width; } } {
get { return Left; }
}
public int MinY { get { return Top; } } private int MaxX
public int MaxY { get { return Top + Height; } } {
get { return Left + Width; }
}
private int MinY
{
get { return Top; }
}
private int MaxY
{
get { return Top + Height; }
}
public int GetArea() public int GetArea()
{ {
@@ -141,7 +155,7 @@ public class Day03 : IDay
public static Claim FromString(string strClaim) public static Claim FromString(string strClaim)
{ {
Claim claim = new(); Claim claim = new();
string[] parts = strClaim.Split(new[] { " @ ", ",", ": ", "x", }, StringSplitOptions.None); string[] parts = strClaim.Split([" @ ", ",", ": ", "x"], StringSplitOptions.None);
claim.ID = Convert.ToInt32(parts[0].Substring(1)); claim.ID = Convert.ToInt32(parts[0].Substring(1));
claim.Left = Convert.ToInt32(parts[1]); claim.Left = Convert.ToInt32(parts[1]);
claim.Top = Convert.ToInt32(parts[2]); claim.Top = Convert.ToInt32(parts[2]);

View File

@@ -68,14 +68,14 @@ public class Day04 : IDay
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs); List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs);
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistorgram(guardEvents); Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistogram(guardEvents);
// Find sleepier guard // Find sleepier guard
GuardSleepHistogram highestSleeperHistogram = null; GuardSleepHistogram? highestSleeperHistogram = null;
long highestTotalSleep = long.MinValue; long highestTotalSleep = long.MinValue;
foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values) foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values)
{ {
int totalSleep = guardHistogram.SleepOnMunute.Sum(); int totalSleep = guardHistogram.SleepOnMinute.Sum();
if (totalSleep > highestTotalSleep) if (totalSleep > highestTotalSleep)
{ {
@@ -83,16 +83,17 @@ public class Day04 : IDay
highestTotalSleep = totalSleep; highestTotalSleep = totalSleep;
} }
} }
if (highestSleeperHistogram == null) { return string.Empty; }
// Find sleepier minute // Find sleepier minute
int maxSleepMinute = int.MinValue; int maxSleepMinute = int.MinValue;
int maxSleepMinuteValue = int.MinValue; int maxSleepMinuteValue = int.MinValue;
for (int i = 0; i < GuardSleepHistogram.MinutesOnHour; i++) for (int i = 0; i < GuardSleepHistogram.MinutesOnHour; i++)
{ {
if (highestSleeperHistogram.SleepOnMunute[i] > maxSleepMinuteValue) if (highestSleeperHistogram.SleepOnMinute[i] > maxSleepMinuteValue)
{ {
maxSleepMinute = i; maxSleepMinute = i;
maxSleepMinuteValue = highestSleeperHistogram.SleepOnMunute[i]; maxSleepMinuteValue = highestSleeperHistogram.SleepOnMinute[i];
} }
} }
@@ -103,7 +104,7 @@ public class Day04 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs); List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs);
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistorgram(guardEvents); Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistogram(guardEvents);
int selectedGuardID = int.MinValue; int selectedGuardID = int.MinValue;
int selectedMinute = int.MinValue; int selectedMinute = int.MinValue;
@@ -112,9 +113,9 @@ public class Day04 : IDay
{ {
foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values) foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values)
{ {
if (guardHistogram.SleepOnMunute[i] > maxSleepMinuteValue) if (guardHistogram.SleepOnMinute[i] > maxSleepMinuteValue)
{ {
maxSleepMinuteValue = guardHistogram.SleepOnMunute[i]; maxSleepMinuteValue = guardHistogram.SleepOnMinute[i];
selectedGuardID = guardHistogram.ID; selectedGuardID = guardHistogram.ID;
selectedMinute = i; selectedMinute = i;
} }
@@ -125,7 +126,7 @@ public class Day04 : IDay
return result.ToString(); return result.ToString();
} }
private static Dictionary<int, GuardSleepHistogram> BuildFullHistorgram(List<GuardEvent> guardEvents) private static Dictionary<int, GuardSleepHistogram> BuildFullHistogram(List<GuardEvent> guardEvents)
{ {
Dictionary<int, GuardSleepHistogram> dictFullHistogram = new(); Dictionary<int, GuardSleepHistogram> dictFullHistogram = new();
foreach (IGrouping<int, GuardEvent> group in guardEvents.GroupBy(guardEvent => guardEvent.Date.DayOfYear)) foreach (IGrouping<int, GuardEvent> group in guardEvents.GroupBy(guardEvent => guardEvent.Date.DayOfYear))
@@ -156,16 +157,12 @@ public class Day04 : IDay
foreach (GuardSleepHistogram dayGuardHistogram in dictDayHistogram.Values) foreach (GuardSleepHistogram dayGuardHistogram in dictDayHistogram.Values)
{ {
GuardSleepHistogram guardHistogram; if (dictFullHistogram.TryGetValue(dayGuardHistogram.ID, out GuardSleepHistogram? guardHistogram))
if (dictFullHistogram.ContainsKey(dayGuardHistogram.ID))
{ {
guardHistogram = dictFullHistogram[dayGuardHistogram.ID];
guardHistogram.AddHistogram(dayGuardHistogram); guardHistogram.AddHistogram(dayGuardHistogram);
continue;
} }
else dictFullHistogram.Add(dayGuardHistogram.ID, dayGuardHistogram);
{
dictFullHistogram.Add(dayGuardHistogram.ID, dayGuardHistogram);
}
} }
} }
@@ -181,14 +178,14 @@ public class Day04 : IDay
public class GuardEvent public class GuardEvent
{ {
public DateTime Date { get; set; } public DateTime Date { get; private set; }
public int? ID { get; set; } public int? ID { get; private set; }
public GuardEventType Type { get; set; } public GuardEventType Type { get; private set; }
public static GuardEvent FromString(string strEvent) public static GuardEvent FromString(string strEvent)
{ {
GuardEvent guardEvent = new(); GuardEvent guardEvent = new();
string[] parts = strEvent.Split(new[] { "[", "-", " ", ":", "]", "#", }, StringSplitOptions.RemoveEmptyEntries); string[] parts = strEvent.Split(["[", "-", " ", ":", "]", "#"], StringSplitOptions.RemoveEmptyEntries);
guardEvent.Date = new DateTime( guardEvent.Date = new DateTime(
Convert.ToInt32(parts[0]), Convert.ToInt32(parts[0]),
Convert.ToInt32(parts[1]), Convert.ToInt32(parts[1]),
@@ -216,7 +213,7 @@ public class Day04 : IDay
public static List<GuardEvent> FromStringArray(string[] strEvents) public static List<GuardEvent> FromStringArray(string[] strEvents)
{ {
List<GuardEvent> guardEvents = strEvents List<GuardEvent> guardEvents = strEvents
.Select(strEvent => FromString(strEvent)) .Select(FromString)
.OrderBy(guardEvent => guardEvent.Date) .OrderBy(guardEvent => guardEvent.Date)
.ToList(); .ToList();
@@ -240,14 +237,14 @@ public class Day04 : IDay
public class GuardSleepHistogram public class GuardSleepHistogram
{ {
public const int MinutesOnHour = 60; public const int MinutesOnHour = 60;
public int ID { get; set; } public int ID { get; init; }
public int[] SleepOnMunute { get; } = new int[MinutesOnHour]; public int[] SleepOnMinute { get; } = new int[MinutesOnHour];
public void FallSleep(int minute) public void FallSleep(int minute)
{ {
for (int i = minute; i < MinutesOnHour; i++) for (int i = minute; i < MinutesOnHour; i++)
{ {
SleepOnMunute[i] = 1; SleepOnMinute[i] = 1;
} }
} }
@@ -255,7 +252,7 @@ public class Day04 : IDay
{ {
for (int i = minute; i < MinutesOnHour; i++) for (int i = minute; i < MinutesOnHour; i++)
{ {
SleepOnMunute[i] = 0; SleepOnMinute[i] = 0;
} }
} }
@@ -263,7 +260,7 @@ public class Day04 : IDay
{ {
for (int i = 0; i < MinutesOnHour; i++) for (int i = 0; i < MinutesOnHour; i++)
{ {
SleepOnMunute[i] += histogram.SleepOnMunute[i]; SleepOnMinute[i] += histogram.SleepOnMinute[i];
} }
} }
} }

View File

@@ -108,7 +108,7 @@ public class Day05 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
string input = inputs[0]; string input = inputs[0];
List<char> allUnitTypes = input.Select(c => char.ToLower(c)).Distinct().ToList(); List<char> allUnitTypes = input.Select(char.ToLower).Distinct().ToList();
int minPolymerLenght = int.MaxValue; int minPolymerLenght = int.MaxValue;
foreach (char unitType in allUnitTypes) foreach (char unitType in allUnitTypes)

View File

@@ -96,7 +96,8 @@ public class Day06 : IDay
{ {
return inputs return inputs
.Where(input => string.IsNullOrEmpty(input) == false) .Where(input => string.IsNullOrEmpty(input) == false)
.Select(input => ChronoPoint.FromString(input)) .Select(ChronoPoint.FromString)
.OfType<ChronoPoint>()
.ToList(); .ToList();
} }
@@ -183,12 +184,12 @@ public class Day06 : IDay
return areaInRange; return areaInRange;
} }
public int DistanceThresold { get; set; } = 10000; public int DistanceThreshold { get; init; } = 10000;
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
List<ChronoPoint> points = InputsToPoints(inputs); List<ChronoPoint> points = InputsToPoints(inputs);
int areaInRange = AreaInThresold(points, DistanceThresold); int areaInRange = AreaInThresold(points, DistanceThreshold);
return areaInRange.ToString(); return areaInRange.ToString();
} }
@@ -197,10 +198,10 @@ public class Day06 : IDay
public int X { get; set; } public int X { get; set; }
public int Y { get; set; } public int Y { get; set; }
public static ChronoPoint FromString(string strPoint) public static ChronoPoint? FromString(string strPoint)
{ {
if (string.IsNullOrEmpty(strPoint)) { return null; } if (string.IsNullOrEmpty(strPoint)) { return null; }
string[] parts = strPoint.Split(new[] { ", ", }, StringSplitOptions.RemoveEmptyEntries); string[] parts = strPoint.Split([", "], StringSplitOptions.RemoveEmptyEntries);
if (parts.Length < 2) { return null; } if (parts.Length < 2) { return null; }
ChronoPoint point = new() { ChronoPoint point = new() {
X = Convert.ToInt32(parts[0]), X = Convert.ToInt32(parts[0]),

View File

@@ -89,11 +89,11 @@ public class Day07 : IDay
foreach (string input in inputs) foreach (string input in inputs)
{ {
if (string.IsNullOrEmpty(input)) { continue; } if (string.IsNullOrEmpty(input)) { continue; }
string[] parts = input.Split(new[] { string[] parts = input.Split([
"Step ", "Step ",
" must be finished before step ", " must be finished before step ",
" can begin.", " can begin.",
}, StringSplitOptions.RemoveEmptyEntries); ], StringSplitOptions.RemoveEmptyEntries);
instructions.AddNodeRelation(parts[1].ToUpper(), parts[0].ToUpper()); instructions.AddNodeRelation(parts[1].ToUpper(), parts[0].ToUpper());
} }
foreach (InstructionNode node in instructions.Nodes.Values) foreach (InstructionNode node in instructions.Nodes.Values)
@@ -118,8 +118,8 @@ public class Day07 : IDay
return sbInstructions.ToString(); return sbInstructions.ToString();
} }
public int BaseCost { get; set; } = 60; public int BaseCost { get; init; } = 60;
public int NumberOfWorkers { get; set; } = 5; public int NumberOfWorkers { get; init; } = 5;
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
@@ -128,11 +128,11 @@ public class Day07 : IDay
return totalElapsedTime.ToString(); return totalElapsedTime.ToString();
} }
public class InstructionNode public class InstructionNode(string nodeID)
{ {
public string NodeID { get; set; } public string NodeID { get; init; } = nodeID;
public List<string> PreviousNodeIDs { get; } = new(); public List<string> PreviousNodeIDs { get; } = [];
public int Cost { get; set; } public int Cost { get; set; }
@@ -148,22 +148,18 @@ public class Day07 : IDay
} }
} }
public class Instructions private class Instructions
{ {
public Dictionary<string, InstructionNode> Nodes { get; } = new(); public Dictionary<string, InstructionNode> Nodes { get; } = new();
public InstructionNode GetNode(string nodeID) private InstructionNode GetNode(string nodeID)
{ {
InstructionNode node = null; if (Nodes.TryGetValue(nodeID, out InstructionNode? nodeAux))
if (Nodes.ContainsKey(nodeID))
{ {
node = Nodes[nodeID]; return nodeAux;
}
else
{
node = new InstructionNode { NodeID = nodeID, };
Nodes.Add(nodeID, node);
} }
InstructionNode node = new(nodeID);
Nodes.Add(nodeID, node);
return node; return node;
} }
@@ -176,7 +172,7 @@ public class Day07 : IDay
public List<InstructionNode> SortInstructions() public List<InstructionNode> SortInstructions()
{ {
List<InstructionNode> finalNodes = new(); List<InstructionNode> finalNodes = [];
foreach (InstructionNode node in Nodes.Values) foreach (InstructionNode node in Nodes.Values)
{ {
@@ -194,7 +190,8 @@ public class Day07 : IDay
.ToList(); .ToList();
if (unusedNodes.Count > 0) if (unusedNodes.Count > 0)
{ {
InstructionNode node = unusedNodes.FirstOrDefault(); InstructionNode? node = unusedNodes.FirstOrDefault();
if (node == null) { continue; }
finalNodes.Add(node); finalNodes.Add(node);
node.Used = true; node.Used = true;
} }
@@ -204,8 +201,8 @@ public class Day07 : IDay
private class SimulatedWorker private class SimulatedWorker
{ {
public InstructionNode CurrentInstruction { get; set; } public InstructionNode? CurrentInstruction { get; private set; }
public int ElapsedTime { get; set; } private int ElapsedTime { get; set; }
public void SetInstruction(InstructionNode instruction) public void SetInstruction(InstructionNode instruction)
{ {
@@ -242,7 +239,6 @@ public class Day07 : IDay
workers.Add(new SimulatedWorker()); workers.Add(new SimulatedWorker());
} }
bool anyWorkerWitoutWork;
do do
{ {
bool anyWorkDone = false; bool anyWorkDone = false;
@@ -255,8 +251,8 @@ public class Day07 : IDay
} }
if (anyWorkDone) { totalElapsedTime++; } if (anyWorkDone) { totalElapsedTime++; }
anyWorkerWitoutWork = workers.Any(w => w.CurrentInstruction == null); bool anyWorkerWithoutWork = workers.Any(w => w.CurrentInstruction == null);
if (anyWorkerWitoutWork) if (anyWorkerWithoutWork)
{ {
List<InstructionNode> unusedNodes = Nodes.Values List<InstructionNode> unusedNodes = Nodes.Values
.Where(n => .Where(n =>

View File

@@ -77,13 +77,13 @@ public class Day08 : IDay
public class IntStream public class IntStream
{ {
private int[] _values; private readonly int[] _values;
private int _index; private int _index;
public IntStream(string strValues) public IntStream(string strValues)
{ {
_values = strValues _values = strValues
.Split(new[] { " ", }, StringSplitOptions.RemoveEmptyEntries) .Split([" "], StringSplitOptions.RemoveEmptyEntries)
.Select(strVal => Convert.ToInt32(strVal)) .Select(strVal => Convert.ToInt32(strVal))
.ToArray(); .ToArray();
_index = 0; _index = 0;
@@ -99,9 +99,9 @@ public class Day08 : IDay
public class ChronoLicenceNode public class ChronoLicenceNode
{ {
public List<ChronoLicenceNode> Childs { get; } = new(); public List<ChronoLicenceNode> Childs { get; } = [];
public List<int> Metadata { get; } = new(); public List<int> Metadata { get; } = [];
public static ChronoLicenceNode BuildFromIntStream(IntStream stream) public static ChronoLicenceNode BuildFromIntStream(IntStream stream)
{ {

View File

@@ -75,7 +75,7 @@ public class Day09 : IDay
private static string CalculateHighScore(string input, long factor) private static string CalculateHighScore(string input, long factor)
{ {
string[] parts = input.Split(new[] { " players; last marble is worth ", " points" }, StringSplitOptions.RemoveEmptyEntries); string[] parts = input.Split([" players; last marble is worth ", " points"], StringSplitOptions.RemoveEmptyEntries);
long numberOfPlayers = Convert.ToInt32(parts[0]); long numberOfPlayers = Convert.ToInt32(parts[0]);
long lastMarble = Convert.ToInt32(parts[1]) * factor; long lastMarble = Convert.ToInt32(parts[1]) * factor;
MarbleGame marbleGame = new(); MarbleGame marbleGame = new();
@@ -86,17 +86,17 @@ public class Day09 : IDay
public class Marble public class Marble
{ {
public long Value { get; set; } public long Value { get; init; }
public Marble Previous { get; set; } public Marble? Previous { get; set; }
public Marble Next { get; set; } public Marble? Next { get; set; }
} }
public class MarbleGame public class MarbleGame
{ {
public Dictionary<long, long> Scores { get; } = new(); private Dictionary<long, long> Scores { get; } = new();
private Marble _firstMarble; private Marble? _firstMarble;
private Marble _currentMarble; private Marble? _currentMarble;
private long _currentPlayer; private long _currentPlayer;
private const long PointValueMultiple = 23; private const long PointValueMultiple = 23;
@@ -119,20 +119,34 @@ public class Day09 : IDay
Marble newMarble = new() { Value = i + 1 }; Marble newMarble = new() { Value = i + 1 };
if ((newMarble.Value % PointValueMultiple) > 0) if ((newMarble.Value % PointValueMultiple) > 0)
{ {
Marble previousMarble = _currentMarble.Next; Marble? previousMarble = _currentMarble?.Next;
Marble nextMarble = previousMarble.Next; Marble? nextMarble = previousMarble?.Next;
newMarble.Previous = previousMarble; newMarble.Previous = previousMarble;
newMarble.Next = nextMarble; newMarble.Next = nextMarble;
previousMarble.Next = newMarble; if(previousMarble != null)
nextMarble.Previous = newMarble; {
previousMarble.Next = newMarble;
}
if(nextMarble != null)
{
nextMarble.Previous = newMarble;
}
_currentMarble = newMarble; _currentMarble = newMarble;
} }
else else
{ {
Marble marbleToRemove = _currentMarble.Previous.Previous.Previous.Previous.Previous.Previous.Previous; Marble? marbleToRemove = _currentMarble?.Previous?.Previous?.Previous?.Previous?.Previous?.Previous?.Previous;
_currentMarble = marbleToRemove.Next; _currentMarble = marbleToRemove?.Next;
marbleToRemove.Previous.Next = marbleToRemove.Next; if (marbleToRemove == null) { continue; }
marbleToRemove.Next.Previous = marbleToRemove.Previous;
if(marbleToRemove.Previous != null)
{
marbleToRemove.Previous.Next = marbleToRemove.Next;
}
if (marbleToRemove.Next != null)
{
marbleToRemove.Next.Previous = marbleToRemove.Previous;
}
long currentPlayerScore = Scores[_currentPlayer] + (newMarble.Value + marbleToRemove.Value); long currentPlayerScore = Scores[_currentPlayer] + (newMarble.Value + marbleToRemove.Value);
Scores[_currentPlayer] = currentPlayerScore; Scores[_currentPlayer] = currentPlayerScore;
@@ -141,22 +155,17 @@ public class Day09 : IDay
} }
} }
public void PrintStatus() private void PrintStatus()
{ {
Console.Write("[{0}] ", _currentPlayer); Console.Write("[{0}] ", _currentPlayer);
Marble marble = _firstMarble; Marble? marble = _firstMarble;
do do
{ {
if (_currentMarble.Value == marble.Value) Console.Write(_currentMarble?.Value == marble?.Value
{ ? "({0}) "
Console.Write("({0}) ", marble.Value); : "{0} ", marble?.Value);
} marble = marble?.Next;
else } while (marble != null && marble.Value != 0);
{
Console.Write("{0} ", marble.Value);
}
marble = marble.Next;
} while (marble.Value != 0);
Console.WriteLine(); Console.WriteLine();
} }

View File

@@ -156,13 +156,13 @@ Impressed by your sub-hour communication capabilities, the Elves are curious: ex
public class Day10 : IDay public class Day10 : IDay
{ {
public int Width { get; set; } = 65; public int Width { get; init; } = 65;
public int Height { get; set; } = 12; public int Height { get; init; } = 12;
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
LightField lightField = new(inputs); LightField lightField = new(inputs);
int t = lightField.SearchSmallerBoundindBox(); int t = lightField.SearchSmallerBoundingBox();
string result = lightField.Render(t, Width, Height); string result = lightField.Render(t, Width, Height);
return result; return result;
} }
@@ -170,20 +170,20 @@ public class Day10 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
LightField lightField = new(inputs); LightField lightField = new(inputs);
int t = lightField.SearchSmallerBoundindBox(); int t = lightField.SearchSmallerBoundingBox();
return t.ToString(); return t.ToString();
} }
public class LightPoint public class LightPoint
{ {
public int X { get; set; } private int X { get; init; }
public int Y { get; set; } private int Y { get; init; }
public int VX { get; set; } private int VX { get; init; }
public int VY { get; set; } private int VY { get; init; }
public static LightPoint FromString(string strPoint) public static LightPoint FromString(string strPoint)
{ {
string[] parts = strPoint.Split(new[] { "position=<", " ", ",", "> velocity=<", ">" }, StringSplitOptions.RemoveEmptyEntries); string[] parts = strPoint.Split(["position=<", " ", ",", "> velocity=<", ">"], StringSplitOptions.RemoveEmptyEntries);
LightPoint point = new() { LightPoint point = new() {
X = Convert.ToInt32(parts[0]), X = Convert.ToInt32(parts[0]),
Y = Convert.ToInt32(parts[1]), Y = Convert.ToInt32(parts[1]),
@@ -204,16 +204,11 @@ public class Day10 : IDay
} }
} }
public class LightField private class LightField(string[] strPoints)
{ {
private readonly List<LightPoint> _points; private readonly List<LightPoint> _points = strPoints.Select(LightPoint.FromString).ToList();
public LightField(string[] strPoints) public int SearchSmallerBoundingBox()
{
_points = strPoints.Select(strPoint => LightPoint.FromString(strPoint)).ToList();
}
public int SearchSmallerBoundindBox()
{ {
int minHeight = int.MaxValue; int minHeight = int.MaxValue;
int minT = 0; int minT = 0;
@@ -288,14 +283,7 @@ public class Day10 : IDay
sb.AppendLine(); sb.AppendLine();
for (int i = 0; i < width; i++) for (int i = 0; i < width; i++)
{ {
if (field[i, j] > 0) sb.Append(field[i, j] > 0 ? "#" : ".");
{
sb.Append("#");
}
else
{
sb.Append(".");
}
} }
} }
return sb.ToString(); return sb.ToString();

View File

@@ -190,7 +190,7 @@ public class Day11 : IDay
return powerLevel; return powerLevel;
} }
public static void SearchBestRegion(int width, int height, int serial, out int x, out int y, out int size) private static void SearchBestRegion(int width, int height, int serial, out int x, out int y, out int size)
{ {
int[,] summationFiled = GenerateSumationField(width, height, serial); int[,] summationFiled = GenerateSumationField(width, height, serial);
int bestPowerLevel = int.MinValue; int bestPowerLevel = int.MinValue;

View File

@@ -96,23 +96,23 @@ public class Day12 : IDay
private class PlantRule private class PlantRule
{ {
public bool Minus2 { get; set; } public bool Minus2 { get; init; }
public bool Minus1 { get; set; } public bool Minus1 { get; init; }
public bool Current { get; set; } public bool Current { get; init; }
public bool Plus1 { get; set; } public bool Plus1 { get; init; }
public bool Plus2 { get; set; } public bool Plus2 { get; init; }
public bool Result { get; set; } public bool Result { get; init; }
} }
private const int SideMargin = 5; private const int SideMargin = 5;
private const int SideProcessMargin = 2; private const int SideProcessMargin = 2;
private List<bool> _initialState = new(); private readonly List<bool> _initialState = [];
private List<PlantRule> _rules = new(); private readonly List<PlantRule> _rules = [];
private long _offsetField; private long _offsetField;
private bool[] _field; private bool[] _field = [];
private bool[] _workField; private bool[] _workField = [];
private void Initialize(string[] inputs) private void Initialize(string[] inputs)
{ {
@@ -126,9 +126,8 @@ public class Day12 : IDay
for (int i = 2; i < inputs.Length; i++) for (int i = 2; i < inputs.Length; i++)
{ {
if (string.IsNullOrEmpty(inputs[i])) { continue; } if (string.IsNullOrEmpty(inputs[i])) { continue; }
string[] parts = inputs[i].Split(new[] { " => " }, StringSplitOptions.RemoveEmptyEntries); string[] parts = inputs[i].Split([" => "], StringSplitOptions.RemoveEmptyEntries);
_rules.Add(new PlantRule _rules.Add(new PlantRule {
{
Minus2 = (parts[0][0] == '#'), Minus2 = (parts[0][0] == '#'),
Minus1 = (parts[0][1] == '#'), Minus1 = (parts[0][1] == '#'),
Current = (parts[0][2] == '#'), Current = (parts[0][2] == '#'),
@@ -151,9 +150,7 @@ public class Day12 : IDay
private void SwapFields() private void SwapFields()
{ {
bool[] aux = _field; (_field, _workField) = (_workField, _field);
_field = _workField;
_workField = aux;
} }
private void RecenterField() private void RecenterField()
@@ -236,8 +233,7 @@ public class Day12 : IDay
rule.Minus1 == minus1 && rule.Minus1 == minus1 &&
rule.Current == current && rule.Current == current &&
rule.Plus1 == plus1 && rule.Plus1 == plus1 &&
rule.Plus2 == plus2 && rule.Plus2 == plus2
true
) )
{ {
result = rule.Result; result = rule.Result;

View File

@@ -217,7 +217,7 @@ public class Day13 : IDay
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
Initialize(inputs); Initialize(inputs);
Train collidingTrain; Train? collidingTrain;
do do
{ {
if (ShowProgress) { ShowGrid(); } if (ShowProgress) { ShowGrid(); }
@@ -229,7 +229,7 @@ public class Day13 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
Initialize(inputs); Initialize(inputs);
Train lastCart; Train? lastCart;
do do
{ {
if (ShowProgress) { ShowGrid(); } if (ShowProgress) { ShowGrid(); }
@@ -371,8 +371,8 @@ public class Day13 : IDay
private int _width; private int _width;
private int _height; private int _height;
private char[,] _grid; private char[,] _grid = new char[0, 0];
private List<Train> _trains = new(); private readonly List<Train> _trains = [];
private void Initialize(string[] inputs) private void Initialize(string[] inputs)
{ {
@@ -387,8 +387,7 @@ public class Day13 : IDay
char cell = inputs[j][i]; char cell = inputs[j][i];
if (cell == '^') if (cell == '^')
{ {
_trains.Add(new Train _trains.Add(new Train {
{
X = i, X = i,
Y = j, Y = j,
Direction = TrainDirection.North, Direction = TrainDirection.North,
@@ -398,8 +397,7 @@ public class Day13 : IDay
} }
if (cell == 'v') if (cell == 'v')
{ {
_trains.Add(new Train _trains.Add(new Train {
{
X = i, X = i,
Y = j, Y = j,
Direction = TrainDirection.South, Direction = TrainDirection.South,
@@ -409,8 +407,7 @@ public class Day13 : IDay
} }
if (cell == '<') if (cell == '<')
{ {
_trains.Add(new Train _trains.Add(new Train {
{
X = i, X = i,
Y = j, Y = j,
Direction = TrainDirection.West, Direction = TrainDirection.West,
@@ -420,8 +417,7 @@ public class Day13 : IDay
} }
if (cell == '>') if (cell == '>')
{ {
_trains.Add(new Train _trains.Add(new Train {
{
X = i, X = i,
Y = j, Y = j,
Direction = TrainDirection.East, Direction = TrainDirection.East,
@@ -434,9 +430,9 @@ public class Day13 : IDay
} }
} }
private Train SimulateForFirstCollision() private Train? SimulateForFirstCollision()
{ {
Train collidingTrain = null; Train? collidingTrain = null;
IEnumerable<Train> orderedTrains = _trains.OrderBy(t => t.X + (t.Y * _width)); IEnumerable<Train> orderedTrains = _trains.OrderBy(t => t.X + (t.Y * _width));
foreach (Train t in orderedTrains) foreach (Train t in orderedTrains)
{ {
@@ -447,13 +443,13 @@ public class Day13 : IDay
return collidingTrain; return collidingTrain;
} }
private Train SimulateForLastCart() private Train? SimulateForLastCart()
{ {
List<Train> orderedTrains = _trains.OrderBy(t => t.X + (t.Y * _width)).ToList(); List<Train> orderedTrains = _trains.OrderBy(t => t.X + (t.Y * _width)).ToList();
foreach (Train t in orderedTrains) foreach (Train t in orderedTrains)
{ {
t.Simulate(_grid); t.Simulate(_grid);
Train collidingTrain = _trains.FirstOrDefault(x => x.X == t.X && x.Y == t.Y && t != x); Train? collidingTrain = _trains.FirstOrDefault(x => x.X == t.X && x.Y == t.Y && t != x);
if (collidingTrain != null) if (collidingTrain != null)
{ {
_trains.Remove(t); _trains.Remove(t);
@@ -474,7 +470,7 @@ public class Day13 : IDay
{ {
for (int i = 0; i < _width; i++) for (int i = 0; i < _width; i++)
{ {
Train t = _trains.FirstOrDefault(x => x.X == i && x.Y == j); Train? t = _trains.FirstOrDefault(x => x.X == i && x.Y == j);
if (t != null) if (t != null)
{ {
if (t.Direction == TrainDirection.North) if (t.Direction == TrainDirection.North)
@@ -502,5 +498,4 @@ public class Day13 : IDay
Console.WriteLine(); Console.WriteLine();
} }
} }
} }

View File

@@ -62,7 +62,7 @@ public class Day14 : IDay
{ {
private long _numRecipes; private long _numRecipes;
private long _numRecipesAllocated; private long _numRecipesAllocated;
private byte[] _recipes; private byte[] _recipes = [];
private long _idxA; private long _idxA;
private long _idxB; private long _idxB;
private long _searchSkip; private long _searchSkip;

View File

@@ -377,18 +377,18 @@ public class Day15 : IDay
{ {
public enum EntityType { Elf, Goblin, } public enum EntityType { Elf, Goblin, }
public bool Show { get; set; } = false; private bool Show { get; set; } = false;
public class Entity public class Entity
{ {
public const int GoblinAttackPower = 3; private const int GoblinAttackPower = 3;
public static int ElfAttackPower { get; set; } = 3; public static int ElfAttackPower { get; set; } = 3;
public const int InitialHealth = 200; private const int InitialHealth = 200;
public EntityType Type { get; set; } public EntityType Type { get; init; }
public int X { get; set; } public int X { get; set; }
public int Y { get; set; } public int Y { get; set; }
public int Health { get; set; } = InitialHealth; public int Health { get; private set; } = InitialHealth;
public bool IsAlive() public bool IsAlive()
{ {
@@ -401,18 +401,17 @@ public class Day15 : IDay
(other.X + 1 == X && other.Y == Y) || (other.X + 1 == X && other.Y == Y) ||
(other.X - 1 == X && other.Y == Y) || (other.X - 1 == X && other.Y == Y) ||
(other.X == X && other.Y + 1 == Y) || (other.X == X && other.Y + 1 == Y) ||
(other.X == X && other.Y - 1 == Y) || (other.X == X && other.Y - 1 == Y)
false
) )
{ {
return true; return true;
} }
return false; return false;
} }
public void Attack(char[,] map, Entity other) public void Attack(char[,] map, Entity other)
{ {
if(Type == EntityType.Elf) if (Type == EntityType.Elf)
{ {
other.Health -= ElfAttackPower; other.Health -= ElfAttackPower;
} }
@@ -435,28 +434,27 @@ public class Day15 : IDay
} }
} }
public class Target private class Target
{ {
public int X { get; set; } public int X { get; init; }
public int Y { get; set; } public int Y { get; init; }
public int Distance { get; set; } public int Distance { get; set; }
public int Priority { get; set; } public int Priority { get; init; }
public Entity Entity { get; set; }
} }
private int _width; private int _width;
private int _height; private int _height;
private char[,] _map; private char[,] _map = new char[0, 0];
private List<Entity> _entities; private readonly List<Entity> _entities = [];
private BreadthFirstSearchGrid _search; private BreadthFirstSearchGrid? _search;
private int _rounds; private int _rounds;
private void Init(string[] inputs) private void Init(string[] inputs)
{ {
_height = inputs.Length; _height = inputs.Length;
_width = inputs.Max(input => input.Length); _width = inputs.Max(input => input.Length);
_map = new char[_width, _height]; _map = new char[_width, _height];
_entities = new List<Entity>(); _entities.Clear();
for (int j = 0; j < _height; j++) for (int j = 0; j < _height; j++)
{ {
for (int i = 0; i < _width; i++) for (int i = 0; i < _width; i++)
@@ -473,8 +471,7 @@ public class Day15 : IDay
} }
else if (cell == 'E') else if (cell == 'E')
{ {
_entities.Add(new Entity _entities.Add(new Entity {
{
Type = EntityType.Elf, Type = EntityType.Elf,
X = i, X = i,
Y = j, Y = j,
@@ -483,8 +480,7 @@ public class Day15 : IDay
} }
else if (cell == 'G') else if (cell == 'G')
{ {
_entities.Add(new Entity _entities.Add(new Entity {
{
Type = EntityType.Goblin, Type = EntityType.Goblin,
X = i, X = i,
Y = j, Y = j,
@@ -505,7 +501,7 @@ public class Day15 : IDay
.ThenBy(e => e.X); .ThenBy(e => e.X);
} }
public IEnumerable<Entity> GetTargetEntities(Entity entity) private IEnumerable<Entity> GetTargetEntities(Entity entity)
{ {
return _entities return _entities
.Where(e => e.IsAlive() && e.Type != entity.Type) .Where(e => e.IsAlive() && e.Type != entity.Type)
@@ -513,30 +509,29 @@ public class Day15 : IDay
.ThenBy(e => e.X); .ThenBy(e => e.X);
} }
public Entity GetBestInRangeTarget(Entity entity, IEnumerable<Entity> targets) private Entity? GetBestInRangeTarget(Entity entity, IEnumerable<Entity> targets)
{ {
return targets return targets
.Where(e => entity.InRangeOf(e)) .Where(entity.InRangeOf)
.OrderBy(e => e.Health) .OrderBy(e => e.Health)
.ThenBy(e => e.Y) .ThenBy(e => e.Y)
.ThenBy(e => e.X) .ThenBy(e => e.X)
.FirstOrDefault(); .FirstOrDefault();
} }
private void AddTarget(List<Target> targets, int targetX, int targetY, int priority, Entity entity) private void AddTarget(List<Target> targets, int targetX, int targetY, int priority)
{ {
if (_search == null) { return;}
if (targetX >= 0 && targetX < _width && targetY >= 0 && targetY < _height && _map[targetX, targetY] == '.') if (targetX >= 0 && targetX < _width && targetY >= 0 && targetY < _height && _map[targetX, targetY] == '.')
{ {
int distance = _search.QueryDistance(targetX, targetY); int distance = _search.QueryDistance(targetX, targetY);
if (distance >= 0) if (distance >= 0)
{ {
targets.Add(new Target targets.Add(new Target {
{
X = targetX, X = targetX,
Y = targetY, Y = targetY,
Distance = distance, Distance = distance,
Priority = priority, Priority = priority,
Entity = entity,
}); });
} }
} }
@@ -544,6 +539,7 @@ public class Day15 : IDay
private void RunBattle() private void RunBattle()
{ {
if (_search == null) { return;}
_rounds = 0; _rounds = 0;
bool running = true; bool running = true;
do do
@@ -552,7 +548,7 @@ public class Day15 : IDay
foreach (Entity entity in entities) foreach (Entity entity in entities)
{ {
if (entity.IsAlive() == false) { continue; } if (entity.IsAlive() == false) { continue; }
IEnumerable<Entity> entitiesTargets = GetTargetEntities(entity); IEnumerable<Entity> entitiesTargets = GetTargetEntities(entity).ToList();
if (entitiesTargets.Any() == false) if (entitiesTargets.Any() == false)
{ {
running = false; running = false;
@@ -560,7 +556,7 @@ public class Day15 : IDay
} }
// Attack // Attack
Entity targetInRange = GetBestInRangeTarget(entity, entitiesTargets); Entity? targetInRange = GetBestInRangeTarget(entity, entitiesTargets);
if (targetInRange != null) if (targetInRange != null)
{ {
entity.Attack(_map, targetInRange); entity.Attack(_map, targetInRange);
@@ -573,19 +569,18 @@ public class Day15 : IDay
int priority = 0; int priority = 0;
foreach (Entity entityTarget in entitiesTargets) foreach (Entity entityTarget in entitiesTargets)
{ {
AddTarget(targets, entityTarget.X, entityTarget.Y - 1, priority++, entityTarget); AddTarget(targets, entityTarget.X, entityTarget.Y - 1, priority++);
AddTarget(targets, entityTarget.X - 1, entityTarget.Y, priority++, entityTarget); AddTarget(targets, entityTarget.X - 1, entityTarget.Y, priority++);
AddTarget(targets, entityTarget.X + 1, entityTarget.Y, priority++, entityTarget); AddTarget(targets, entityTarget.X + 1, entityTarget.Y, priority++);
AddTarget(targets, entityTarget.X, entityTarget.Y + 1, priority++, entityTarget); AddTarget(targets, entityTarget.X, entityTarget.Y + 1, priority++);
} }
Target bestTarget = targets.OrderBy(t => t.Distance).ThenBy(t => t.Priority).FirstOrDefault(); Target? bestTarget = targets.OrderBy(t => t.Distance).ThenBy(t => t.Priority).FirstOrDefault();
if (bestTarget != null) if (bestTarget != null)
{ {
_search.SearchCharGrid(_map, '.', bestTarget.X, bestTarget.Y); _search.SearchCharGrid(_map, '.', bestTarget.X, bestTarget.Y);
targets.Clear(); targets.Clear();
Target dirTarget;
dirTarget = new Target { X = entity.X, Y = entity.Y - 1, Priority = 0, }; Target dirTarget = new() { X = entity.X, Y = entity.Y - 1, Priority = 0, };
dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y); dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y);
if (dirTarget.Distance >= 0) targets.Add(dirTarget); if (dirTarget.Distance >= 0) targets.Add(dirTarget);
@@ -601,7 +596,7 @@ public class Day15 : IDay
dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y); dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y);
if (dirTarget.Distance >= 0) targets.Add(dirTarget); if (dirTarget.Distance >= 0) targets.Add(dirTarget);
Target finalTarget = targets Target? finalTarget = targets
.OrderBy(t => t.Distance) .OrderBy(t => t.Distance)
.ThenBy(t => t.Priority) .ThenBy(t => t.Priority)
.FirstOrDefault(); .FirstOrDefault();
@@ -609,21 +604,21 @@ public class Day15 : IDay
{ {
throw new Exception("No possible direction"); throw new Exception("No possible direction");
} }
entity.MoveTo(_map, finalTarget.X, finalTarget.Y); entity.MoveTo(_map, finalTarget.X, finalTarget.Y);
// Attack // Attack
Entity targetInRangeAfterMove = GetBestInRangeTarget(entity, entitiesTargets); Entity? targetInRangeAfterMove = GetBestInRangeTarget(entity, entitiesTargets);
if (targetInRangeAfterMove != null) if (targetInRangeAfterMove != null)
{ {
entity.Attack(_map, targetInRangeAfterMove); entity.Attack(_map, targetInRangeAfterMove);
} }
} }
} }
if(running == false) { break; } if (running == false) { break; }
_rounds++; _rounds++;
if (Show) { PrintBattlefield(); } if (Show) { PrintBattlefield(); }
} while (running); } while (true);
if (Show) { PrintBattlefield(); } if (Show) { PrintBattlefield(); }
} }
@@ -637,7 +632,8 @@ public class Day15 : IDay
{ {
Console.Write(_map[i, j]); Console.Write(_map[i, j]);
} }
IEnumerable<Entity> entitiesOnLine = _entities.Where(e => e.IsAlive() && e.Y == j).OrderBy(e => e.X); int j1 = j;
IEnumerable<Entity> entitiesOnLine = _entities.Where(e => e.IsAlive() && e.Y == j1).OrderBy(e => e.X);
foreach (Entity entity in entitiesOnLine) foreach (Entity entity in entitiesOnLine)
{ {
Console.Write(" {0}({1})", (entity.Type == EntityType.Elf) ? 'E' : 'G', entity.Health); Console.Write(" {0}({1})", (entity.Type == EntityType.Elf) ? 'E' : 'G', entity.Health);
@@ -683,16 +679,15 @@ public class Day15 : IDay
private class BFSCell private class BFSCell
{ {
public bool Visited { get; set; } public bool Visited { get; set; }
public BFSCell CameFrom { get; set; }
public int Distance { get; set; } = -1; public int Distance { get; set; } = -1;
public int X { get; set; } public int X { get; init; }
public int Y { get; set; } public int Y { get; init; }
} }
private readonly BFSCell[,] _grid; private readonly BFSCell[,] _grid;
private readonly int _width; private readonly int _width;
private readonly int _height; private readonly int _height;
public BreadthFirstSearchGrid(int width, int height) public BreadthFirstSearchGrid(int width, int height)
{ {
_grid = new BFSCell[width, height]; _grid = new BFSCell[width, height];
@@ -707,24 +702,23 @@ public class Day15 : IDay
} }
} }
public void Reset() private void Reset()
{ {
for(int j =0;j< _height; j++) for (int j = 0; j < _height; j++)
{ {
for(int i = 0; i < _width; i++) for (int i = 0; i < _width; i++)
{ {
BFSCell cell = _grid[i, j]; BFSCell cell = _grid[i, j];
cell.Visited = false; cell.Visited = false;
cell.CameFrom = null;
cell.Distance = -1; cell.Distance = -1;
} }
} }
} }
private void ProcessCell(char[,] grid, char empty, Queue<BFSCell> frontier, BFSCell current, int nextX, int nextY) private void ProcessCell(char[,] grid, char empty, Queue<BFSCell> frontier, BFSCell? current, int nextX, int nextY)
{ {
if (nextX < 0 || nextX >= _width || nextY < 0 || nextY >= _height) { return; } if (nextX < 0 || nextX >= _width || nextY < 0 || nextY >= _height) { return; }
if (grid[nextX, nextY] == empty || current== null) if (grid[nextX, nextY] == empty || current == null)
{ {
BFSCell cell = _grid[nextX, nextY]; BFSCell cell = _grid[nextX, nextY];
if (cell.Visited == false) if (cell.Visited == false)
@@ -732,7 +726,6 @@ public class Day15 : IDay
frontier.Enqueue(cell); frontier.Enqueue(cell);
cell.Visited = true; cell.Visited = true;
cell.Distance = (current?.Distance ?? -1) + 1; cell.Distance = (current?.Distance ?? -1) + 1;
cell.CameFrom = current;
} }
} }
} }

View File

@@ -87,8 +87,8 @@ public class Day16 : IDay
int count = 0; int count = 0;
int i = 0; int i = 0;
bool end = false; bool end = false;
int[] beforeRegisters = null; int[]? beforeRegisters = null;
int[] instruction = null; int[]? instruction = null;
const string beforeKeyword = "Before: ["; const string beforeKeyword = "Before: [";
const string afterKeyword = "After: ["; const string afterKeyword = "After: [";
while (inputs.Length > i) while (inputs.Length > i)
@@ -160,17 +160,11 @@ public class Day16 : IDay
private readonly List<ChronoInstruction> _instructions; private readonly List<ChronoInstruction> _instructions;
private class ChronoInstruction private class ChronoInstruction(string opName, Action<int, int, int> opFunc)
{ {
public int OpCode { get; set; } = -1; public int OpCode { get; set; } = -1;
public string OpName { get; } public string OpName { get; } = opName;
public Action<int, int, int> OpFunc { get; } public Action<int, int, int> OpFunc { get; } = opFunc;
public ChronoInstruction(string opName, Action<int, int, int> opFunc)
{
OpName = opName;
OpFunc = opFunc;
}
public Dictionary<int, int> OpCodeHistogram { get; } = new(); public Dictionary<int, int> OpCodeHistogram { get; } = new();
@@ -191,7 +185,7 @@ public class Day16 : IDay
public ChronoMachine() public ChronoMachine()
{ {
_registers = new int[4]; _registers = new int[4];
_instructions = new List<ChronoInstruction> { _instructions = [
new("addr", Op_AddR), new("addr", Op_AddR),
new("addi", Op_AddI), new("addi", Op_AddI),
new("mulr", Op_MulR), new("mulr", Op_MulR),
@@ -208,7 +202,7 @@ public class Day16 : IDay
new("eqir", Op_EqIR), new("eqir", Op_EqIR),
new("eqri", Op_EqRI), new("eqri", Op_EqRI),
new("eqrr", Op_EqRR), new("eqrr", Op_EqRR),
}; ];
} }
public void ResetRegisters() public void ResetRegisters()
@@ -341,7 +335,7 @@ public class Day16 : IDay
public void InitOpCodes(bool debug = false) public void InitOpCodes(bool debug = false)
{ {
if(debug) if (debug)
{ {
foreach (ChronoInstruction instruction in _instructions) foreach (ChronoInstruction instruction in _instructions)
{ {
@@ -374,7 +368,7 @@ public class Day16 : IDay
instruction.OpCode = opCode; instruction.OpCode = opCode;
_dictInstructions.Add(opCode, instruction); _dictInstructions.Add(opCode, instruction);
if(debug) { Console.WriteLine($"{instruction.OpName}: {instruction.OpCode}"); } if (debug) { Console.WriteLine($"{instruction.OpName}: {instruction.OpCode}"); }
} }
} }
} }

View File

@@ -68,8 +68,8 @@ public class Day23 : IDay
public string ResolvePart1(string[] inputs) public string ResolvePart1(string[] inputs)
{ {
List<NanoBot> nanoBots = NanoBot.ListFromStrings(inputs); List<NanoBot> nanoBots = NanoBot.ListFromStrings(inputs);
NanoBot bestNanoBot = nanoBots.OrderBy(nanoBot => nanoBot.Range).LastOrDefault(); NanoBot? bestNanoBot = nanoBots.OrderBy(nanoBot => nanoBot.Range).LastOrDefault();
int countInRange = nanoBots.Where(nanoBot => bestNanoBot.InRange(nanoBot)).Count(); int countInRange = nanoBots.Count(nanoBot => bestNanoBot?.InRange(nanoBot) == true);
return countInRange.ToString(); return countInRange.ToString();
} }
@@ -82,7 +82,7 @@ public class Day23 : IDay
long minX = long.MaxValue; long minX = long.MaxValue;
long minY = long.MaxValue; long minY = long.MaxValue;
long minZ = long.MaxValue; long minZ = long.MaxValue;
foreach(NanoBot nanoBot in nanoBots) foreach (NanoBot nanoBot in nanoBots)
{ {
if (nanoBot.X < minX) { minX = nanoBot.X; } if (nanoBot.X < minX) { minX = nanoBot.X; }
if (nanoBot.X > maxX) { maxX = nanoBot.X; } if (nanoBot.X > maxX) { maxX = nanoBot.X; }
@@ -95,7 +95,7 @@ public class Day23 : IDay
long sizeY = maxY - minY; long sizeY = maxY - minY;
long sizeZ = maxZ - minZ; long sizeZ = maxZ - minZ;
long scale = Math.Min(sizeX, Math.Min(sizeY, sizeZ)); long scale = Math.Min(sizeX, Math.Min(sizeY, sizeZ));
do do
{ {
scale /= 2; scale /= 2;
@@ -112,11 +112,11 @@ public class Day23 : IDay
for (long i = minX; i <= maxX; i += scale) for (long i = minX; i <= maxX; i += scale)
{ {
int count = 0; int count = 0;
foreach(NanoBot nanoBot in nanoBots) foreach (NanoBot nanoBot in nanoBots)
{ {
if (nanoBot.InRange(i, j, k, scale)) { count++; } if (nanoBot.InRange(i, j, k, scale)) { count++; }
} }
if(count> bestCount) if (count > bestCount)
{ {
bestX = i; bestX = i;
bestY = j; bestY = j;
@@ -134,7 +134,7 @@ public class Day23 : IDay
minZ = bestZ - scale; minZ = bestZ - scale;
maxZ = bestZ + scale; maxZ = bestZ + scale;
if(scale == 1) if (scale == 1)
{ {
long distance = bestX + bestY + bestZ; long distance = bestX + bestY + bestZ;
return distance.ToString(); return distance.ToString();
@@ -145,14 +145,14 @@ public class Day23 : IDay
public class NanoBot public class NanoBot
{ {
public long X { get; set; } public long X { get; private init; }
public long Y { get; set; } public long Y { get; private init; }
public long Z { get; set; } public long Z { get; private init; }
public long Range { get; set; } public long Range { get; private init; }
public static NanoBot FromString(string strInput) private static NanoBot? FromString(string strInput)
{ {
string[] parts = strInput.Split(new[] { "pos=<", ",", ">, r=", }, StringSplitOptions.RemoveEmptyEntries); string[] parts = strInput.Split(["pos=<", ",", ">, r="], StringSplitOptions.RemoveEmptyEntries);
if (parts.Length != 4) { return null; } if (parts.Length != 4) { return null; }
NanoBot nanoBot = new() { NanoBot nanoBot = new() {
X = Convert.ToInt64(parts[0]), X = Convert.ToInt64(parts[0]),
@@ -166,18 +166,18 @@ public class Day23 : IDay
public static List<NanoBot> ListFromStrings(string[] inputs) public static List<NanoBot> ListFromStrings(string[] inputs)
{ {
List<NanoBot> nanoBots = inputs List<NanoBot> nanoBots = inputs
.Select(strInput => FromString(strInput)) .Select(FromString)
.Where(nanoBot => nanoBot != null) .OfType<NanoBot>()
.ToList(); .ToList();
return nanoBots; return nanoBots;
} }
public long ManhattanDistance(NanoBot other) private long ManhattanDistance(NanoBot other)
{ {
return ManhattanDistance(other.X, other.Y, other.Z); return ManhattanDistance(other.X, other.Y, other.Z);
} }
public long ManhattanDistance(long x, long y, long z) private long ManhattanDistance(long x, long y, long z)
{ {
long distance = Math.Abs(X - x) + Math.Abs(Y - y) + Math.Abs(Z - z); long distance = Math.Abs(X - x) + Math.Abs(Y - y) + Math.Abs(Z - z);
return distance; return distance;

View File

@@ -1,24 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2020.Tests</RootNamespace> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2020.Tests</RootNamespace>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
</PropertyGroup> <IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
<PackageReference Include="xunit" Version="2.6.3" /> <PackageReference Include="xunit" Version="2.6.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.5.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
</PackageReference> </PackageReference>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode2020\AdventOfCode2020.csproj" /> <ProjectReference Include="..\AdventOfCode2020\AdventOfCode2020.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -7,16 +7,16 @@ public class Day01_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day01(); Day01 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"1721", "1721",
"979", "979",
"366", "366",
"299", "299",
"675", "675",
"1456", "1456",
}); ]);
Assert.Equal("514579", result); Assert.Equal("514579", result);
} }
@@ -28,16 +28,16 @@ public class Day01_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day01(); Day01 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"1721", "1721",
"979", "979",
"366", "366",
"299", "299",
"675", "675",
"1456", "1456",
}); ]);
Assert.Equal("241861950", result); Assert.Equal("241861950", result);
} }

View File

@@ -7,13 +7,13 @@ public class Day02_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day02(); Day02 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"1-3 a: abcde", "1-3 a: abcde",
"1-3 b: cdefg", "1-3 b: cdefg",
"2-9 c: ccccccccc", "2-9 c: ccccccccc",
}); ]);
Assert.Equal("2", result); Assert.Equal("2", result);
} }
@@ -25,13 +25,13 @@ public class Day02_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day02(); Day02 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"1-3 a: abcde", "1-3 a: abcde",
"1-3 b: cdefg", "1-3 b: cdefg",
"2-9 c: ccccccccc", "2-9 c: ccccccccc",
}); ]);
Assert.Equal("1", result); Assert.Equal("1", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day03_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day03(); Day03 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"..##.......", "..##.......",
"#...#...#..", "#...#...#..",
".#....#..#.", ".#....#..#.",
@@ -19,7 +19,7 @@ public class Day03_Tests
"#.##...#...", "#.##...#...",
"#...##....#", "#...##....#",
".#..#...#.#", ".#..#...#.#",
}); ]);
Assert.Equal("7", result); Assert.Equal("7", result);
} }
@@ -27,9 +27,9 @@ public class Day03_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day03(); Day03 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"..##.......", "..##.......",
"#...#...#..", "#...#...#..",
".#....#..#.", ".#....#..#.",
@@ -41,7 +41,7 @@ public class Day03_Tests
"#.##...#...", "#.##...#...",
"#...##....#", "#...##....#",
".#..#...#.#", ".#..#...#.#",
}); ]);
Assert.Equal("336", result); Assert.Equal("336", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day04_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day04(); Day04 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"ecl:gry pid:860033327 eyr:2020 hcl:#fffffd", "ecl:gry pid:860033327 eyr:2020 hcl:#fffffd",
"byr:1937 iyr:2017 cid:147 hgt:183cm", "byr:1937 iyr:2017 cid:147 hgt:183cm",
"", "",
@@ -21,7 +21,7 @@ public class Day04_Tests
"", "",
"hcl:#cfa07d eyr:2025 pid:166559648", "hcl:#cfa07d eyr:2025 pid:166559648",
"iyr:2011 ecl:brn hgt:59in", "iyr:2011 ecl:brn hgt:59in",
}); ]);
Assert.Equal("2", result); Assert.Equal("2", result);
} }
@@ -29,9 +29,9 @@ public class Day04_Tests
[Fact] [Fact]
public void ResolvePart2__ExampleInvalid() public void ResolvePart2__ExampleInvalid()
{ {
var day = new Day04(); Day04 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"eyr:1972 cid:100", "eyr:1972 cid:100",
"hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926", "hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926",
"", "",
@@ -45,7 +45,7 @@ public class Day04_Tests
"hgt:59cm ecl:zzz", "hgt:59cm ecl:zzz",
"eyr:2038 hcl:74454a iyr:2023", "eyr:2038 hcl:74454a iyr:2023",
"pid:3556412378 byr:2007", "pid:3556412378 byr:2007",
}); ]);
Assert.Equal("0", result); Assert.Equal("0", result);
} }
@@ -53,9 +53,9 @@ public class Day04_Tests
[Fact] [Fact]
public void ResolvePart2__ExampleValid() public void ResolvePart2__ExampleValid()
{ {
var day = new Day04(); Day04 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980", "pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980",
"hcl:#623a2f", "hcl:#623a2f",
"", "",
@@ -68,7 +68,7 @@ public class Day04_Tests
"eyr:2022", "eyr:2022",
"", "",
"iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719", "iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719",
}); ]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }

View File

@@ -5,11 +5,11 @@ public class Day05_Tests
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()
{ {
var day = new Day05(); Day05 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"FBFBBFFRLR", "FBFBBFFRLR",
}); ]);
Assert.Equal("357", result); Assert.Equal("357", result);
} }
@@ -17,11 +17,11 @@ public class Day05_Tests
[Fact] [Fact]
public void ResolvePart1__Example2() public void ResolvePart1__Example2()
{ {
var day = new Day05(); Day05 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"BFFFBBFRRR", "BFFFBBFRRR",
}); ]);
Assert.Equal("567", result); Assert.Equal("567", result);
} }
@@ -29,11 +29,11 @@ public class Day05_Tests
[Fact] [Fact]
public void ResolvePart1__Example3() public void ResolvePart1__Example3()
{ {
var day = new Day05(); Day05 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"FFFBBBFRRR", "FFFBBBFRRR",
}); ]);
Assert.Equal("119", result); Assert.Equal("119", result);
} }
@@ -41,11 +41,11 @@ public class Day05_Tests
[Fact] [Fact]
public void ResolvePart1__Example4() public void ResolvePart1__Example4()
{ {
var day = new Day05(); Day05 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"BBFFBBFRLL", "BBFFBBFRLL",
}); ]);
Assert.Equal("820", result); Assert.Equal("820", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day06_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day06(); Day06 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"abc", "abc",
"", "",
"a", "a",
@@ -23,7 +23,7 @@ public class Day06_Tests
"a", "a",
"", "",
"b", "b",
}); ]);
Assert.Equal("11", result); Assert.Equal("11", result);
} }
@@ -31,9 +31,9 @@ public class Day06_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day06(); Day06 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"abc", "abc",
"", "",
"a", "a",
@@ -49,7 +49,7 @@ public class Day06_Tests
"a", "a",
"", "",
"b", "b",
}); ]);
Assert.Equal("6", result); Assert.Equal("6", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day07_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day07(); Day07 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"light red bags contain 1 bright white bag, 2 muted yellow bags.", "light red bags contain 1 bright white bag, 2 muted yellow bags.",
"dark orange bags contain 3 bright white bags, 4 muted yellow bags.", "dark orange bags contain 3 bright white bags, 4 muted yellow bags.",
"bright white bags contain 1 shiny gold bag.", "bright white bags contain 1 shiny gold bag.",
@@ -17,7 +17,7 @@ public class Day07_Tests
"vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.", "vibrant plum bags contain 5 faded blue bags, 6 dotted black bags.",
"faded blue bags contain no other bags.", "faded blue bags contain no other bags.",
"dotted black bags contain no other bags.", "dotted black bags contain no other bags.",
}); ]);
Assert.Equal("4", result); Assert.Equal("4", result);
} }
@@ -25,9 +25,9 @@ public class Day07_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day07(); Day07 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"shiny gold bags contain 2 dark red bags.", "shiny gold bags contain 2 dark red bags.",
"dark red bags contain 2 dark orange bags.", "dark red bags contain 2 dark orange bags.",
"dark orange bags contain 2 dark yellow bags.", "dark orange bags contain 2 dark yellow bags.",
@@ -35,7 +35,7 @@ public class Day07_Tests
"dark green bags contain 2 dark blue bags.", "dark green bags contain 2 dark blue bags.",
"dark blue bags contain 2 dark violet bags.", "dark blue bags contain 2 dark violet bags.",
"dark violet bags contain no other bags.", "dark violet bags contain no other bags.",
}); ]);
Assert.Equal("126", result); Assert.Equal("126", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day08_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day08(); Day08 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"nop +0", "nop +0",
"acc +1", "acc +1",
"jmp +4", "jmp +4",
@@ -17,7 +17,7 @@ public class Day08_Tests
"acc +1", "acc +1",
"jmp -4", "jmp -4",
"acc +6", "acc +6",
}); ]);
Assert.Equal("5", result); Assert.Equal("5", result);
} }
@@ -25,9 +25,9 @@ public class Day08_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day08(); Day08 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"nop +0", "nop +0",
"acc +1", "acc +1",
"jmp +4", "jmp +4",
@@ -37,7 +37,7 @@ public class Day08_Tests
"acc +1", "acc +1",
"jmp -4", "jmp -4",
"acc +6", "acc +6",
}); ]);
Assert.Equal("8", result); Assert.Equal("8", result);
} }

View File

@@ -5,9 +5,9 @@ public class Day09_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day09(); Day09 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"35", "35",
"20", "20",
"15", "15",
@@ -28,7 +28,7 @@ public class Day09_Tests
"277", "277",
"309", "309",
"576", "576",
}); ]);
Assert.Equal("127", result); Assert.Equal("127", result);
} }
@@ -36,9 +36,9 @@ public class Day09_Tests
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day09(); Day09 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"35", "35",
"20", "20",
"15", "15",
@@ -59,7 +59,7 @@ public class Day09_Tests
"277", "277",
"309", "309",
"576", "576",
}); ]);
Assert.Equal("62", result); Assert.Equal("62", result);
} }

View File

@@ -1,20 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2020</RootNamespace> <Nullable>enable</Nullable>
</PropertyGroup> <RootNamespace>AdventOfCode2020</RootNamespace>
</PropertyGroup>
<ItemGroup> <ItemGroup>
<None Update="inputs\*"> <None Update="inputs\*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None> </None>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" /> <ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -112,5 +112,4 @@ public class Day03 : IDay
} }
return treeCnt; return treeCnt;
} }
} }

View File

@@ -118,7 +118,7 @@ iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719
Count the number of valid passports - those that have all required fields and valid values. Continue to treat cid as optional. In your batch file, how many passports are valid? Count the number of valid passports - those that have all required fields and valid values. Continue to treat cid as optional. In your batch file, how many passports are valid?
*/ */
public class Day04 : IDay public class Day04 : IDay
@@ -127,7 +127,7 @@ public class Day04 : IDay
{ {
List<Dictionary<string, string>> passports = Passports_Parse(inputs); List<Dictionary<string, string>> passports = Passports_Parse(inputs);
int cnt = 0; int cnt = 0;
List<string> neededFields = new() { List<string> neededFields = [
"byr", // Birth Year "byr", // Birth Year
"iyr", // Issue Year "iyr", // Issue Year
"eyr", // Expiration Year "eyr", // Expiration Year
@@ -135,7 +135,7 @@ public class Day04 : IDay
"hcl", // Hair Color "hcl", // Hair Color
"ecl", // Eye Color "ecl", // Eye Color
"pid", // Passport ID "pid", // Passport ID
}; ];
foreach (Dictionary<string, string> passport in passports) foreach (Dictionary<string, string> passport in passports)
{ {
@@ -167,7 +167,7 @@ public class Day04 : IDay
private List<Dictionary<string, string>> Passports_Parse(string[] inputs) private List<Dictionary<string, string>> Passports_Parse(string[] inputs)
{ {
List<Dictionary<string, string>> passports = new(); List<Dictionary<string, string>> passports = [];
Dictionary<string, string> passport = new(); Dictionary<string, string> passport = new();
foreach (string input in inputs) foreach (string input in inputs)
{ {
@@ -257,5 +257,4 @@ public class Day04 : IDay
if (input.All(char.IsNumber) == false) { return null; } if (input.All(char.IsNumber) == false) { return null; }
return Convert.ToInt32(input); return Convert.ToInt32(input);
} }
} }

View File

@@ -64,7 +64,7 @@ public class Day05 : IDay
int maxSerialNumber = 0; int maxSerialNumber = 0;
foreach (string input in inputs) foreach (string input in inputs)
{ {
Seat seat = Seat_Parse(input); Seat? seat = Seat_Parse(input);
if (seat == null) { continue; } if (seat == null) { continue; }
int newSerialNumber = seat.GetSerialNumber(); int newSerialNumber = seat.GetSerialNumber();
if (newSerialNumber > maxSerialNumber) { maxSerialNumber = newSerialNumber; } if (newSerialNumber > maxSerialNumber) { maxSerialNumber = newSerialNumber; }
@@ -83,7 +83,7 @@ public class Day05 : IDay
} }
foreach (string input in inputs) foreach (string input in inputs)
{ {
Seat seat = Seat_Parse(input); Seat? seat = Seat_Parse(input);
if (seat == null) { continue; } if (seat == null) { continue; }
seats[seat.Column][seat.Row] = 'X'; seats[seat.Column][seat.Row] = 'X';
@@ -166,11 +166,11 @@ public class Day05 : IDay
} }
} }
private Seat Seat_Parse(string input) private Seat? Seat_Parse(string input)
{ {
if (input.Length != 10 || if (input.Length != 10 ||
input.All(c => c == 'F' || c == 'B' || c == 'L' || c == 'R') == false || input.All(c => c == 'F' || c == 'B' || c == 'L' || c == 'R') == false
false) )
{ {
return null; return null;
} }

View File

@@ -67,10 +67,7 @@ public class Day06 : IDay
foreach (char c in input) foreach (char c in input)
{ {
if (groupMap.ContainsKey(c) == false) groupMap.TryAdd(c, true);
{
groupMap.Add(c, true);
}
} }
} }
if (groupMap.Count > 0) if (groupMap.Count > 0)
@@ -78,7 +75,7 @@ public class Day06 : IDay
groupMaps.Add(groupMap); groupMaps.Add(groupMap);
} }
int total = groupMaps.Sum(groupMap => groupMap.Count); int total = groupMaps.Sum(dict => dict.Count);
return total.ToString(); return total.ToString();
} }
@@ -101,13 +98,9 @@ public class Day06 : IDay
groupCount++; groupCount++;
foreach (char c in input) foreach (char c in input)
{ {
if (groupMap.ContainsKey(c) == false) if (groupMap.TryAdd(c, 1) == false)
{ {
groupMap.Add(c, 1); groupMap[c] += 1;
}
else
{
groupMap[c] = groupMap[c] + 1;
} }
} }
} }

View File

@@ -72,15 +72,15 @@ public class Day07 : IDay
{ {
string myBagColor = "shiny gold"; string myBagColor = "shiny gold";
List<BaggageRule> rules = new(); List<BaggageRule> rules = [];
foreach (string input in inputs) foreach (string input in inputs)
{ {
BaggageRule rule = BaggageRule_Parse(input); BaggageRule rule = BaggageRule_Parse(input);
rules.Add(rule); rules.Add(rule);
} }
List<string> bagColorsToCheck = new() { myBagColor }; List<string> bagColorsToCheck = [myBagColor];
List<string> bagColorsChecked = new() { myBagColor }; List<string> bagColorsChecked = [myBagColor];
int cntBagColors = 0; int cntBagColors = 0;
while (bagColorsToCheck.Count > 0) while (bagColorsToCheck.Count > 0)
{ {
@@ -108,7 +108,7 @@ public class Day07 : IDay
{ {
string myBagColor = "shiny gold"; string myBagColor = "shiny gold";
List<BaggageRule> rules = new(); List<BaggageRule> rules = [];
foreach (string input in inputs) foreach (string input in inputs)
{ {
BaggageRule rule = BaggageRule_Parse(input); BaggageRule rule = BaggageRule_Parse(input);
@@ -116,31 +116,30 @@ public class Day07 : IDay
} }
Dictionary<string, BaggageRule> dictRules = rules.ToDictionary(x => x.BagColor); Dictionary<string, BaggageRule> dictRules = rules.ToDictionary(x => x.BagColor);
int cnt = BaggageRule_CountChilds(myBagColor, dictRules); int cnt = BaggageRule_CountChildren(myBagColor, dictRules);
return cnt.ToString(); return cnt.ToString();
} }
public class BaggageContainRule private class BaggageContainRule
{ {
public string BagColor { get; set; } public string BagColor { get; set; } = string.Empty;
public int Count { get; set; } public int Count { get; init; }
} }
public class BaggageRule private class BaggageRule
{ {
public string BagColor { get; set; } public string BagColor { get; set; } = string.Empty;
public List<BaggageContainRule> Contain { get; set; } public List<BaggageContainRule> Contain { get; } = [];
} }
public BaggageRule BaggageRule_Parse(string input) private BaggageRule BaggageRule_Parse(string input)
{ {
string[] words = input.Split(' '); string[] words = input.Split(' ');
string status = "Parse Color 1"; string status = "Parse Color 1";
BaggageRule rule = new(); BaggageRule rule = new();
rule.Contain = new List<BaggageContainRule>(); BaggageContainRule? containRule = null;
BaggageContainRule containRule = null;
string color1 = string.Empty; string color1 = string.Empty;
foreach (string word in words) foreach (string word in words)
@@ -164,9 +163,14 @@ public class Day07 : IDay
status = "Parse Contain count"; status = "Parse Contain count";
break; break;
case "Parse Contain count": case "Parse Contain count":
if (word == "no") { status = "End"; break; } if (word == "no")
containRule = new BaggageContainRule(); {
containRule.Count = Convert.ToInt32(word); status = "End";
break;
}
containRule = new BaggageContainRule {
Count = Convert.ToInt32(word),
};
status = "Parse Contain color 1"; status = "Parse Contain color 1";
break; break;
case "Parse Contain color 1": case "Parse Contain color 1":
@@ -174,12 +178,17 @@ public class Day07 : IDay
status = "Parse Contain color 2"; status = "Parse Contain color 2";
break; break;
case "Parse Contain color 2": case "Parse Contain color 2":
if(containRule == null) { break; }
containRule.BagColor = string.Concat(color1, " ", word); containRule.BagColor = string.Concat(color1, " ", word);
rule.Contain.Add(containRule); rule.Contain.Add(containRule);
status = "Parse Contain continue"; status = "Parse Contain continue";
break; break;
case "Parse Contain continue": case "Parse Contain continue":
if (word == "bag," || word == "bags,") { status = "Parse Contain count"; break; } if (word == "bag," || word == "bags,")
{
status = "Parse Contain count";
break;
}
status = "End"; status = "End";
break; break;
case "End": case "End":
@@ -189,13 +198,13 @@ public class Day07 : IDay
return rule; return rule;
} }
public int BaggageRule_CountChilds(string color, Dictionary<string, BaggageRule> dictRules) private int BaggageRule_CountChildren(string color, Dictionary<string, BaggageRule> dictRules)
{ {
int cnt = 0; int cnt = 0;
BaggageRule rule = dictRules[color]; BaggageRule rule = dictRules[color];
foreach (BaggageContainRule containRule in rule.Contain) foreach (BaggageContainRule containRule in rule.Contain)
{ {
cnt += (BaggageRule_CountChilds(containRule.BagColor, dictRules) + 1) * containRule.Count; cnt += (BaggageRule_CountChildren(containRule.BagColor, dictRules) + 1) * containRule.Count;
} }
return cnt; return cnt;
} }

View File

@@ -124,14 +124,14 @@ public class Day08 : IDay
return vm.Accumulator.ToString(); return vm.Accumulator.ToString();
} }
public enum OpCode private enum OpCode
{ {
Acc, Acc,
Jmp, Jmp,
Nop, Nop,
} }
public class Instruction private class Instruction
{ {
public OpCode OpCode { get; set; } public OpCode OpCode { get; set; }
public int Value { get; set; } public int Value { get; set; }
@@ -154,14 +154,9 @@ public class Day08 : IDay
OpCode = OpCode.Nop; OpCode = OpCode.Nop;
} }
if (parts[1].StartsWith("+")) Value = Convert.ToInt32(parts[1].StartsWith("+")
{ ? parts[1].Substring(1)
Value = Convert.ToInt32(parts[1].Substring(1)); : parts[1]);
}
else
{
Value = Convert.ToInt32(parts[1]);
}
Executed = false; Executed = false;
} }
} }
@@ -176,7 +171,7 @@ public class Day08 : IDay
public VM(string[] inputs) public VM(string[] inputs)
{ {
Instructions = new List<Instruction>(); Instructions = [];
foreach (string input in inputs) foreach (string input in inputs)
{ {
Instructions.Add(new Instruction(input)); Instructions.Add(new Instruction(input));

View File

@@ -163,5 +163,4 @@ public class Day09 : IDay
return firstInvalid; return firstInvalid;
} }
} }

View File

@@ -1,17 +1,18 @@
<Project Sdk="Microsoft.NET.Sdk"> <Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup> <PropertyGroup>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2023.Tests</RootNamespace>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2023.Tests</RootNamespace>
<IsPackable>false</IsPackable> <IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
<PackageReference Include="xunit" Version="2.6.3" /> <PackageReference Include="xunit" Version="2.6.3"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.5.5"> <PackageReference Include="xunit.runner.visualstudio" Version="2.5.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets> <PrivateAssets>all</PrivateAssets>
@@ -19,7 +20,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode2023\AdventOfCode2023.csproj" /> <ProjectReference Include="..\AdventOfCode2023\AdventOfCode2023.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -5,24 +5,24 @@ public class Day01_Tests
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
var day = new Day01(); Day01 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"1abc2", "1abc2",
"pqr3stu8vwx", "pqr3stu8vwx",
"a1b2c3d4e5f", "a1b2c3d4e5f",
"treb7uchet", "treb7uchet",
}); ]);
Assert.Equal("142", result); Assert.Equal("142", result);
} }
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
var day = new Day01(); Day01 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"two1nine", "two1nine",
"eightwothree", "eightwothree",
"abcone2threexyz", "abcone2threexyz",
@@ -30,7 +30,7 @@ public class Day01_Tests
"4nineeightseven2", "4nineeightseven2",
"zoneight234", "zoneight234",
"7pqrstsixteen", "7pqrstsixteen",
}); ]);
Assert.Equal("281", result); Assert.Equal("281", result);
} }

View File

@@ -18,7 +18,7 @@ public class Day02_Tests
Assert.Equal(0, game.Sets[2].Blue); Assert.Equal(0, game.Sets[2].Blue);
Assert.Equal(2, game.Sets[2].Green); Assert.Equal(2, game.Sets[2].Green);
} }
[Fact] [Fact]
public void Game_FromString__ValidExample2() public void Game_FromString__ValidExample2()
{ {
@@ -35,35 +35,35 @@ public class Day02_Tests
Assert.Equal(0, game.Sets[2].Blue); Assert.Equal(0, game.Sets[2].Blue);
Assert.Equal(5, game.Sets[2].Green); Assert.Equal(5, game.Sets[2].Green);
} }
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day02 day = new(); Day02 day = new();
string result = day.ResolvePart1(new[] { string result = day.ResolvePart1([
"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
"Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue", "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
"Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red", "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
"Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red", "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
"Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green", "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
}); ]);
Assert.Equal("8", result); Assert.Equal("8", result);
} }
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day02 day = new(); Day02 day = new();
string result = day.ResolvePart2(new[] { string result = day.ResolvePart2([
"Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green",
"Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue", "Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue",
"Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red", "Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red",
"Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red", "Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red",
"Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green", "Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
}); ]);
Assert.Equal("2286", result); Assert.Equal("2286", result);
} }

View File

@@ -5,26 +5,26 @@ public class Day03_Tests
[Fact] [Fact]
public void SearchNextSchemaNumber__NoNumbers__Null() public void SearchNextSchemaNumber__NoNumbers__Null()
{ {
string[] inputs = new[] { string[] inputs = [
"..........", "..........",
"..........", "..........",
"..........", "..........",
}; ];
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0); Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0);
Assert.Null(number); Assert.Null(number);
} }
[Fact] [Fact]
public void SearchNextSchemaNumber__OneNumber__Valid() public void SearchNextSchemaNumber__OneNumber__Valid()
{ {
string[] inputs = new[] { string[] inputs = [
"..........", "..........",
"....420...", "....420...",
"..........", "..........",
}; ];
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0); Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0);
Assert.NotNull(number); Assert.NotNull(number);
Assert.Equal(1, number.Value.Row); Assert.Equal(1, number.Value.Row);
Assert.Equal(4, number.Value.Column); Assert.Equal(4, number.Value.Column);
@@ -35,13 +35,13 @@ public class Day03_Tests
[Fact] [Fact]
public void SearchNextSchemaNumber__TwoNumbersSkipFirst__ValidSecond() public void SearchNextSchemaNumber__TwoNumbersSkipFirst__ValidSecond()
{ {
string[] inputs = new[] { string[] inputs = [
"69........", "69........",
"....420...", "....420...",
"..........", "..........",
}; ];
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 4); Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 4);
Assert.NotNull(number); Assert.NotNull(number);
Assert.Equal(1, number.Value.Row); Assert.Equal(1, number.Value.Row);
Assert.Equal(4, number.Value.Column); Assert.Equal(4, number.Value.Column);
@@ -49,7 +49,7 @@ public class Day03_Tests
Assert.Equal(420, number.Value.Value); Assert.Equal(420, number.Value.Value);
} }
private string[] _example = new[] { private string[] _example = [
"467..114..", "467..114..",
"...*......", "...*......",
"..35..633.", "..35..633.",
@@ -60,24 +60,24 @@ public class Day03_Tests
"......755.", "......755.",
"...$.*....", "...$.*....",
".664.598..", ".664.598..",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day03 day = new(); Day03 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("4361", result); Assert.Equal("4361", result);
} }
[Fact] [Fact]
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day03 day = new(); Day03 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("467835", result); Assert.Equal("467835", result);

View File

@@ -2,20 +2,20 @@ namespace AdventOfCode2023.Tests;
public class Day04_Tests public class Day04_Tests
{ {
private readonly string[] _example = { private readonly string[] _example = [
"Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53", "Card 1: 41 48 83 86 17 | 83 86 6 31 17 9 48 53",
"Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19", "Card 2: 13 32 20 16 61 | 61 30 68 82 17 32 24 19",
"Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1", "Card 3: 1 21 53 59 44 | 69 82 63 72 16 21 14 1",
"Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83", "Card 4: 41 92 73 84 69 | 59 84 76 51 58 5 54 83",
"Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36", "Card 5: 87 83 26 28 32 | 88 30 70 12 93 22 82 36",
"Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11", "Card 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day04 day = new(); Day04 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("13", result); Assert.Equal("13", result);
@@ -25,7 +25,7 @@ public class Day04_Tests
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day04 day = new(); Day04 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("30", result); Assert.Equal("30", result);

View File

@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
public class Day05_Tests public class Day05_Tests
{ {
private readonly string[] _example = { private readonly string[] _example = [
"seeds: 79 14 55 13", "seeds: 79 14 55 13",
"", "",
"seed-to-soil map:", "seed-to-soil map:",
@@ -36,13 +36,13 @@ public class Day05_Tests
"humidity-to-location map:", "humidity-to-location map:",
"60 56 37", "60 56 37",
"56 93 4", "56 93 4",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day05 day = new(); Day05 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("35", result); Assert.Equal("35", result);
@@ -52,7 +52,7 @@ public class Day05_Tests
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day05 day = new(); Day05 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("46", result); Assert.Equal("46", result);
@@ -61,22 +61,22 @@ public class Day05_Tests
[Fact] [Fact]
public void AlmanacMapping_ParseNext__Empty__Null() public void AlmanacMapping_ParseNext__Empty__Null()
{ {
Day05.LinesReader reader = new(Array.Empty<string>()); Day05.LinesReader reader = new([]);
Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader); Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader);
Assert.Null(mapping); Assert.Null(mapping);
} }
[Fact] [Fact]
public void AlmanacMapping_ParseNext__Example1() public void AlmanacMapping_ParseNext__Example1()
{ {
Day05.LinesReader reader = new(new[] { Day05.LinesReader reader = new([
"seed-to-soil map:", "seed-to-soil map:",
"50 98 2", "50 98 2",
"52 50 48", "52 50 48",
}); ]);
Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader); Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader);
Assert.NotNull(mapping); Assert.NotNull(mapping);
Assert.Equal("seed-to-soil", mapping.Name); Assert.Equal("seed-to-soil", mapping.Name);
Assert.Equal(2, mapping.RangeMappings.Count); Assert.Equal(2, mapping.RangeMappings.Count);
@@ -90,11 +90,11 @@ public class Day05_Tests
const long value1 = 100; const long value1 = 100;
long valueMapped1 = mapping.Apply(value1); long valueMapped1 = mapping.Apply(value1);
Assert.Equal(100, valueMapped1); Assert.Equal(100, valueMapped1);
const long value2 = 99; const long value2 = 99;
long valueMapped2 = mapping.Apply(value2); long valueMapped2 = mapping.Apply(value2);
Assert.Equal(51, valueMapped2); Assert.Equal(51, valueMapped2);
const long value3 = 45; const long value3 = 45;
long valueMapped3 = mapping.Apply(value3); long valueMapped3 = mapping.Apply(value3);
Assert.Equal(45, valueMapped3); Assert.Equal(45, valueMapped3);
@@ -109,7 +109,7 @@ public class Day05_Tests
DestinationStart = 1000, DestinationStart = 1000,
Length = 10, Length = 10,
}; };
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// #####......................... // #####.........................
Day05.AlmanacRangeMapping range_Lower = new() { Day05.AlmanacRangeMapping range_Lower = new() {
@@ -124,7 +124,7 @@ public class Day05_Tests
Assert.Equal(5, range_Lower_Result.PreClip.Value.Length); Assert.Equal(5, range_Lower_Result.PreClip.Value.Length);
Assert.Null(range_Lower_Result.Clipped); Assert.Null(range_Lower_Result.Clipped);
Assert.Null(range_Lower_Result.PostClip); Assert.Null(range_Lower_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// ##########.................... // ##########....................
Day05.AlmanacRangeMapping range_LowerTouching = new() { Day05.AlmanacRangeMapping range_LowerTouching = new() {
@@ -139,7 +139,7 @@ public class Day05_Tests
Assert.Equal(10, range_LowerTouching_Result.PreClip.Value.Length); Assert.Equal(10, range_LowerTouching_Result.PreClip.Value.Length);
Assert.Null(range_LowerTouching_Result.Clipped); Assert.Null(range_LowerTouching_Result.Clipped);
Assert.Null(range_LowerTouching_Result.PostClip); Assert.Null(range_LowerTouching_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// .........................##### // .........................#####
Day05.AlmanacRangeMapping range_Upper = new() { Day05.AlmanacRangeMapping range_Upper = new() {
@@ -154,7 +154,7 @@ public class Day05_Tests
Assert.Equal(25, range_Upper_Result.PostClip.Value.OriginStart); Assert.Equal(25, range_Upper_Result.PostClip.Value.OriginStart);
Assert.Equal(25, range_Upper_Result.PostClip.Value.DestinationStart); Assert.Equal(25, range_Upper_Result.PostClip.Value.DestinationStart);
Assert.Equal(5, range_Upper_Result.PostClip.Value.Length); Assert.Equal(5, range_Upper_Result.PostClip.Value.Length);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// ....................########## // ....................##########
Day05.AlmanacRangeMapping range_UpperTouching = new() { Day05.AlmanacRangeMapping range_UpperTouching = new() {
@@ -169,7 +169,7 @@ public class Day05_Tests
Assert.Equal(20, range_UpperTouching_Result.PostClip.Value.OriginStart); Assert.Equal(20, range_UpperTouching_Result.PostClip.Value.OriginStart);
Assert.Equal(20, range_UpperTouching_Result.PostClip.Value.DestinationStart); Assert.Equal(20, range_UpperTouching_Result.PostClip.Value.DestinationStart);
Assert.Equal(10, range_UpperTouching_Result.PostClip.Value.Length); Assert.Equal(10, range_UpperTouching_Result.PostClip.Value.Length);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// ..........$$$$$$$$$$.......... // ..........$$$$$$$$$$..........
Day05.AlmanacRangeMapping range_IntersectCover = new() { Day05.AlmanacRangeMapping range_IntersectCover = new() {
@@ -184,7 +184,7 @@ public class Day05_Tests
Assert.Equal(1000, range_IntersectCover_Result.Clipped.Value.DestinationStart); Assert.Equal(1000, range_IntersectCover_Result.Clipped.Value.DestinationStart);
Assert.Equal(10, range_IntersectCover_Result.Clipped.Value.Length); Assert.Equal(10, range_IntersectCover_Result.Clipped.Value.Length);
Assert.Null(range_IntersectCover_Result.PostClip); Assert.Null(range_IntersectCover_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// ...............$$$$$.......... // ...............$$$$$..........
Day05.AlmanacRangeMapping range_IntersectInsideToEnd = new() { Day05.AlmanacRangeMapping range_IntersectInsideToEnd = new() {
@@ -199,7 +199,7 @@ public class Day05_Tests
Assert.Equal(1005, range_IntersectInsideToEnd_Result.Clipped.Value.DestinationStart); Assert.Equal(1005, range_IntersectInsideToEnd_Result.Clipped.Value.DestinationStart);
Assert.Equal(5, range_IntersectInsideToEnd_Result.Clipped.Value.Length); Assert.Equal(5, range_IntersectInsideToEnd_Result.Clipped.Value.Length);
Assert.Null(range_IntersectInsideToEnd_Result.PostClip); Assert.Null(range_IntersectInsideToEnd_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// ...............$$$$$#####..... // ...............$$$$$#####.....
Day05.AlmanacRangeMapping range_IntersectInsideToOutside = new() { Day05.AlmanacRangeMapping range_IntersectInsideToOutside = new() {
@@ -217,7 +217,7 @@ public class Day05_Tests
Assert.Equal(20, range_IntersectInsideToOutside_Result.PostClip.Value.OriginStart); Assert.Equal(20, range_IntersectInsideToOutside_Result.PostClip.Value.OriginStart);
Assert.Equal(20, range_IntersectInsideToOutside_Result.PostClip.Value.DestinationStart); Assert.Equal(20, range_IntersectInsideToOutside_Result.PostClip.Value.DestinationStart);
Assert.Equal(5, range_IntersectInsideToOutside_Result.PostClip.Value.Length); Assert.Equal(5, range_IntersectInsideToOutside_Result.PostClip.Value.Length);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// .....#####$$$$$............... // .....#####$$$$$...............
Day05.AlmanacRangeMapping range_IntersectOutsideToInside = new() { Day05.AlmanacRangeMapping range_IntersectOutsideToInside = new() {
@@ -235,7 +235,7 @@ public class Day05_Tests
Assert.Equal(1000, range_IntersectOutsideToInside_Result.Clipped.Value.DestinationStart); Assert.Equal(1000, range_IntersectOutsideToInside_Result.Clipped.Value.DestinationStart);
Assert.Equal(5, range_IntersectOutsideToInside_Result.Clipped.Value.Length); Assert.Equal(5, range_IntersectOutsideToInside_Result.Clipped.Value.Length);
Assert.Null(range_IntersectOutsideToInside_Result.PostClip); Assert.Null(range_IntersectOutsideToInside_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// .....#####$$$$$$$$$$.......... // .....#####$$$$$$$$$$..........
Day05.AlmanacRangeMapping range_IntersectOutsideToEnd = new() { Day05.AlmanacRangeMapping range_IntersectOutsideToEnd = new() {
@@ -253,7 +253,7 @@ public class Day05_Tests
Assert.Equal(1000, range_IntersectOutsideToEnd_Result.Clipped.Value.DestinationStart); Assert.Equal(1000, range_IntersectOutsideToEnd_Result.Clipped.Value.DestinationStart);
Assert.Equal(10, range_IntersectOutsideToEnd_Result.Clipped.Value.Length); Assert.Equal(10, range_IntersectOutsideToEnd_Result.Clipped.Value.Length);
Assert.Null(range_IntersectOutsideToEnd_Result.PostClip); Assert.Null(range_IntersectOutsideToEnd_Result.PostClip);
// ..........■■■■■■■■■■.......... // ..........■■■■■■■■■■..........
// .....#####$$$$$$$$$$#####..... // .....#####$$$$$$$$$$#####.....
Day05.AlmanacRangeMapping range_IntersectOutsideToOutside = new() { Day05.AlmanacRangeMapping range_IntersectOutsideToOutside = new() {

View File

@@ -2,16 +2,16 @@ namespace AdventOfCode2023.Tests;
public class Day06_Tests public class Day06_Tests
{ {
private readonly string[] _example = { private readonly string[] _example = [
"Time: 7 15 30", "Time: 7 15 30",
"Distance: 9 40 200", "Distance: 9 40 200",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day06 day = new(); Day06 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("288", result); Assert.Equal("288", result);
@@ -21,7 +21,7 @@ public class Day06_Tests
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day06 day = new(); Day06 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("71503", result); Assert.Equal("71503", result);

View File

@@ -2,19 +2,19 @@ namespace AdventOfCode2023.Tests;
public class Day07_Tests public class Day07_Tests
{ {
private readonly string[] _example = { private readonly string[] _example = [
"32T3K 765", "32T3K 765",
"T55J5 684", "T55J5 684",
"KK677 28", "KK677 28",
"KTJJT 220", "KTJJT 220",
"QQQJA 483", "QQQJA 483",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day07 day = new(); Day07 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("6440", result); Assert.Equal("6440", result);
@@ -24,7 +24,7 @@ public class Day07_Tests
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day07 day = new(); Day07 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("5905", result); Assert.Equal("5905", result);
@@ -35,26 +35,26 @@ public class Day07_Tests
{ {
Day07.CamelCard card_FiveOfAKind = new("AAAAA"); Day07.CamelCard card_FiveOfAKind = new("AAAAA");
Assert.Equal(Day07.CamelCard.Types.FiveOfAKind, card_FiveOfAKind.Type); Assert.Equal(Day07.CamelCard.Types.FiveOfAKind, card_FiveOfAKind.Type);
Day07.CamelCard card_FourOfAKind = new("AA8AA"); Day07.CamelCard card_FourOfAKind = new("AA8AA");
Assert.Equal(Day07.CamelCard.Types.FourOfAKind, card_FourOfAKind.Type); Assert.Equal(Day07.CamelCard.Types.FourOfAKind, card_FourOfAKind.Type);
Day07.CamelCard card_FullHouse = new("23332"); Day07.CamelCard card_FullHouse = new("23332");
Assert.Equal(Day07.CamelCard.Types.FullHouse, card_FullHouse.Type); Assert.Equal(Day07.CamelCard.Types.FullHouse, card_FullHouse.Type);
Day07.CamelCard card_ThreeOfAKind = new("TTT98"); Day07.CamelCard card_ThreeOfAKind = new("TTT98");
Assert.Equal(Day07.CamelCard.Types.ThreeOfAKind, card_ThreeOfAKind.Type); Assert.Equal(Day07.CamelCard.Types.ThreeOfAKind, card_ThreeOfAKind.Type);
Day07.CamelCard card_TwoPair = new("23432"); Day07.CamelCard card_TwoPair = new("23432");
Assert.Equal(Day07.CamelCard.Types.TwoPair, card_TwoPair.Type); Assert.Equal(Day07.CamelCard.Types.TwoPair, card_TwoPair.Type);
Day07.CamelCard card_OnePair = new("A23A4"); Day07.CamelCard card_OnePair = new("A23A4");
Assert.Equal(Day07.CamelCard.Types.OnePair, card_OnePair.Type); Assert.Equal(Day07.CamelCard.Types.OnePair, card_OnePair.Type);
Day07.CamelCard card_HighCard = new("23456"); Day07.CamelCard card_HighCard = new("23456");
Assert.Equal(Day07.CamelCard.Types.HighCard, card_HighCard.Type); Assert.Equal(Day07.CamelCard.Types.HighCard, card_HighCard.Type);
} }
[Fact] [Fact]
public void CamelCard_CompareTo__Examples() public void CamelCard_CompareTo__Examples()
{ {
@@ -62,7 +62,7 @@ public class Day07_Tests
Day07.CamelCard card_02 = new("2AAAA"); Day07.CamelCard card_02 = new("2AAAA");
Assert.Equal(-1, card_01.CompareTo(card_02)); Assert.Equal(-1, card_01.CompareTo(card_02));
Assert.Equal(1, card_02.CompareTo(card_01)); Assert.Equal(1, card_02.CompareTo(card_01));
Day07.CamelCard card_77888 = new("77888"); Day07.CamelCard card_77888 = new("77888");
Day07.CamelCard card_77788 = new("77788"); Day07.CamelCard card_77788 = new("77788");
Assert.Equal(-1, card_77888.CompareTo(card_77788)); Assert.Equal(-1, card_77888.CompareTo(card_77788));

View File

@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
public class Day08_Tests public class Day08_Tests
{ {
private readonly string[] _example1 = { private readonly string[] _example1 = [
"RL", "RL",
"", "",
"AAA = (BBB, CCC)", "AAA = (BBB, CCC)",
@@ -12,37 +12,37 @@ public class Day08_Tests
"EEE = (EEE, EEE)", "EEE = (EEE, EEE)",
"GGG = (GGG, GGG)", "GGG = (GGG, GGG)",
"ZZZ = (ZZZ, ZZZ)", "ZZZ = (ZZZ, ZZZ)",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()
{ {
Day08 day = new(); Day08 day = new();
string result = day.ResolvePart1(_example1); string result = day.ResolvePart1(_example1);
Assert.Equal("2", result); Assert.Equal("2", result);
} }
private readonly string[] _example2 = { private readonly string[] _example2 = [
"LLR", "LLR",
"", "",
"AAA = (BBB, BBB)", "AAA = (BBB, BBB)",
"BBB = (AAA, ZZZ)", "BBB = (AAA, ZZZ)",
"ZZZ = (ZZZ, ZZZ)", "ZZZ = (ZZZ, ZZZ)",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example2() public void ResolvePart1__Example2()
{ {
Day08 day = new(); Day08 day = new();
string result = day.ResolvePart1(_example2); string result = day.ResolvePart1(_example2);
Assert.Equal("6", result); Assert.Equal("6", result);
} }
private readonly string[] _example3 = { private readonly string[] _example3 = [
"LR", "LR",
"", "",
"11A = (11B, XXX)", "11A = (11B, XXX)",
@@ -53,16 +53,15 @@ public class Day08_Tests
"22C = (22Z, 22Z)", "22C = (22Z, 22Z)",
"22Z = (22B, 22B)", "22Z = (22B, 22B)",
"XXX = (XXX, XXX)", "XXX = (XXX, XXX)",
}; ];
[Fact] [Fact]
public void ResolvePart2__Example3() public void ResolvePart2__Example3()
{ {
Day08 day = new(); Day08 day = new();
string result = day.ResolvePart2(_example3); string result = day.ResolvePart2(_example3);
Assert.Equal("6", result); Assert.Equal("6", result);
} }
} }

View File

@@ -2,17 +2,17 @@ namespace AdventOfCode2023.Tests;
public class Day09_Tests public class Day09_Tests
{ {
private readonly string[] _example = { private readonly string[] _example = [
"0 3 6 9 12 15", "0 3 6 9 12 15",
"1 3 6 10 15 21", "1 3 6 10 15 21",
"10 13 16 21 30 45", "10 13 16 21 30 45",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example() public void ResolvePart1__Example()
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart1(_example); string result = day.ResolvePart1(_example);
Assert.Equal("114", result); Assert.Equal("114", result);
@@ -22,7 +22,7 @@ public class Day09_Tests
public void ResolvePart2__Example() public void ResolvePart2__Example()
{ {
Day09 day = new(); Day09 day = new();
string result = day.ResolvePart2(_example); string result = day.ResolvePart2(_example);
Assert.Equal("2", result); Assert.Equal("2", result);
@@ -35,7 +35,7 @@ public class Day09_Tests
long result = extrapolator.Extrapolate(); long result = extrapolator.Extrapolate();
Assert.Equal(18, result); Assert.Equal(18, result);
} }
[Fact] [Fact]
public void Extrapolator_Extrapolate__Example2() public void Extrapolator_Extrapolate__Example2()
{ {
@@ -43,7 +43,7 @@ public class Day09_Tests
long result = extrapolator.Extrapolate(); long result = extrapolator.Extrapolate();
Assert.Equal(28, result); Assert.Equal(28, result);
} }
[Fact] [Fact]
public void Extrapolator_Extrapolate__Example3() public void Extrapolator_Extrapolate__Example3()
{ {
@@ -59,7 +59,7 @@ public class Day09_Tests
long result = extrapolator.ExtrapolatePast(); long result = extrapolator.ExtrapolatePast();
Assert.Equal(-3, result); Assert.Equal(-3, result);
} }
[Fact] [Fact]
public void Extrapolator_ExtrapolatePast__Example2() public void Extrapolator_ExtrapolatePast__Example2()
{ {
@@ -67,7 +67,7 @@ public class Day09_Tests
long result = extrapolator.ExtrapolatePast(); long result = extrapolator.ExtrapolatePast();
Assert.Equal(0, result); Assert.Equal(0, result);
} }
[Fact] [Fact]
public void Extrapolator_ExtrapolatePast__Example3() public void Extrapolator_ExtrapolatePast__Example3()
{ {

View File

@@ -2,25 +2,25 @@ namespace AdventOfCode2023.Tests;
public class Day10_Tests public class Day10_Tests
{ {
private readonly string[] _example1 = { private readonly string[] _example1 = [
"7-F7-", "7-F7-",
".FJ|7", ".FJ|7",
"SJLL7", "SJLL7",
"|F--J", "|F--J",
"LJ.LJ", "LJ.LJ",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()
{ {
Day10 day = new(); Day10 day = new();
string result = day.ResolvePart1(_example1); string result = day.ResolvePart1(_example1);
Assert.Equal("8", result); Assert.Equal("8", result);
} }
private readonly string[] _example2 = { private readonly string[] _example2 = [
"...........", "...........",
".S-------7.", ".S-------7.",
".|F-----7|.", ".|F-----7|.",
@@ -30,20 +30,20 @@ public class Day10_Tests
".|..|.|..|.", ".|..|.|..|.",
".L--J.L--J.", ".L--J.L--J.",
"...........", "...........",
}; ];
[Fact] [Fact]
public void ResolvePart2__Example2() public void ResolvePart2__Example2()
{ {
Day10 day = new(); Day10 day = new();
string result = day.ResolvePart2(_example2); string result = day.ResolvePart2(_example2);
Assert.Equal("4", result); Assert.Equal("4", result);
} }
private readonly string[] _example3 = { private readonly string[] _example3 = [
"FF7FSF7F7F7F7F7F---7", "FF7FSF7F7F7F7F7F---7",
"L|LJ||||||||||||F--J", "L|LJ||||||||||||F--J",
"FL-7LJLJ||||||LJL-77", "FL-7LJLJ||||||LJL-77",
@@ -54,13 +54,13 @@ public class Day10_Tests
"7-L-JL7||F7|L7F-7F7|", "7-L-JL7||F7|L7F-7F7|",
"L.L7LFJ|||||FJL7||LJ", "L.L7LFJ|||||FJL7||LJ",
"L7JLJL-JLJLJL--JLJ.L", "L7JLJL-JLJLJL--JLJ.L",
}; ];
[Fact] [Fact]
public void ResolvePart2__Example3() public void ResolvePart2__Example3()
{ {
Day10 day = new(); Day10 day = new();
string result = day.ResolvePart2(_example3); string result = day.ResolvePart2(_example3);
Assert.Equal("10", result); Assert.Equal("10", result);

View File

@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
public class Day11_Tests public class Day11_Tests
{ {
private readonly string[] _example1 = { private readonly string[] _example1 = [
"...#......", "...#......",
".......#..", ".......#..",
"#.........", "#.........",
@@ -13,16 +13,15 @@ public class Day11_Tests
"..........", "..........",
".......#..", ".......#..",
"#...#.....", "#...#.....",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()
{ {
Day11 day = new(); Day11 day = new();
string result = day.ResolvePart1(_example1); string result = day.ResolvePart1(_example1);
Assert.Equal("374", result); Assert.Equal("374", result);
} }
} }

View File

@@ -2,14 +2,14 @@ namespace AdventOfCode2023.Tests;
public class Day12_Tests public class Day12_Tests
{ {
private readonly string[] _example1 = { private readonly string[] _example1 = [
"???.### 1,1,3", "???.### 1,1,3",
".??..??...?##. 1,1,3", ".??..??...?##. 1,1,3",
"?#?#?#?#?#?#?#? 1,3,1,6", "?#?#?#?#?#?#?#? 1,3,1,6",
"????.#...#... 4,1,1", "????.#...#... 4,1,1",
"????.######..#####. 1,6,5", "????.######..#####. 1,6,5",
"?###???????? 3,2,1", "?###???????? 3,2,1",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()

View File

@@ -10,14 +10,14 @@ namespace AdventOfCode2023.Tests;
public class Day24_Tests public class Day24_Tests
{ {
private string[] _example1 = { private string[] _example1 = [
"19, 13, 30 @ -2, 1, -2", "19, 13, 30 @ -2, 1, -2",
"18, 19, 22 @ -1, -1, -2", "18, 19, 22 @ -1, -1, -2",
"20, 25, 34 @ -2, -2, -4", "20, 25, 34 @ -2, -2, -4",
"12, 31, 28 @ -1, -2, -1", "12, 31, 28 @ -1, -2, -1",
"20, 19, 15 @ 1, -5, -3", "20, 19, 15 @ 1, -5, -3",
}; ];
[Fact] [Fact]
public void ResolvePart1__Example1() public void ResolvePart1__Example1()
{ {
@@ -36,36 +36,35 @@ public class Day24_Tests
Day24.Hail hailC = new("20, 25, 34 @ -2, -2, -4"); Day24.Hail hailC = new("20, 25, 34 @ -2, -2, -4");
Day24.Hail hailD = new("12, 31, 28 @ -1, -2, -1"); Day24.Hail hailD = new("12, 31, 28 @ -1, -2, -1");
Day24.Hail hailE = new("20, 19, 15 @ 1, -5, -3"); Day24.Hail hailE = new("20, 19, 15 @ 1, -5, -3");
(bool intersect_A_B, _, _, _) = hailA.Intersect2D(hailB); (bool intersect_A_B, _, _, _) = hailA.Intersect2D(hailB);
Assert.True(intersect_A_B); Assert.True(intersect_A_B);
(bool intersect_A_C, _, _, _) = hailA.Intersect2D(hailC); (bool intersect_A_C, _, _, _) = hailA.Intersect2D(hailC);
Assert.True(intersect_A_C); Assert.True(intersect_A_C);
(bool intersect_A_D, _, _, _) = hailA.Intersect2D(hailD); (bool intersect_A_D, _, _, _) = hailA.Intersect2D(hailD);
Assert.True(intersect_A_D); Assert.True(intersect_A_D);
(bool intersect_A_E, _, _, _) = hailA.Intersect2D(hailE); (bool intersect_A_E, _, _, _) = hailA.Intersect2D(hailE);
Assert.True(intersect_A_E); Assert.True(intersect_A_E);
(bool intersect_B_C, _, _, _) = hailB.Intersect2D(hailC); (bool intersect_B_C, _, _, _) = hailB.Intersect2D(hailC);
Assert.False(intersect_B_C); Assert.False(intersect_B_C);
(bool intersect_B_D, _, _, _) = hailB.Intersect2D(hailD); (bool intersect_B_D, _, _, _) = hailB.Intersect2D(hailD);
Assert.True(intersect_B_D); Assert.True(intersect_B_D);
(bool intersect_B_E, _, _, _) = hailB.Intersect2D(hailE); (bool intersect_B_E, _, _, _) = hailB.Intersect2D(hailE);
Assert.True(intersect_B_E); Assert.True(intersect_B_E);
(bool intersect_C_D, _, _, _) = hailC.Intersect2D(hailD); (bool intersect_C_D, _, _, _) = hailC.Intersect2D(hailD);
Assert.True(intersect_C_D); Assert.True(intersect_C_D);
(bool intersect_C_E, _, _, _) = hailC.Intersect2D(hailE); (bool intersect_C_E, _, _, _) = hailC.Intersect2D(hailE);
Assert.True(intersect_C_E); Assert.True(intersect_C_E);
(bool intersect_D_E, _, _, _) = hailD.Intersect2D(hailE); (bool intersect_D_E, _, _, _) = hailD.Intersect2D(hailE);
Assert.True(intersect_D_E); Assert.True(intersect_D_E);
} }
} }

View File

@@ -2,10 +2,10 @@
<PropertyGroup> <PropertyGroup>
<OutputType>Exe</OutputType> <OutputType>Exe</OutputType>
<TargetFramework>net7.0</TargetFramework> <TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings> <ImplicitUsings>enable</ImplicitUsings>
<RootNamespace>AdventOfCode2023</RootNamespace>
<Nullable>enable</Nullable> <Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2023</RootNamespace>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
@@ -15,7 +15,7 @@
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" /> <ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
</ItemGroup> </ItemGroup>
</Project> </Project>

View File

@@ -78,7 +78,7 @@ public class Day01 : IDay
public string ResolvePart2(string[] inputs) public string ResolvePart2(string[] inputs)
{ {
List<(string Text, int Value)> digits = new() { List<(string Text, int Value)> digits = [
("1", 1), ("1", 1),
("2", 2), ("2", 2),
("3", 3), ("3", 3),
@@ -97,7 +97,7 @@ public class Day01 : IDay
("seven", 7), ("seven", 7),
("eight", 8), ("eight", 8),
("nine", 9), ("nine", 9),
}; ];
int sum = 0; int sum = 0;
foreach (string line in inputs) foreach (string line in inputs)

View File

@@ -102,7 +102,7 @@ public class Day03 : IDay
for (column = 0; column < inputs[row].Length; column++) for (column = 0; column < inputs[row].Length; column++)
{ {
if (inputs[row][column] != '*') { continue; } if (inputs[row][column] != '*') { continue; }
List<SchemaNumber> adjacentNumbers = numbers.Where(n => CellAdjacentToSchemaNumber(row, column, n)).ToList(); List<SchemaNumber> adjacentNumbers = numbers.Where(n => CellAdjacentToSchemaNumber(row, column, n)).ToList();
if (adjacentNumbers.Count != 2) { continue; } if (adjacentNumbers.Count != 2) { continue; }
@@ -115,11 +115,11 @@ public class Day03 : IDay
public struct SchemaNumber public struct SchemaNumber
{ {
public string[] Schema { get; set; } public string[] Schema { get; init; }
public int Row { get; set; } public int Row { get; init; }
public int Column { get; set; } public int Column { get; init; }
public int Lenght { get; set; } public int Lenght { get; init; }
public int Value { get; set; } public int Value { get; init; }
} }
public static SchemaNumber? SearchNextSchemaNumber(string[] schema, int initialRow, int initialColumn) public static SchemaNumber? SearchNextSchemaNumber(string[] schema, int initialRow, int initialColumn)
@@ -176,7 +176,7 @@ public class Day03 : IDay
} }
return false; return false;
} }
private static bool CellAdjacentToSchemaNumber(int row, int column, SchemaNumber number) private static bool CellAdjacentToSchemaNumber(int row, int column, SchemaNumber number)
{ {
int minRow = number.Row - 1; int minRow = number.Row - 1;
@@ -188,8 +188,7 @@ public class Day03 : IDay
{ {
return true; return true;
} }
return false; return false;
} }
} }

View File

@@ -118,7 +118,7 @@ public class Day04 : IDay
_winningNumbers = GetNumbers(strColumns[0]); _winningNumbers = GetNumbers(strColumns[0]);
_myNumbers = GetNumbers(strColumns[1]); _myNumbers = GetNumbers(strColumns[1]);
} }
private static List<int> GetNumbers(string strNumbers) private static List<int> GetNumbers(string strNumbers)
{ {
string[] parts = strNumbers.Split(' '); string[] parts = strNumbers.Split(' ');
@@ -135,6 +135,5 @@ public class Day04 : IDay
{ {
return _myNumbers.Count(myNumber => _winningNumbers.Contains(myNumber)); return _myNumbers.Count(myNumber => _winningNumbers.Contains(myNumber));
} }
} }
} }

View File

@@ -136,7 +136,7 @@ public class Day05 : IDay
LinesReader reader = new(inputs); LinesReader reader = new(inputs);
Almanac? almanac = Almanac.Parse(reader); Almanac? almanac = Almanac.Parse(reader);
int i = 0; int i = 0;
List<AlmanacRangeMapping> ranges = new(); List<AlmanacRangeMapping> ranges = [];
while (almanac?.Seeds.Count > i) while (almanac?.Seeds.Count > i)
{ {
long seed = almanac.Seeds[i]; long seed = almanac.Seeds[i];
@@ -155,21 +155,14 @@ public class Day05 : IDay
} }
public class LinesReader public class LinesReader(string[] lines)
{ {
private readonly string[] _lines;
private int _index; private int _index;
public LinesReader(string[] lines)
{
_lines = lines;
_index = 0;
}
public string? GetLine() public string? GetLine()
{ {
if (_index >= _lines.Length) { return null; } if (_index >= lines.Length) { return null; }
string line = _lines[_index]; string line = lines[_index];
_index++; _index++;
return line; return line;
} }
@@ -298,7 +291,7 @@ public class Day05 : IDay
{ {
public string Name { get; private init; } = string.Empty; public string Name { get; private init; } = string.Empty;
public List<AlmanacRangeMapping> RangeMappings { get; } = new(); public List<AlmanacRangeMapping> RangeMappings { get; } = [];
public static AlmanacMapping? ParseNext(LinesReader reader) public static AlmanacMapping? ParseNext(LinesReader reader)
{ {
@@ -346,29 +339,32 @@ public class Day05 : IDay
public List<AlmanacRangeMapping> Apply(AlmanacRangeMapping range) public List<AlmanacRangeMapping> Apply(AlmanacRangeMapping range)
{ {
List<AlmanacRangeMapping> unMappedRanges = new() { List<AlmanacRangeMapping> unMappedRanges = [
range, range,
}; ];
List<AlmanacRangeMapping> newUnMappedRanges = new(); List<AlmanacRangeMapping> newUnMappedRanges = [];
List<AlmanacRangeMapping> mappedRanges = new(); List<AlmanacRangeMapping> mappedRanges = [];
int i = 0; int i = 0;
while (RangeMappings.Count > i) while (RangeMappings.Count > i)
{ {
AlmanacRangeMapping rangeMapping = RangeMappings[i]; AlmanacRangeMapping rangeMapping = RangeMappings[i];
for (int j = 0; j < unMappedRanges.Count; j++) foreach (AlmanacRangeMapping unMappedRange in unMappedRanges)
{ {
AlmanacRangeMapping.ClipResult result = rangeMapping.Clip(unMappedRanges[j]); AlmanacRangeMapping.ClipResult result = rangeMapping.Clip(unMappedRange);
if (result.Clipped != null) { mappedRanges.Add(result.Clipped.Value); } if (result.Clipped != null) { mappedRanges.Add(result.Clipped.Value); }
if (result.PreClip != null) { newUnMappedRanges.Add(result.PreClip.Value); } if (result.PreClip != null) { newUnMappedRanges.Add(result.PreClip.Value); }
if (result.PostClip != null) { newUnMappedRanges.Add(result.PostClip.Value); } if (result.PostClip != null) { newUnMappedRanges.Add(result.PostClip.Value); }
} }
unMappedRanges = newUnMappedRanges; unMappedRanges = newUnMappedRanges;
newUnMappedRanges = new List<AlmanacRangeMapping>(); newUnMappedRanges = [];
i++; i++;
} }
return mappedRanges.Union(unMappedRanges).ToList(); List<AlmanacRangeMapping> resultMappedRanges = [];
resultMappedRanges.AddRange(mappedRanges);
resultMappedRanges.AddRange(unMappedRanges);
return resultMappedRanges;
} }
} }
@@ -381,7 +377,7 @@ public class Day05 : IDay
public List<long> Seeds { get; } public List<long> Seeds { get; }
private List<AlmanacMapping> Mappings { get; } = new(); private List<AlmanacMapping> Mappings { get; } = [];
public static Almanac? Parse(LinesReader reader) public static Almanac? Parse(LinesReader reader)
{ {

View File

@@ -114,9 +114,9 @@ public class Day07 : IDay
public class CamelCard public class CamelCard
{ {
private readonly static char[] Labels = { 'A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2' }; private readonly static char[] Labels = ['A', 'K', 'Q', 'J', 'T', '9', '8', '7', '6', '5', '4', '3', '2'];
private readonly static char[] LabelsWithJoker = { 'A', 'K', 'Q', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'J' }; private readonly static char[] LabelsWithJoker = ['A', 'K', 'Q', 'T', '9', '8', '7', '6', '5', '4', '3', '2', 'J'];
private const char JokerLabel = 'J'; private const char JokerLabel = 'J';
public enum Types public enum Types
@@ -174,7 +174,7 @@ public class Day07 : IDay
dictLabelCounts.Add(JokerLabel, 5); dictLabelCounts.Add(JokerLabel, 5);
} }
} }
if (dictLabelCounts.Count == 1) { return Types.FiveOfAKind; } if (dictLabelCounts.Count == 1) { return Types.FiveOfAKind; }
if (dictLabelCounts.Count == 5) { return Types.HighCard; } if (dictLabelCounts.Count == 5) { return Types.HighCard; }
if (dictLabelCounts.Count == 2) if (dictLabelCounts.Count == 2)

View File

@@ -105,18 +105,11 @@ public class Day08 : IDay
return steps.ToString(); return steps.ToString();
} }
private class MapNode private class MapNode(string strMapNode)
{ {
public string Key { get; set; } public string Key { get; } = strMapNode.Substring(0, 3);
public string LeftKey { get; set; } public string LeftKey { get; } = strMapNode.Substring(7, 3);
public string RightKey { get; set; } public string RightKey { get; } = strMapNode.Substring(12, 3);
public MapNode(string strMapNode)
{
Key = strMapNode.Substring(0, 3);
LeftKey = strMapNode.Substring(7, 3);
RightKey = strMapNode.Substring(12, 3);
}
} }
private class Map private class Map
@@ -155,32 +148,23 @@ public class Day08 : IDay
} }
} }
private class MapWalker private class MapWalker(Map map, string startKey)
{ {
private readonly Map _map; private MapNode _currentNode = map.GetByKey(startKey) ?? map.Nodes.First();
private MapNode _currentNode;
private long _steps; private long _steps;
public MapWalker(Map map, string startKey)
{
_map = map;
_currentNode = map.GetByKey(startKey) ?? map.Nodes.First();
_steps = 0;
}
public void StepWhile(Func<MapWalker, bool> condition) public void StepWhile(Func<MapWalker, bool> condition)
{ {
while (condition(this)) while (condition(this))
{ {
char leftRightInstruction = _map.GetInstruction(_steps); char leftRightInstruction = map.GetInstruction(_steps);
if (leftRightInstruction == 'L') if (leftRightInstruction == 'L')
{ {
_currentNode = _map.GetByKey(_currentNode.LeftKey) ?? _map.Nodes.First(); _currentNode = map.GetByKey(_currentNode.LeftKey) ?? map.Nodes.First();
} }
if (leftRightInstruction == 'R') if (leftRightInstruction == 'R')
{ {
_currentNode = _map.GetByKey(_currentNode.RightKey) ?? _map.Nodes.First(); _currentNode = map.GetByKey(_currentNode.RightKey) ?? map.Nodes.First();
} }
_steps++; _steps++;
} }
@@ -196,7 +180,7 @@ public class Day08 : IDay
get { return _steps; } get { return _steps; }
} }
} }
// https://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations // https://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations
private static long GreatestCommonDivisor(long a, long b) private static long GreatestCommonDivisor(long a, long b)
{ {

View File

@@ -164,15 +164,15 @@ public class Day09 : IDay
return newLastNumber; return newLastNumber;
} }
public long ExtrapolatePast() public long ExtrapolatePast()
{ {
_derivatives.Last().Insert(0,0); _derivatives.Last().Insert(0, 0);
for (int i = _derivatives.Count - 2; i >= 0; i--) for (int i = _derivatives.Count - 2; i >= 0; i--)
{ {
long firstDerivative1 = _derivatives[i].First(); long firstDerivative1 = _derivatives[i].First();
long firstDerivative0 = _derivatives[i + 1].First(); long firstDerivative0 = _derivatives[i + 1].First();
_derivatives[i].Insert(0,firstDerivative1 - firstDerivative0); _derivatives[i].Insert(0, firstDerivative1 - firstDerivative0);
} }
long firstNumber = _numbers.First(); long firstNumber = _numbers.First();
long firstDerivative = _derivatives[0].First(); long firstDerivative = _derivatives[0].First();

View File

@@ -228,16 +228,10 @@ public class Day10 : IDay
return countInside.ToString(); return countInside.ToString();
} }
private struct Point private struct Point(int x, int y)
{ {
public int X; public int X = x;
public int Y; public int Y = y;
public Point(int x, int y)
{
X = x;
Y = y;
}
} }
private class PipeMaze private class PipeMaze
@@ -323,7 +317,7 @@ public class Day10 : IDay
x: point.X + 1, x: point.X + 1,
y: point.Y); y: point.Y);
} }
if(point.Y == prevPoint.Y && prevPoint.X > point.X) if (point.Y == prevPoint.Y && prevPoint.X > point.X)
{ {
return new Point( return new Point(
x: point.X, x: point.X,
@@ -339,7 +333,7 @@ public class Day10 : IDay
x: point.X - 1, x: point.X - 1,
y: point.Y); y: point.Y);
} }
if(point.Y == prevPoint.Y && prevPoint.X < point.X) if (point.Y == prevPoint.Y && prevPoint.X < point.X)
{ {
return new Point( return new Point(
x: point.X, x: point.X,
@@ -355,7 +349,7 @@ public class Day10 : IDay
x: point.X - 1, x: point.X - 1,
y: point.Y); y: point.Y);
} }
if(point.Y == prevPoint.Y && prevPoint.X < point.X) if (point.Y == prevPoint.Y && prevPoint.X < point.X)
{ {
return new Point( return new Point(
x: point.X, x: point.X,
@@ -371,7 +365,7 @@ public class Day10 : IDay
x: point.X + 1, x: point.X + 1,
y: point.Y); y: point.Y);
} }
if(point.Y == prevPoint.Y && prevPoint.X > point.X) if (point.Y == prevPoint.Y && prevPoint.X > point.X)
{ {
return new Point( return new Point(
x: point.X, x: point.X,
@@ -397,7 +391,7 @@ public class Day10 : IDay
{ {
Point? nextPoint = FollowPipe(point, prevPoint); Point? nextPoint = FollowPipe(point, prevPoint);
if (nextPoint == null) { break; } if (nextPoint == null) { break; }
distance++; distance++;
int? currentDistance = GetDistance(point); int? currentDistance = GetDistance(point);
if (currentDistance > distance || currentDistance == null) if (currentDistance > distance || currentDistance == null)
@@ -409,7 +403,7 @@ public class Day10 : IDay
point = nextPoint.Value; point = nextPoint.Value;
} while (true); } while (true);
} }
public int GetMaxDistance() public int GetMaxDistance()
{ {
int max = int.MinValue; int max = int.MinValue;
@@ -438,10 +432,10 @@ public class Day10 : IDay
private char CalculateCell(Point point) private char CalculateCell(Point point)
{ {
Point? pointRight =FollowPipe(new Point(point.X + 1, point.Y), point); Point? pointRight = FollowPipe(new Point(point.X + 1, point.Y), point);
Point? pointLeft =FollowPipe(new Point(point.X - 1, point.Y), point); Point? pointLeft = FollowPipe(new Point(point.X - 1, point.Y), point);
Point? pointDown =FollowPipe(new Point(point.X, point.Y + 1), point); Point? pointDown = FollowPipe(new Point(point.X, point.Y + 1), point);
Point? pointUp =FollowPipe(new Point(point.X, point.Y - 1), point); Point? pointUp = FollowPipe(new Point(point.X, point.Y - 1), point);
if (pointRight != null && pointLeft == null && pointDown != null && pointUp == null) if (pointRight != null && pointLeft == null && pointDown != null && pointUp == null)
{ {
return 'F'; return 'F';
@@ -507,12 +501,12 @@ public class Day10 : IDay
} }
else if (cell == 'J') else if (cell == 'J')
{ {
if(cellStart == 'F') if (cellStart == 'F')
{ {
inside = inside != true; inside = inside != true;
cellStart = null; cellStart = null;
} }
else if(cellStart == 'L') else if (cellStart == 'L')
{ {
cellStart = null; cellStart = null;
} }
@@ -523,23 +517,23 @@ public class Day10 : IDay
{ {
cellStart = 'F'; cellStart = 'F';
} }
else if(cellStart == 'J') else if (cellStart == 'J')
{ {
inside = inside != true; inside = inside != true;
cellStart = null; cellStart = null;
} }
else if(cellStart == '7') else if (cellStart == '7')
{ {
cellStart = null; cellStart = null;
} }
} }
else if (cell == '7') else if (cell == '7')
{ {
if(cellStart == 'F') if (cellStart == 'F')
{ {
cellStart = null; cellStart = null;
} }
else if(cellStart == 'L') else if (cellStart == 'L')
{ {
inside = inside != true; inside = inside != true;
cellStart = null; cellStart = null;
@@ -551,11 +545,11 @@ public class Day10 : IDay
{ {
cellStart = 'L'; cellStart = 'L';
} }
else if(cellStart == 'J') else if (cellStart == 'J')
{ {
cellStart = null; cellStart = null;
} }
else if(cellStart == '7') else if (cellStart == '7')
{ {
inside = inside != true; inside = inside != true;
cellStart = null; cellStart = null;

View File

@@ -130,8 +130,8 @@ public class Day11 : IDay
private struct Point private struct Point
{ {
public long X { get; set; } public long X { get; init; }
public long Y { get; set; } public long Y { get; init; }
} }
private class GalaxyMap private class GalaxyMap

View File

@@ -1,4 +1,3 @@
using System.Text;
namespace AdventOfCode2023; namespace AdventOfCode2023;
@@ -212,7 +211,7 @@ public class Day12 : IDay
{ {
throw new Exception("Invalid input"); throw new Exception("Invalid input");
} }
if (springsRecord.Length < damagedSprings[0]) if (springsRecord.Length < damagedSprings[0])
{ {
// Invalid match; Not enough data on record for the current damagedSprings group // Invalid match; Not enough data on record for the current damagedSprings group
@@ -230,7 +229,7 @@ public class Day12 : IDay
// Skip current damagedSprings group // Skip current damagedSprings group
return CountPossibleArrangements(springsRecord.Substring(damagedSprings[0]), damagedSprings.Skip(1).ToArray()); return CountPossibleArrangements(springsRecord.Substring(damagedSprings[0]), damagedSprings.Skip(1).ToArray());
} }
if (springsRecord.Length < (damagedSprings[0] + 1) || springsRecord[damagedSprings[0]] == '#') if (springsRecord.Length < (damagedSprings[0] + 1) || springsRecord[damagedSprings[0]] == '#')
{ {
// Invalid match; There must be an operational (or unknown) spring between damaged spring groups // Invalid match; There must be an operational (or unknown) spring between damaged spring groups

View File

@@ -103,24 +103,17 @@ public class Day24 : IDay
throw new NotImplementedException(); throw new NotImplementedException();
} }
public struct Vector3D public struct Vector3D(long x, long y, long z)
{ {
public readonly long X; public readonly long X = x;
public readonly long Y; public readonly long Y = y;
public readonly long Z; public readonly long Z = z;
public Vector3D(long x, long y, long z)
{
X = x;
Y = y;
Z = z;
}
} }
public readonly struct Hail public readonly struct Hail
{ {
public readonly Vector3D Position; public readonly Vector3D Position;
public readonly Vector3D Velocity; private readonly Vector3D _velocity;
public Hail(string input) public Hail(string input)
{ {
@@ -131,7 +124,7 @@ public class Day24 : IDay
y: Convert.ToInt64(strPosition[1]), y: Convert.ToInt64(strPosition[1]),
z: Convert.ToInt64(strPosition[2])); z: Convert.ToInt64(strPosition[2]));
string[] strVelocity = parts[1].Split(", "); string[] strVelocity = parts[1].Split(", ");
Velocity = new Vector3D( _velocity = new Vector3D(
x: Convert.ToInt64(strVelocity[0]), x: Convert.ToInt64(strVelocity[0]),
y: Convert.ToInt64(strVelocity[1]), y: Convert.ToInt64(strVelocity[1]),
z: Convert.ToInt64(strVelocity[2])); z: Convert.ToInt64(strVelocity[2]));
@@ -139,21 +132,21 @@ public class Day24 : IDay
public (bool intersects, double s, double t, Vector3D point) Intersect2D(Hail other) public (bool intersects, double s, double t, Vector3D point) Intersect2D(Hail other)
{ {
long s_Div = (-other.Velocity.X * Velocity.Y + Velocity.X * other.Velocity.Y); long s_Div = (-other._velocity.X * _velocity.Y + _velocity.X * other._velocity.Y);
if (s_Div == 0) if (s_Div == 0)
{ {
return (false, 0, 0, new Vector3D()); return (false, 0, 0, new Vector3D());
} }
double s = (-Velocity.Y * (Position.X - other.Position.X) + Velocity.X * (Position.Y - other.Position.Y)) / (double)s_Div; double s = (-_velocity.Y * (Position.X - other.Position.X) + _velocity.X * (Position.Y - other.Position.Y)) / (double)s_Div;
long t_Div = (-other.Velocity.X * Velocity.Y + Velocity.X * other.Velocity.Y); long t_Div = (-other._velocity.X * _velocity.Y + _velocity.X * other._velocity.Y);
if (t_Div == 0) if (t_Div == 0)
{ {
return (false, 0, 0, new Vector3D()); return (false, 0, 0, new Vector3D());
} }
double t = (other.Velocity.X * (Position.Y - other.Position.Y) - other.Velocity.Y * (Position.X - other.Position.X)) / (double)t_Div; double t = (other._velocity.X * (Position.Y - other.Position.Y) - other._velocity.Y * (Position.X - other.Position.X)) / (double)t_Div;
Vector3D intersection = new((long)(Position.X + t * Velocity.X), (long)(Position.Y + t * Velocity.Y), 0); Vector3D intersection = new((long)(Position.X + t * _velocity.X), (long)(Position.Y + t * _velocity.Y), 0);
return (true, s, t, intersection); return (true, s, t, intersection);
} }
} }

View File

@@ -0,0 +1,26 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
<RootNamespace>AdventOfCode2024.Tests</RootNamespace>
<IsPackable>false</IsPackable>
<IsTestProject>true</IsTestProject>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.0"/>
<PackageReference Include="xunit" Version="2.4.2"/>
<PackageReference Include="xunit.runner.visualstudio" Version="2.4.5">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\AdventOfCode2024\AdventOfCode2024.csproj"/>
</ItemGroup>
</Project>

View File

@@ -0,0 +1,38 @@
namespace AdventOfCode2024.Tests;
public class Day01_Tests
{
[Fact]
public void ResolvePart1__Example()
{
Day01 day = new();
string result = day.ResolvePart1([
"3 4",
"4 3",
"2 5",
"1 3",
"3 9",
"3 3",
]);
Assert.Equal("11", result);
}
[Fact]
public void ResolvePart2__Example()
{
Day01 day = new();
string result = day.ResolvePart2([
"3 4",
"4 3",
"2 5",
"1 3",
"3 9",
"3 3",
]);
Assert.Equal("31", result);
}
}

View File

@@ -0,0 +1,38 @@
namespace AdventOfCode2024.Tests;
public class Day02_Tests
{
[Fact]
public void ResolvePart1__Example()
{
Day02 day = new();
string result = day.ResolvePart1([
"7 6 4 2 1",
"1 2 7 8 9",
"9 7 6 2 1",
"1 3 2 4 5",
"8 6 4 4 1",
"1 3 6 7 9",
]);
Assert.Equal("2", result);
}
[Fact]
public void ResolvePart2__Example()
{
Day02 day = new();
string result = day.ResolvePart2([
"7 6 4 2 1",
"1 2 7 8 9",
"9 7 6 2 1",
"1 3 2 4 5",
"8 6 4 4 1",
"1 3 6 7 9",
]);
Assert.Equal("4", result);
}
}

Some files were not shown because too many files have changed in this diff Show More