Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 68a494c929 |
@@ -1,9 +1,10 @@
|
||||
|
||||
[*]
|
||||
|
||||
# Microsoft .NET properties
|
||||
csharp_indent_braces = 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_prefer_braces = true:none
|
||||
csharp_preserve_single_line_blocks = true
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DeveloperToolsToolWindowSettingsV1" lastSelectedContentNodeId="base64-encoder-decoder">
|
||||
<developerToolsConfigurations />
|
||||
</component>
|
||||
</project>
|
||||
@@ -1,3 +0,0 @@
|
||||
<component name="ProjectDictionaryState">
|
||||
<dictionary name="var" />
|
||||
</component>
|
||||
@@ -1,10 +1,10 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode.Common</RootNamespace>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -14,8 +14,8 @@ public static class DayHelper
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private static void RunDay(string eventName, int dayNumber)
|
||||
|
||||
public static void RunDay(string eventName, int dayNumber)
|
||||
{
|
||||
Console.WriteLine($"Day {dayNumber:00}");
|
||||
Console.WriteLine("------");
|
||||
@@ -63,8 +63,8 @@ public static class DayHelper
|
||||
Console.WriteLine(ex.StackTrace);
|
||||
}
|
||||
}
|
||||
|
||||
private static void RunDay(string eventName)
|
||||
|
||||
public static void RunDay(string eventName)
|
||||
{
|
||||
for (int currentDay = 1; currentDay < 25; currentDay++)
|
||||
{
|
||||
@@ -74,7 +74,7 @@ public static class DayHelper
|
||||
Console.WriteLine(string.Empty);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
public static void RunDay(string eventName, string[] args)
|
||||
{
|
||||
if (args.Length > 0)
|
||||
|
||||
73
AdventOfCode.sln
Normal file
73
AdventOfCode.sln
Normal file
@@ -0,0 +1,73 @@
|
||||
|
||||
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
|
||||
@@ -6,12 +6,9 @@
|
||||
<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"><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/PredefinedNamingRules/=TypesAndNamespaces/@EntryIndexedValue"><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=61a991a4_002Dd0a3_002D4d19_002D90a5_002Df8f4d75c30c1/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Local variables"><ElementKinds><Kind Name="LOCAL_VARIABLE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="aaBb_AaBb" /></Policy></s:String>
|
||||
<s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/UserRules/=a0b4bc4d_002Dd13b_002D4a37_002Db37e_002Dc9c6864e4302/@EntryIndexedValue"><Policy><Descriptor Staticness="Any" AccessRightKinds="Any" Description="Types and namespaces"><ElementKinds><Kind Name="NAMESPACE" /><Kind Name="CLASS" /><Kind Name="STRUCT" /><Kind Name="ENUM" /><Kind Name="DELEGATE" /></ElementKinds></Descriptor><Policy Inspect="True" Prefix="" Suffix="" Style="AaBb_AaBb" /></Policy></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_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/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/=Extrapolator/@EntryIndexedValue">True</s:Boolean>
|
||||
<s:Boolean x:Key="/Default/UserDictionary/Words/=extrapolators/@EntryIndexedValue">True</s:Boolean></wpf:ResourceDictionary>
|
||||
@@ -1,13 +0,0 @@
|
||||
<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>
|
||||
@@ -1,26 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2017.Tests</RootNamespace>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2017.Tests</RootNamespace>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<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>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
|
||||
<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>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode2017\AdventOfCode2017.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -9,7 +9,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["1122"]);
|
||||
string result = day01.ResolvePart1(new[] { "1122", });
|
||||
|
||||
Assert.Equal("3", result);
|
||||
}
|
||||
@@ -19,7 +19,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["1111"]);
|
||||
string result = day01.ResolvePart1(new[] { "1111", });
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
@@ -29,7 +29,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["1234"]);
|
||||
string result = day01.ResolvePart1(new[] { "1234", });
|
||||
|
||||
Assert.Equal("0", result);
|
||||
}
|
||||
@@ -39,7 +39,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["91212129"]);
|
||||
string result = day01.ResolvePart1(new[] { "91212129", });
|
||||
|
||||
Assert.Equal("9", result);
|
||||
}
|
||||
@@ -47,13 +47,13 @@ public class Day01_Tests
|
||||
#endregion ResolvePart1
|
||||
|
||||
#region ResolvePart2
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Test1()
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["1212"]);
|
||||
string result = day01.ResolvePart2(new[] { "1212", });
|
||||
|
||||
Assert.Equal("6", result);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["1221"]);
|
||||
string result = day01.ResolvePart2(new[] { "1221", });
|
||||
|
||||
Assert.Equal("0", result);
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["123425"]);
|
||||
string result = day01.ResolvePart2(new[] { "123425", });
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["123123"]);
|
||||
string result = day01.ResolvePart2(new[] { "123123", });
|
||||
|
||||
Assert.Equal("12", result);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["12131415"]);
|
||||
string result = day01.ResolvePart2(new[] { "12131415", });
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
|
||||
@@ -7,11 +7,11 @@ public class Day02_Tests
|
||||
{
|
||||
Day02 day02 = new();
|
||||
|
||||
string result = day02.ResolvePart1([
|
||||
string result = day02.ResolvePart1(new[] {
|
||||
"5 1 9 5",
|
||||
"7 5 3",
|
||||
"2 4 6 8",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("18", result);
|
||||
}
|
||||
@@ -21,11 +21,11 @@ public class Day02_Tests
|
||||
{
|
||||
Day02 day02 = new();
|
||||
|
||||
string result = day02.ResolvePart2([
|
||||
string result = day02.ResolvePart2(new[] {
|
||||
"5 9 2 8",
|
||||
"9 4 7 3",
|
||||
"3 8 6 5",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("9", result);
|
||||
}
|
||||
|
||||
5
AdventOfCode2017.Tests/packages.config
Normal file
5
AdventOfCode2017.Tests/packages.config
Normal file
@@ -0,0 +1,5 @@
|
||||
<?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>
|
||||
@@ -1,21 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2017</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2017</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -48,10 +48,10 @@ public class Day01 : IDay
|
||||
{
|
||||
string input = inputs[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;
|
||||
if (input[i] == input[nextI])
|
||||
if(input[i] == input[nextI])
|
||||
{
|
||||
value += (input[i] - '0');
|
||||
}
|
||||
|
||||
@@ -51,10 +51,10 @@ public class Day02 : IDay
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
int checksum = 0;
|
||||
foreach (string input in inputs)
|
||||
foreach(string input in inputs)
|
||||
{
|
||||
int[] row = input
|
||||
.Split([" ", " "], StringSplitOptions.RemoveEmptyEntries)
|
||||
.Split(new[] { " ", " " }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(cell => Convert.ToInt32(cell))
|
||||
.ToArray();
|
||||
int max = row.Max();
|
||||
@@ -70,7 +70,7 @@ public class Day02 : IDay
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
int[] row = input
|
||||
.Split([" ", " "], StringSplitOptions.RemoveEmptyEntries)
|
||||
.Split(new[] { " ", " " }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(cell => Convert.ToInt32(cell))
|
||||
.ToArray();
|
||||
|
||||
|
||||
@@ -30,11 +30,11 @@ public class Day03 : IDay
|
||||
{
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
return string.Empty;
|
||||
return null;
|
||||
}
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
return string.Empty;
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,26 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2018.Tests</RootNamespace>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2018.Tests</RootNamespace>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
|
||||
<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>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<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="..\AdventOfCode2018\AdventOfCode2018.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode2018\AdventOfCode2018.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -9,7 +9,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["+1", "-2", "+3", "+1"]);
|
||||
string result = day01.ResolvePart1(new[] { "+1", "-2", "+3", "+1", });
|
||||
|
||||
Assert.Equal("3", result);
|
||||
}
|
||||
@@ -19,7 +19,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["+1", "+1", "+1"]);
|
||||
string result = day01.ResolvePart1(new[] { "+1", "+1", "+1", });
|
||||
|
||||
Assert.Equal("3", result);
|
||||
}
|
||||
@@ -29,7 +29,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["+1", "+1", "-2"]);
|
||||
string result = day01.ResolvePart1(new[] { "+1", "+1", "-2", });
|
||||
|
||||
Assert.Equal("0", result);
|
||||
}
|
||||
@@ -39,7 +39,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart1(["-1", "-2", "-3"]);
|
||||
string result = day01.ResolvePart1(new[] { "-1", "-2", "-3", });
|
||||
|
||||
Assert.Equal("-6", result);
|
||||
}
|
||||
@@ -53,7 +53,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["+1", "-2", "+3", "+1"]);
|
||||
string result = day01.ResolvePart2(new[] { "+1", "-2", "+3", "+1", });
|
||||
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["+1", "-1"]);
|
||||
string result = day01.ResolvePart2(new[] { "+1", "-1", });
|
||||
|
||||
Assert.Equal("0", result);
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["+3", "+3", "+4", "-2", "-4"]);
|
||||
string result = day01.ResolvePart2(new[] { "+3", "+3", "+4", "-2", "-4", });
|
||||
|
||||
Assert.Equal("10", result);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["-6", "+3", "+8", "+5", "-6"]);
|
||||
string result = day01.ResolvePart2(new[] { "-6", "+3", "+8", "+5", "-6", });
|
||||
|
||||
Assert.Equal("5", result);
|
||||
}
|
||||
@@ -93,7 +93,7 @@ public class Day01_Tests
|
||||
{
|
||||
Day01 day01 = new();
|
||||
|
||||
string result = day01.ResolvePart2(["+7", "+7", "-2", "-7", "-4"]);
|
||||
string result = day01.ResolvePart2(new[] { "+7", "+7", "-2", "-7", "-4", });
|
||||
|
||||
Assert.Equal("14", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day02_Tests
|
||||
{
|
||||
Day02 day02 = new();
|
||||
|
||||
string result = day02.ResolvePart1([
|
||||
string result = day02.ResolvePart1(new[] {
|
||||
"abcdef",
|
||||
"bababc",
|
||||
"abbcde",
|
||||
@@ -15,7 +15,7 @@ public class Day02_Tests
|
||||
"aabcdd",
|
||||
"abcdee",
|
||||
"ababab",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("12", result);
|
||||
}
|
||||
@@ -25,7 +25,7 @@ public class Day02_Tests
|
||||
{
|
||||
Day02 day02 = new();
|
||||
|
||||
string result = day02.ResolvePart2([
|
||||
string result = day02.ResolvePart2(new[] {
|
||||
"abcde",
|
||||
"fghij",
|
||||
"klmno",
|
||||
@@ -33,7 +33,7 @@ public class Day02_Tests
|
||||
"fguij",
|
||||
"axcye",
|
||||
"wvxyz",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("fgij", result);
|
||||
}
|
||||
|
||||
@@ -90,17 +90,17 @@ public class Day03_Tests
|
||||
}
|
||||
|
||||
#endregion Claim_Overlaps
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Test()
|
||||
{
|
||||
Day03 day03 = new();
|
||||
|
||||
string result = day03.ResolvePart1([
|
||||
string result = day03.ResolvePart1(new[] {
|
||||
"#1 @ 1,3: 4x4",
|
||||
"#2 @ 3,1: 4x4",
|
||||
"#3 @ 5,5: 2x2",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
@@ -110,11 +110,11 @@ public class Day03_Tests
|
||||
{
|
||||
Day03 day03 = new();
|
||||
|
||||
string result = day03.ResolvePart2([
|
||||
string result = day03.ResolvePart2(new[] {
|
||||
"#1 @ 1,3: 4x4",
|
||||
"#2 @ 3,1: 4x4",
|
||||
"#3 @ 5,5: 2x2",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("3", result);
|
||||
}
|
||||
|
||||
@@ -50,7 +50,7 @@ public class Day04_Tests
|
||||
[Fact]
|
||||
public void GuardEvent_FromStringArray__TestBase()
|
||||
{
|
||||
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray([
|
||||
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray(new[] {
|
||||
"[1518-11-01 00:00] Guard #10 begins shift",
|
||||
"[1518-11-01 00:05] falls asleep",
|
||||
"[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-02 00:40] falls asleep",
|
||||
"[1518-11-02 00:50] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal(10, guardEvents[0].ID);
|
||||
Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type);
|
||||
@@ -89,7 +89,7 @@ public class Day04_Tests
|
||||
[Fact]
|
||||
public void GuardEvent_FromStringArray__TestBaseUnsorted()
|
||||
{
|
||||
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray([
|
||||
List<Day04.GuardEvent> guardEvents = Day04.GuardEvent.FromStringArray(new[] {
|
||||
"[1518-11-01 00:00] Guard #10 begins shift",
|
||||
"[1518-11-01 23:58] Guard #99 begins shift",
|
||||
"[1518-11-01 00:30] falls asleep",
|
||||
@@ -98,7 +98,7 @@ public class Day04_Tests
|
||||
"[1518-11-02 00:50] wakes up",
|
||||
"[1518-11-01 00:55] wakes up",
|
||||
"[1518-11-01 00:25] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal(10, guardEvents[0].ID);
|
||||
Assert.Equal(Day04.GuardEventType.ShiftBegin, guardEvents[0].Type);
|
||||
@@ -126,13 +126,13 @@ public class Day04_Tests
|
||||
}
|
||||
|
||||
#endregion GuardEvent_FromStringArray
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__BaseStatement()
|
||||
{
|
||||
Day04 day04 = new();
|
||||
|
||||
string result = day04.ResolvePart1([
|
||||
string result = day04.ResolvePart1(new[] {
|
||||
"[1518-11-01 00:00] Guard #10 begins shift",
|
||||
"[1518-11-01 00:05] falls asleep",
|
||||
"[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:45] falls asleep",
|
||||
"[1518-11-05 00:55] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("240", result);
|
||||
}
|
||||
@@ -160,7 +160,7 @@ public class Day04_Tests
|
||||
{
|
||||
Day04 day04 = new();
|
||||
|
||||
string result = day04.ResolvePart1([
|
||||
string result = day04.ResolvePart1(new[] {
|
||||
"[1518-11-04 00:36] falls asleep",
|
||||
"[1518-11-04 00:46] wakes up",
|
||||
"[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 23:58] Guard #99 begins shift",
|
||||
"[1518-11-05 00:55] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("240", result);
|
||||
}
|
||||
@@ -189,7 +189,7 @@ public class Day04_Tests
|
||||
{
|
||||
Day04 day04 = new();
|
||||
|
||||
string result = day04.ResolvePart2([
|
||||
string result = day04.ResolvePart2(new[] {
|
||||
"[1518-11-01 00:00] Guard #10 begins shift",
|
||||
"[1518-11-01 00:05] falls asleep",
|
||||
"[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:45] falls asleep",
|
||||
"[1518-11-05 00:55] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4455", result);
|
||||
}
|
||||
@@ -217,7 +217,7 @@ public class Day04_Tests
|
||||
{
|
||||
Day04 day04 = new();
|
||||
|
||||
string result = day04.ResolvePart2([
|
||||
string result = day04.ResolvePart2(new[] {
|
||||
"[1518-11-04 00:36] falls asleep",
|
||||
"[1518-11-04 00:46] wakes up",
|
||||
"[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 23:58] Guard #99 begins shift",
|
||||
"[1518-11-05 00:55] wakes up",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4455", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day05_Tests
|
||||
{
|
||||
Day05 day05 = new();
|
||||
|
||||
string result = day05.ResolvePart1(["dabAcCaCBAcCcaDA"]);
|
||||
string result = day05.ResolvePart1(new[] { "dabAcCaCBAcCcaDA" });
|
||||
|
||||
Assert.Equal("10", result);
|
||||
}
|
||||
@@ -17,7 +17,7 @@ public class Day05_Tests
|
||||
{
|
||||
Day05 day05 = new();
|
||||
|
||||
string result = day05.ResolvePart2(["dabAcCaCBAcCcaDA"]);
|
||||
string result = day05.ResolvePart2(new[] { "dabAcCaCBAcCcaDA" });
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
|
||||
@@ -7,28 +7,28 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
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?.Y);
|
||||
Assert.Equal(1, point.X);
|
||||
Assert.Equal(1, point.Y);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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(6, point?.Y);
|
||||
Assert.Equal(1, point.X);
|
||||
Assert.Equal(6, point.Y);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
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(9, point?.Y);
|
||||
Assert.Equal(8, point.X);
|
||||
Assert.Equal(9, point.Y);
|
||||
}
|
||||
|
||||
#endregion ChronoPoint_FromString
|
||||
@@ -38,12 +38,9 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
public void ChronoPoint_ManhattanDistance__Test1()
|
||||
{
|
||||
Day06.ChronoPoint? p0 = Day06.ChronoPoint.FromString("8, 9");
|
||||
Day06.ChronoPoint? p1 = Day06.ChronoPoint.FromString("1, 6");
|
||||
Day06.ChronoPoint p0 = Day06.ChronoPoint.FromString("8, 9");
|
||||
Day06.ChronoPoint p1 = Day06.ChronoPoint.FromString("1, 6");
|
||||
|
||||
Assert.NotNull(p0);
|
||||
Assert.NotNull(p1);
|
||||
|
||||
int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1);
|
||||
|
||||
Assert.Equal(10, distance);
|
||||
@@ -52,12 +49,9 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
public void ChronoPoint_ManhattanDistance__Test2()
|
||||
{
|
||||
Day06.ChronoPoint? p0 = Day06.ChronoPoint.FromString("1, 1");
|
||||
Day06.ChronoPoint? p1 = Day06.ChronoPoint.FromString("1, 6");
|
||||
Day06.ChronoPoint p0 = Day06.ChronoPoint.FromString("1, 1");
|
||||
Day06.ChronoPoint p1 = Day06.ChronoPoint.FromString("1, 6");
|
||||
|
||||
Assert.NotNull(p0);
|
||||
Assert.NotNull(p1);
|
||||
|
||||
int distance = Day06.ChronoPoint.ManhattanDistance(p0, p1);
|
||||
|
||||
Assert.Equal(5, distance);
|
||||
@@ -70,14 +64,14 @@ public class Day06_Tests
|
||||
{
|
||||
Day06 day06 = new();
|
||||
|
||||
string result = day06.ResolvePart1([
|
||||
string result = day06.ResolvePart1(new[] {
|
||||
"1, 1",
|
||||
"1, 6",
|
||||
"8, 3",
|
||||
"3, 4",
|
||||
"5, 5",
|
||||
"8, 9",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("17", result);
|
||||
}
|
||||
@@ -85,16 +79,16 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Test()
|
||||
{
|
||||
Day06 day06 = new() { DistanceThreshold = 32, };
|
||||
Day06 day06 = new() { DistanceThresold = 32, };
|
||||
|
||||
string result = day06.ResolvePart2([
|
||||
string result = day06.ResolvePart2(new[] {
|
||||
"1, 1",
|
||||
"1, 6",
|
||||
"8, 3",
|
||||
"3, 4",
|
||||
"5, 5",
|
||||
"8, 9",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("16", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day07_Tests
|
||||
{
|
||||
Day07 day07 = new();
|
||||
|
||||
string result = day07.ResolvePart1([
|
||||
string result = day07.ResolvePart1(new[] {
|
||||
"Step C must be finished before step A can begin.",
|
||||
"Step C must be finished before step F 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 D must be finished before step E can begin.",
|
||||
"Step F must be finished before step E can begin.",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("CABDFE", result);
|
||||
}
|
||||
@@ -25,7 +25,7 @@ public class Day07_Tests
|
||||
{
|
||||
Day07 day07 = new() { BaseCost = 0, NumberOfWorkers = 2 };
|
||||
|
||||
string result = day07.ResolvePart2([
|
||||
string result = day07.ResolvePart2(new[] {
|
||||
"Step C must be finished before step A can begin.",
|
||||
"Step C must be finished before step F 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 D must be finished before step E can begin.",
|
||||
"Step F must be finished before step E can begin.",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("15", result);
|
||||
}
|
||||
|
||||
@@ -28,13 +28,13 @@ public class Day08_Tests
|
||||
Assert.Single(result.Childs[1].Childs[0].Metadata);
|
||||
Assert.Equal(99, result.Childs[1].Childs[0].Metadata[0]);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Test()
|
||||
{
|
||||
Day08 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"]);
|
||||
string result = day.ResolvePart1(new[] { "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2", });
|
||||
|
||||
Assert.Equal("138", result);
|
||||
}
|
||||
@@ -44,7 +44,7 @@ public class Day08_Tests
|
||||
{
|
||||
Day08 day = new();
|
||||
|
||||
string result = day.ResolvePart2(["2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2"]);
|
||||
string result = day.ResolvePart2(new[] { "2 3 0 3 10 11 12 1 1 0 1 99 2 1 1 2", });
|
||||
|
||||
Assert.Equal("66", result);
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
public class Day09_Tests
|
||||
{
|
||||
#region MarbleGame_PlayGame
|
||||
|
||||
|
||||
[Fact]
|
||||
public void MarbleGame_PlayGame__Test1()
|
||||
{
|
||||
@@ -69,15 +69,15 @@ public class Day09_Tests
|
||||
|
||||
Assert.Equal(37305, highScore);
|
||||
}
|
||||
|
||||
|
||||
#endregion MarbleGame_PlayGame
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Test1()
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["9 players; last marble is worth 25 points"]);
|
||||
string result = day.ResolvePart1(new[] { "9 players; last marble is worth 25 points" });
|
||||
|
||||
Assert.Equal("32", result);
|
||||
}
|
||||
@@ -87,7 +87,7 @@ public class Day09_Tests
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["10 players; last marble is worth 1618 points"]);
|
||||
string result = day.ResolvePart1(new[] { "10 players; last marble is worth 1618 points" });
|
||||
|
||||
Assert.Equal("8317", result);
|
||||
}
|
||||
@@ -97,7 +97,7 @@ public class Day09_Tests
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["13 players; last marble is worth 7999 points"]);
|
||||
string result = day.ResolvePart1(new[] { "13 players; last marble is worth 7999 points" });
|
||||
|
||||
Assert.Equal("146373", result);
|
||||
}
|
||||
@@ -107,7 +107,7 @@ public class Day09_Tests
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["17 players; last marble is worth 1104 points"]);
|
||||
string result = day.ResolvePart1(new[] { "17 players; last marble is worth 1104 points" });
|
||||
|
||||
Assert.Equal("2764", result);
|
||||
}
|
||||
@@ -117,7 +117,7 @@ public class Day09_Tests
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["21 players; last marble is worth 6111 points"]);
|
||||
string result = day.ResolvePart1(new[] { "21 players; last marble is worth 6111 points" });
|
||||
|
||||
Assert.Equal("54718", result);
|
||||
}
|
||||
@@ -127,7 +127,7 @@ public class Day09_Tests
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["30 players; last marble is worth 5807 points"]);
|
||||
string result = day.ResolvePart1(new[] { "30 players; last marble is worth 5807 points" });
|
||||
|
||||
Assert.Equal("37305", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day10_Tests
|
||||
{
|
||||
Day10 day = new() { Width = 12, Height = 10 };
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"position=< 9, 1> velocity=< 0, 2>",
|
||||
"position=< 7, 0> velocity=<-1, 0>",
|
||||
"position=< 3, -2> velocity=<-1, 1>",
|
||||
@@ -39,7 +39,7 @@ public class Day10_Tests
|
||||
"position=< 5, 9> velocity=< 1, -2>",
|
||||
"position=<14, 7> velocity=<-2, 0>",
|
||||
"position=<-3, 6> velocity=< 2, -1>",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal(
|
||||
Environment.NewLine + "............" +
|
||||
@@ -59,7 +59,7 @@ public class Day10_Tests
|
||||
{
|
||||
Day10 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"position=< 9, 1> velocity=< 0, 2>",
|
||||
"position=< 7, 0> velocity=<-1, 0>",
|
||||
"position=< 3, -2> velocity=<-1, 1>",
|
||||
@@ -91,7 +91,7 @@ public class Day10_Tests
|
||||
"position=< 5, 9> velocity=< 1, -2>",
|
||||
"position=<14, 7> velocity=<-2, 0>",
|
||||
"position=<-3, 6> velocity=< 2, -1>",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("3", result);
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ public class Day11_Tests
|
||||
public void ResolvePart2__Test1()
|
||||
{
|
||||
Day11 day = new();
|
||||
string result = day.ResolvePart2(["18"]);
|
||||
string result = day.ResolvePart2(new[] { "18" });
|
||||
Assert.Equal("90,269,16", result);
|
||||
}
|
||||
|
||||
@@ -67,7 +67,7 @@ public class Day11_Tests
|
||||
public void ResolvePart2__Test2()
|
||||
{
|
||||
Day11 day = new();
|
||||
string result = day.ResolvePart2(["42"]);
|
||||
string result = day.ResolvePart2(new[] { "42" });
|
||||
Assert.Equal("232,251,12", result);
|
||||
}
|
||||
}
|
||||
@@ -7,7 +7,8 @@ public class Day12_Tests
|
||||
{
|
||||
Day12 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[]
|
||||
{
|
||||
"initial state: #..#.#..##......###...###",
|
||||
"",
|
||||
"...## => #",
|
||||
@@ -24,7 +25,7 @@ public class Day12_Tests
|
||||
"###.. => #",
|
||||
"###.# => #",
|
||||
"####. => #",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("325", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day13_Tests
|
||||
{
|
||||
Day13 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"|",
|
||||
"v",
|
||||
"|",
|
||||
@@ -15,7 +15,7 @@ public class Day13_Tests
|
||||
"|",
|
||||
"^",
|
||||
"|",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("0,3", result);
|
||||
}
|
||||
@@ -25,14 +25,14 @@ public class Day13_Tests
|
||||
{
|
||||
Day13 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
@"/->-\ ",
|
||||
@"| | /----\",
|
||||
@"| /-+--+-\ |",
|
||||
@"| | | | v |",
|
||||
@"\-+-/ \-+--/",
|
||||
@" \------/ ",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("7,3", result);
|
||||
}
|
||||
@@ -42,7 +42,7 @@ public class Day13_Tests
|
||||
{
|
||||
Day13 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
@"/>-<\ ",
|
||||
@"| | ",
|
||||
@"| /<+-\",
|
||||
@@ -50,7 +50,7 @@ public class Day13_Tests
|
||||
@"\>+</ |",
|
||||
@" | ^",
|
||||
@" \<->/",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("6,4", result);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["9"]);
|
||||
string result = day.ResolvePart1(new[] { "9", });
|
||||
|
||||
Assert.Equal("5158916779", result);
|
||||
}
|
||||
@@ -19,7 +19,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["5"]);
|
||||
string result = day.ResolvePart1(new[] { "5", });
|
||||
|
||||
Assert.Equal("0124515891", result);
|
||||
}
|
||||
@@ -29,7 +29,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["18"]);
|
||||
string result = day.ResolvePart1(new[] { "18", });
|
||||
|
||||
Assert.Equal("9251071085", result);
|
||||
}
|
||||
@@ -39,7 +39,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart1(["2018"]);
|
||||
string result = day.ResolvePart1(new[] { "2018", });
|
||||
|
||||
Assert.Equal("5941429882", result);
|
||||
}
|
||||
@@ -53,7 +53,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart2(["51589"]);
|
||||
string result = day.ResolvePart2(new[] { "51589", });
|
||||
|
||||
Assert.Equal("9", result);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart2(["01245"]);
|
||||
string result = day.ResolvePart2(new[] { "01245", });
|
||||
|
||||
Assert.Equal("5", result);
|
||||
}
|
||||
@@ -73,7 +73,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart2(["92510"]);
|
||||
string result = day.ResolvePart2(new[] { "92510", });
|
||||
|
||||
Assert.Equal("18", result);
|
||||
}
|
||||
@@ -83,7 +83,7 @@ public class Day14_Tests
|
||||
{
|
||||
Day14 day = new();
|
||||
|
||||
string result = day.ResolvePart2(["59414"]);
|
||||
string result = day.ResolvePart2(new[] { "59414", });
|
||||
|
||||
Assert.Equal("2018", result);
|
||||
}
|
||||
|
||||
@@ -9,7 +9,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#######",
|
||||
"#.G...#",
|
||||
"#...EG#",
|
||||
@@ -17,7 +17,7 @@ public class Day15_Tests
|
||||
"#..G#E#",
|
||||
"#.....#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("27730", result);
|
||||
}
|
||||
@@ -27,7 +27,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#######",
|
||||
"#G..#E#",
|
||||
"#E#E.E#",
|
||||
@@ -35,17 +35,17 @@ public class Day15_Tests
|
||||
"#...#E#",
|
||||
"#...E.#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("36334", result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Test3()
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#######",
|
||||
"#E..EG#",
|
||||
"#.#G.E#",
|
||||
@@ -53,7 +53,7 @@ public class Day15_Tests
|
||||
"#G..#.#",
|
||||
"#..E#.#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("39514", result);
|
||||
}
|
||||
@@ -63,7 +63,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#######",
|
||||
"#E.G#.#",
|
||||
"#.#G..#",
|
||||
@@ -71,7 +71,7 @@ public class Day15_Tests
|
||||
"#G..#.#",
|
||||
"#...E.#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("27755", result);
|
||||
}
|
||||
@@ -81,7 +81,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#######",
|
||||
"#.E...#",
|
||||
"#.#..G#",
|
||||
@@ -89,7 +89,7 @@ public class Day15_Tests
|
||||
"#E#G#G#",
|
||||
"#...#G#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("28944", result);
|
||||
}
|
||||
@@ -99,7 +99,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"#########",
|
||||
"#G......#",
|
||||
"#.E.#...#",
|
||||
@@ -109,7 +109,7 @@ public class Day15_Tests
|
||||
"#.G...G.#",
|
||||
"#.....G.#",
|
||||
"#########",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("18740", result);
|
||||
}
|
||||
@@ -123,7 +123,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"#######",
|
||||
"#.G...#",
|
||||
"#...EG#",
|
||||
@@ -131,17 +131,17 @@ public class Day15_Tests
|
||||
"#..G#E#",
|
||||
"#.....#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4988", result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Test3()
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"#######",
|
||||
"#E..EG#",
|
||||
"#.#G.E#",
|
||||
@@ -149,7 +149,7 @@ public class Day15_Tests
|
||||
"#G..#.#",
|
||||
"#..E#.#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("31284", result);
|
||||
}
|
||||
@@ -159,7 +159,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"#######",
|
||||
"#E.G#.#",
|
||||
"#.#G..#",
|
||||
@@ -167,7 +167,7 @@ public class Day15_Tests
|
||||
"#G..#.#",
|
||||
"#...E.#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("3478", result);
|
||||
}
|
||||
@@ -177,7 +177,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"#######",
|
||||
"#.E...#",
|
||||
"#.#..G#",
|
||||
@@ -185,7 +185,7 @@ public class Day15_Tests
|
||||
"#E#G#G#",
|
||||
"#...#G#",
|
||||
"#######",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("6474", result);
|
||||
}
|
||||
@@ -195,7 +195,7 @@ public class Day15_Tests
|
||||
{
|
||||
Day15 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"#########",
|
||||
"#G......#",
|
||||
"#.E.#...#",
|
||||
@@ -205,7 +205,7 @@ public class Day15_Tests
|
||||
"#.G...G.#",
|
||||
"#.....G.#",
|
||||
"#########",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("1140", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day16_Tests
|
||||
{
|
||||
Day16 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"Before: [3, 2, 1, 1]",
|
||||
"9 2 1 2",
|
||||
"After: [3, 2, 2, 1]",
|
||||
@@ -18,7 +18,7 @@ public class Day16_Tests
|
||||
"",
|
||||
"",
|
||||
"Garbage",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
|
||||
@@ -7,7 +7,7 @@ public class Day23_Tests
|
||||
{
|
||||
Day23 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"pos=<0,0,0>, r=4",
|
||||
"pos=<1,0,0>, r=1",
|
||||
"pos=<4,0,0>, r=3",
|
||||
@@ -17,7 +17,7 @@ public class Day23_Tests
|
||||
"pos=<1,1,1>, r=1",
|
||||
"pos=<1,1,2>, r=1",
|
||||
"pos=<1,3,1>, r=1",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("7", result);
|
||||
}
|
||||
@@ -27,14 +27,14 @@ public class Day23_Tests
|
||||
{
|
||||
Day23 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"pos=<10,12,12>, r=2",
|
||||
"pos=<12,14,12>, r=2",
|
||||
"pos=<16,12,12>, r=4",
|
||||
"pos=<14,14,14>, r=6",
|
||||
"pos=<50,50,50>, r=200",
|
||||
"pos=<10,10,10>, r=5",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("36", result);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<packages>
|
||||
<package id="MSTest.TestAdapter" version="1.4.0" targetFramework="net461"/>
|
||||
<package id="MSTest.TestFramework" 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" />
|
||||
</packages>
|
||||
@@ -1,21 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2018</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2018</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -63,7 +63,8 @@ public class Day01 : IDay
|
||||
int accumulator = 0;
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
if (int.TryParse(input.Substring(1), out int intInput))
|
||||
int intInput;
|
||||
if (int.TryParse(input.Substring(1), out intInput))
|
||||
{
|
||||
if (input[0] == '-')
|
||||
{
|
||||
@@ -82,14 +83,15 @@ public class Day01 : IDay
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
int accumulator = 0;
|
||||
List<int> accumulatorHistory = [];
|
||||
List<int> accumulatorHistory = new();
|
||||
int? repeatedAccumulator = null;
|
||||
while (repeatedAccumulator == null)
|
||||
{
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
accumulatorHistory.Add(accumulator);
|
||||
if (int.TryParse(input.Substring(1), out int intInput))
|
||||
int intInput;
|
||||
if (int.TryParse(input.Substring(1), out intInput))
|
||||
{
|
||||
if (input[0] == '-')
|
||||
{
|
||||
@@ -108,6 +110,6 @@ public class Day01 : IDay
|
||||
}
|
||||
}
|
||||
}
|
||||
return repeatedAccumulator.ToString() ?? string.Empty;
|
||||
return repeatedAccumulator.ToString();
|
||||
}
|
||||
}
|
||||
@@ -50,7 +50,7 @@ What letters are common between the two correct box IDs? (In the example above,
|
||||
|
||||
public class Day02 : IDay
|
||||
{
|
||||
private static int CountOccurrencesOfLetter(string text, char letter)
|
||||
private int CountOccurrencesOfLetter(string text, char letter)
|
||||
{
|
||||
return text.Count(c => (c == letter));
|
||||
}
|
||||
@@ -75,7 +75,7 @@ public class Day02 : IDay
|
||||
int tripletsCount = 0;
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
Tuple<bool, bool> hasPairsAndTriplets = HasPairsAndTriplets(input);
|
||||
var hasPairsAndTriplets = HasPairsAndTriplets(input);
|
||||
if (hasPairsAndTriplets.Item1) { pairsCount++; }
|
||||
if (hasPairsAndTriplets.Item2) { tripletsCount++; }
|
||||
}
|
||||
@@ -104,10 +104,11 @@ public class Day02 : IDay
|
||||
{
|
||||
for (int j = (i + 1); j < inputs.Length; j++)
|
||||
{
|
||||
Tuple<int, string> result = CompareIDPair(inputs[i], inputs[j]);
|
||||
var result = CompareIDPair(inputs[i], inputs[j]);
|
||||
if (result.Item1 == 1) { return result.Item2; }
|
||||
}
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -60,7 +60,7 @@ public class Day03 : IDay
|
||||
{
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
List<Claim> claims = inputs.Select(Claim.FromString).ToList();
|
||||
List<Claim> claims = inputs.Select(i => Claim.FromString(i)).ToList();
|
||||
|
||||
const int edgeSize = 1000;
|
||||
int[,] cells = new int[edgeSize, edgeSize];
|
||||
@@ -92,9 +92,9 @@ public class Day03 : IDay
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
List<Claim> claims = inputs.Select(Claim.FromString).ToList();
|
||||
List<Claim> claims = inputs.Select(i => Claim.FromString(i)).ToList();
|
||||
|
||||
Claim? unOverlappingClaim = null;
|
||||
Claim unoverlappingClaim = null;
|
||||
for (int i = 0; i < claims.Count; i++)
|
||||
{
|
||||
bool overlaps = false;
|
||||
@@ -109,43 +109,29 @@ public class Day03 : IDay
|
||||
}
|
||||
if (overlaps == false)
|
||||
{
|
||||
unOverlappingClaim = claims[i];
|
||||
unoverlappingClaim = claims[i];
|
||||
break;
|
||||
}
|
||||
}
|
||||
return unOverlappingClaim?.ID.ToString() ?? string.Empty;
|
||||
return unoverlappingClaim.ID.ToString();
|
||||
|
||||
}
|
||||
|
||||
public class Claim
|
||||
{
|
||||
public int ID { get; private set; }
|
||||
public int ID { get; set; }
|
||||
|
||||
public int Left { get; private set; }
|
||||
public int Top { get; private set; }
|
||||
public int Left { get; set; }
|
||||
public int Top { get; set; }
|
||||
|
||||
public int Width { get; private set; }
|
||||
public int Height { get; private set; }
|
||||
public int Width { get; set; }
|
||||
public int Height { get; set; }
|
||||
|
||||
private int MinX
|
||||
{
|
||||
get { return Left; }
|
||||
}
|
||||
public int MinX { get { return Left; } }
|
||||
public int MaxX { get { return Left + Width; } }
|
||||
|
||||
private int MaxX
|
||||
{
|
||||
get { return Left + Width; }
|
||||
}
|
||||
|
||||
private int MinY
|
||||
{
|
||||
get { return Top; }
|
||||
}
|
||||
|
||||
private int MaxY
|
||||
{
|
||||
get { return Top + Height; }
|
||||
}
|
||||
public int MinY { get { return Top; } }
|
||||
public int MaxY { get { return Top + Height; } }
|
||||
|
||||
public int GetArea()
|
||||
{
|
||||
@@ -155,7 +141,7 @@ public class Day03 : IDay
|
||||
public static Claim FromString(string strClaim)
|
||||
{
|
||||
Claim claim = new();
|
||||
string[] parts = strClaim.Split([" @ ", ",", ": ", "x"], StringSplitOptions.None);
|
||||
string[] parts = strClaim.Split(new[] { " @ ", ",", ": ", "x", }, StringSplitOptions.None);
|
||||
claim.ID = Convert.ToInt32(parts[0].Substring(1));
|
||||
claim.Left = Convert.ToInt32(parts[1]);
|
||||
claim.Top = Convert.ToInt32(parts[2]);
|
||||
|
||||
@@ -68,14 +68,14 @@ public class Day04 : IDay
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs);
|
||||
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistogram(guardEvents);
|
||||
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistorgram(guardEvents);
|
||||
|
||||
// Find sleepier guard
|
||||
GuardSleepHistogram? highestSleeperHistogram = null;
|
||||
GuardSleepHistogram highestSleeperHistogram = null;
|
||||
long highestTotalSleep = long.MinValue;
|
||||
foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values)
|
||||
{
|
||||
int totalSleep = guardHistogram.SleepOnMinute.Sum();
|
||||
int totalSleep = guardHistogram.SleepOnMunute.Sum();
|
||||
|
||||
if (totalSleep > highestTotalSleep)
|
||||
{
|
||||
@@ -83,17 +83,16 @@ public class Day04 : IDay
|
||||
highestTotalSleep = totalSleep;
|
||||
}
|
||||
}
|
||||
if (highestSleeperHistogram == null) { return string.Empty; }
|
||||
|
||||
// Find sleepier minute
|
||||
int maxSleepMinute = int.MinValue;
|
||||
int maxSleepMinuteValue = int.MinValue;
|
||||
for (int i = 0; i < GuardSleepHistogram.MinutesOnHour; i++)
|
||||
{
|
||||
if (highestSleeperHistogram.SleepOnMinute[i] > maxSleepMinuteValue)
|
||||
if (highestSleeperHistogram.SleepOnMunute[i] > maxSleepMinuteValue)
|
||||
{
|
||||
maxSleepMinute = i;
|
||||
maxSleepMinuteValue = highestSleeperHistogram.SleepOnMinute[i];
|
||||
maxSleepMinuteValue = highestSleeperHistogram.SleepOnMunute[i];
|
||||
}
|
||||
}
|
||||
|
||||
@@ -104,7 +103,7 @@ public class Day04 : IDay
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
List<GuardEvent> guardEvents = GuardEvent.FromStringArray(inputs);
|
||||
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistogram(guardEvents);
|
||||
Dictionary<int, GuardSleepHistogram> dictFullHistogram = BuildFullHistorgram(guardEvents);
|
||||
|
||||
int selectedGuardID = int.MinValue;
|
||||
int selectedMinute = int.MinValue;
|
||||
@@ -113,9 +112,9 @@ public class Day04 : IDay
|
||||
{
|
||||
foreach (GuardSleepHistogram guardHistogram in dictFullHistogram.Values)
|
||||
{
|
||||
if (guardHistogram.SleepOnMinute[i] > maxSleepMinuteValue)
|
||||
if (guardHistogram.SleepOnMunute[i] > maxSleepMinuteValue)
|
||||
{
|
||||
maxSleepMinuteValue = guardHistogram.SleepOnMinute[i];
|
||||
maxSleepMinuteValue = guardHistogram.SleepOnMunute[i];
|
||||
selectedGuardID = guardHistogram.ID;
|
||||
selectedMinute = i;
|
||||
}
|
||||
@@ -126,7 +125,7 @@ public class Day04 : IDay
|
||||
return result.ToString();
|
||||
}
|
||||
|
||||
private static Dictionary<int, GuardSleepHistogram> BuildFullHistogram(List<GuardEvent> guardEvents)
|
||||
private static Dictionary<int, GuardSleepHistogram> BuildFullHistorgram(List<GuardEvent> guardEvents)
|
||||
{
|
||||
Dictionary<int, GuardSleepHistogram> dictFullHistogram = new();
|
||||
foreach (IGrouping<int, GuardEvent> group in guardEvents.GroupBy(guardEvent => guardEvent.Date.DayOfYear))
|
||||
@@ -157,12 +156,16 @@ public class Day04 : IDay
|
||||
|
||||
foreach (GuardSleepHistogram dayGuardHistogram in dictDayHistogram.Values)
|
||||
{
|
||||
if (dictFullHistogram.TryGetValue(dayGuardHistogram.ID, out GuardSleepHistogram? guardHistogram))
|
||||
GuardSleepHistogram guardHistogram;
|
||||
if (dictFullHistogram.ContainsKey(dayGuardHistogram.ID))
|
||||
{
|
||||
guardHistogram = dictFullHistogram[dayGuardHistogram.ID];
|
||||
guardHistogram.AddHistogram(dayGuardHistogram);
|
||||
continue;
|
||||
}
|
||||
dictFullHistogram.Add(dayGuardHistogram.ID, dayGuardHistogram);
|
||||
else
|
||||
{
|
||||
dictFullHistogram.Add(dayGuardHistogram.ID, dayGuardHistogram);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -178,14 +181,14 @@ public class Day04 : IDay
|
||||
|
||||
public class GuardEvent
|
||||
{
|
||||
public DateTime Date { get; private set; }
|
||||
public int? ID { get; private set; }
|
||||
public GuardEventType Type { get; private set; }
|
||||
public DateTime Date { get; set; }
|
||||
public int? ID { get; set; }
|
||||
public GuardEventType Type { get; set; }
|
||||
|
||||
public static GuardEvent FromString(string strEvent)
|
||||
{
|
||||
GuardEvent guardEvent = new();
|
||||
string[] parts = strEvent.Split(["[", "-", " ", ":", "]", "#"], StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] parts = strEvent.Split(new[] { "[", "-", " ", ":", "]", "#", }, StringSplitOptions.RemoveEmptyEntries);
|
||||
guardEvent.Date = new DateTime(
|
||||
Convert.ToInt32(parts[0]),
|
||||
Convert.ToInt32(parts[1]),
|
||||
@@ -213,7 +216,7 @@ public class Day04 : IDay
|
||||
public static List<GuardEvent> FromStringArray(string[] strEvents)
|
||||
{
|
||||
List<GuardEvent> guardEvents = strEvents
|
||||
.Select(FromString)
|
||||
.Select(strEvent => FromString(strEvent))
|
||||
.OrderBy(guardEvent => guardEvent.Date)
|
||||
.ToList();
|
||||
|
||||
@@ -237,14 +240,14 @@ public class Day04 : IDay
|
||||
public class GuardSleepHistogram
|
||||
{
|
||||
public const int MinutesOnHour = 60;
|
||||
public int ID { get; init; }
|
||||
public int[] SleepOnMinute { get; } = new int[MinutesOnHour];
|
||||
public int ID { get; set; }
|
||||
public int[] SleepOnMunute { get; } = new int[MinutesOnHour];
|
||||
|
||||
public void FallSleep(int minute)
|
||||
{
|
||||
for (int i = minute; i < MinutesOnHour; i++)
|
||||
{
|
||||
SleepOnMinute[i] = 1;
|
||||
SleepOnMunute[i] = 1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -252,7 +255,7 @@ public class Day04 : IDay
|
||||
{
|
||||
for (int i = minute; i < MinutesOnHour; i++)
|
||||
{
|
||||
SleepOnMinute[i] = 0;
|
||||
SleepOnMunute[i] = 0;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -260,7 +263,7 @@ public class Day04 : IDay
|
||||
{
|
||||
for (int i = 0; i < MinutesOnHour; i++)
|
||||
{
|
||||
SleepOnMinute[i] += histogram.SleepOnMinute[i];
|
||||
SleepOnMunute[i] += histogram.SleepOnMunute[i];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -108,7 +108,7 @@ public class Day05 : IDay
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
string input = inputs[0];
|
||||
List<char> allUnitTypes = input.Select(char.ToLower).Distinct().ToList();
|
||||
List<char> allUnitTypes = input.Select(c => char.ToLower(c)).Distinct().ToList();
|
||||
|
||||
int minPolymerLenght = int.MaxValue;
|
||||
foreach (char unitType in allUnitTypes)
|
||||
|
||||
@@ -96,8 +96,7 @@ public class Day06 : IDay
|
||||
{
|
||||
return inputs
|
||||
.Where(input => string.IsNullOrEmpty(input) == false)
|
||||
.Select(ChronoPoint.FromString)
|
||||
.OfType<ChronoPoint>()
|
||||
.Select(input => ChronoPoint.FromString(input))
|
||||
.ToList();
|
||||
}
|
||||
|
||||
@@ -184,12 +183,12 @@ public class Day06 : IDay
|
||||
return areaInRange;
|
||||
}
|
||||
|
||||
public int DistanceThreshold { get; init; } = 10000;
|
||||
public int DistanceThresold { get; set; } = 10000;
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
List<ChronoPoint> points = InputsToPoints(inputs);
|
||||
int areaInRange = AreaInThresold(points, DistanceThreshold);
|
||||
int areaInRange = AreaInThresold(points, DistanceThresold);
|
||||
return areaInRange.ToString();
|
||||
}
|
||||
|
||||
@@ -198,10 +197,10 @@ public class Day06 : IDay
|
||||
public int X { 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; }
|
||||
string[] parts = strPoint.Split([", "], StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] parts = strPoint.Split(new[] { ", ", }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length < 2) { return null; }
|
||||
ChronoPoint point = new() {
|
||||
X = Convert.ToInt32(parts[0]),
|
||||
|
||||
@@ -89,11 +89,11 @@ public class Day07 : IDay
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
if (string.IsNullOrEmpty(input)) { continue; }
|
||||
string[] parts = input.Split([
|
||||
string[] parts = input.Split(new[] {
|
||||
"Step ",
|
||||
" must be finished before step ",
|
||||
" can begin.",
|
||||
], StringSplitOptions.RemoveEmptyEntries);
|
||||
}, StringSplitOptions.RemoveEmptyEntries);
|
||||
instructions.AddNodeRelation(parts[1].ToUpper(), parts[0].ToUpper());
|
||||
}
|
||||
foreach (InstructionNode node in instructions.Nodes.Values)
|
||||
@@ -118,8 +118,8 @@ public class Day07 : IDay
|
||||
return sbInstructions.ToString();
|
||||
}
|
||||
|
||||
public int BaseCost { get; init; } = 60;
|
||||
public int NumberOfWorkers { get; init; } = 5;
|
||||
public int BaseCost { get; set; } = 60;
|
||||
public int NumberOfWorkers { get; set; } = 5;
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
@@ -128,11 +128,11 @@ public class Day07 : IDay
|
||||
return totalElapsedTime.ToString();
|
||||
}
|
||||
|
||||
public class InstructionNode(string nodeID)
|
||||
public class InstructionNode
|
||||
{
|
||||
public string NodeID { get; init; } = nodeID;
|
||||
public string NodeID { get; set; }
|
||||
|
||||
public List<string> PreviousNodeIDs { get; } = [];
|
||||
public List<string> PreviousNodeIDs { get; } = new();
|
||||
|
||||
public int Cost { get; set; }
|
||||
|
||||
@@ -148,18 +148,22 @@ public class Day07 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private class Instructions
|
||||
public class Instructions
|
||||
{
|
||||
public Dictionary<string, InstructionNode> Nodes { get; } = new();
|
||||
|
||||
private InstructionNode GetNode(string nodeID)
|
||||
public InstructionNode GetNode(string nodeID)
|
||||
{
|
||||
if (Nodes.TryGetValue(nodeID, out InstructionNode? nodeAux))
|
||||
InstructionNode node = null;
|
||||
if (Nodes.ContainsKey(nodeID))
|
||||
{
|
||||
return nodeAux;
|
||||
node = Nodes[nodeID];
|
||||
}
|
||||
else
|
||||
{
|
||||
node = new InstructionNode { NodeID = nodeID, };
|
||||
Nodes.Add(nodeID, node);
|
||||
}
|
||||
InstructionNode node = new(nodeID);
|
||||
Nodes.Add(nodeID, node);
|
||||
return node;
|
||||
}
|
||||
|
||||
@@ -172,7 +176,7 @@ public class Day07 : IDay
|
||||
|
||||
public List<InstructionNode> SortInstructions()
|
||||
{
|
||||
List<InstructionNode> finalNodes = [];
|
||||
List<InstructionNode> finalNodes = new();
|
||||
|
||||
foreach (InstructionNode node in Nodes.Values)
|
||||
{
|
||||
@@ -190,8 +194,7 @@ public class Day07 : IDay
|
||||
.ToList();
|
||||
if (unusedNodes.Count > 0)
|
||||
{
|
||||
InstructionNode? node = unusedNodes.FirstOrDefault();
|
||||
if (node == null) { continue; }
|
||||
InstructionNode node = unusedNodes.FirstOrDefault();
|
||||
finalNodes.Add(node);
|
||||
node.Used = true;
|
||||
}
|
||||
@@ -201,8 +204,8 @@ public class Day07 : IDay
|
||||
|
||||
private class SimulatedWorker
|
||||
{
|
||||
public InstructionNode? CurrentInstruction { get; private set; }
|
||||
private int ElapsedTime { get; set; }
|
||||
public InstructionNode CurrentInstruction { get; set; }
|
||||
public int ElapsedTime { get; set; }
|
||||
|
||||
public void SetInstruction(InstructionNode instruction)
|
||||
{
|
||||
@@ -239,6 +242,7 @@ public class Day07 : IDay
|
||||
workers.Add(new SimulatedWorker());
|
||||
}
|
||||
|
||||
bool anyWorkerWitoutWork;
|
||||
do
|
||||
{
|
||||
bool anyWorkDone = false;
|
||||
@@ -251,8 +255,8 @@ public class Day07 : IDay
|
||||
}
|
||||
if (anyWorkDone) { totalElapsedTime++; }
|
||||
|
||||
bool anyWorkerWithoutWork = workers.Any(w => w.CurrentInstruction == null);
|
||||
if (anyWorkerWithoutWork)
|
||||
anyWorkerWitoutWork = workers.Any(w => w.CurrentInstruction == null);
|
||||
if (anyWorkerWitoutWork)
|
||||
{
|
||||
List<InstructionNode> unusedNodes = Nodes.Values
|
||||
.Where(n =>
|
||||
|
||||
@@ -77,13 +77,13 @@ public class Day08 : IDay
|
||||
|
||||
public class IntStream
|
||||
{
|
||||
private readonly int[] _values;
|
||||
private int[] _values;
|
||||
private int _index;
|
||||
|
||||
public IntStream(string strValues)
|
||||
{
|
||||
_values = strValues
|
||||
.Split([" "], StringSplitOptions.RemoveEmptyEntries)
|
||||
.Split(new[] { " ", }, StringSplitOptions.RemoveEmptyEntries)
|
||||
.Select(strVal => Convert.ToInt32(strVal))
|
||||
.ToArray();
|
||||
_index = 0;
|
||||
@@ -99,9 +99,9 @@ public class Day08 : IDay
|
||||
|
||||
public class ChronoLicenceNode
|
||||
{
|
||||
public List<ChronoLicenceNode> Childs { get; } = [];
|
||||
public List<ChronoLicenceNode> Childs { get; } = new();
|
||||
|
||||
public List<int> Metadata { get; } = [];
|
||||
public List<int> Metadata { get; } = new();
|
||||
|
||||
public static ChronoLicenceNode BuildFromIntStream(IntStream stream)
|
||||
{
|
||||
|
||||
@@ -75,7 +75,7 @@ public class Day09 : IDay
|
||||
|
||||
private static string CalculateHighScore(string input, long factor)
|
||||
{
|
||||
string[] parts = input.Split([" players; last marble is worth ", " points"], StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] parts = input.Split(new[] { " players; last marble is worth ", " points" }, StringSplitOptions.RemoveEmptyEntries);
|
||||
long numberOfPlayers = Convert.ToInt32(parts[0]);
|
||||
long lastMarble = Convert.ToInt32(parts[1]) * factor;
|
||||
MarbleGame marbleGame = new();
|
||||
@@ -86,17 +86,17 @@ public class Day09 : IDay
|
||||
|
||||
public class Marble
|
||||
{
|
||||
public long Value { get; init; }
|
||||
public Marble? Previous { get; set; }
|
||||
public Marble? Next { get; set; }
|
||||
public long Value { get; set; }
|
||||
public Marble Previous { get; set; }
|
||||
public Marble Next { get; set; }
|
||||
}
|
||||
|
||||
public class MarbleGame
|
||||
{
|
||||
private Dictionary<long, long> Scores { get; } = new();
|
||||
public Dictionary<long, long> Scores { get; } = new();
|
||||
|
||||
private Marble? _firstMarble;
|
||||
private Marble? _currentMarble;
|
||||
private Marble _firstMarble;
|
||||
private Marble _currentMarble;
|
||||
private long _currentPlayer;
|
||||
|
||||
private const long PointValueMultiple = 23;
|
||||
@@ -119,34 +119,20 @@ public class Day09 : IDay
|
||||
Marble newMarble = new() { Value = i + 1 };
|
||||
if ((newMarble.Value % PointValueMultiple) > 0)
|
||||
{
|
||||
Marble? previousMarble = _currentMarble?.Next;
|
||||
Marble? nextMarble = previousMarble?.Next;
|
||||
Marble previousMarble = _currentMarble.Next;
|
||||
Marble nextMarble = previousMarble.Next;
|
||||
newMarble.Previous = previousMarble;
|
||||
newMarble.Next = nextMarble;
|
||||
if(previousMarble != null)
|
||||
{
|
||||
previousMarble.Next = newMarble;
|
||||
}
|
||||
if(nextMarble != null)
|
||||
{
|
||||
nextMarble.Previous = newMarble;
|
||||
}
|
||||
previousMarble.Next = newMarble;
|
||||
nextMarble.Previous = newMarble;
|
||||
_currentMarble = newMarble;
|
||||
}
|
||||
else
|
||||
{
|
||||
Marble? marbleToRemove = _currentMarble?.Previous?.Previous?.Previous?.Previous?.Previous?.Previous?.Previous;
|
||||
_currentMarble = marbleToRemove?.Next;
|
||||
if (marbleToRemove == null) { continue; }
|
||||
|
||||
if(marbleToRemove.Previous != null)
|
||||
{
|
||||
marbleToRemove.Previous.Next = marbleToRemove.Next;
|
||||
}
|
||||
if (marbleToRemove.Next != null)
|
||||
{
|
||||
marbleToRemove.Next.Previous = marbleToRemove.Previous;
|
||||
}
|
||||
Marble marbleToRemove = _currentMarble.Previous.Previous.Previous.Previous.Previous.Previous.Previous;
|
||||
_currentMarble = marbleToRemove.Next;
|
||||
marbleToRemove.Previous.Next = marbleToRemove.Next;
|
||||
marbleToRemove.Next.Previous = marbleToRemove.Previous;
|
||||
|
||||
long currentPlayerScore = Scores[_currentPlayer] + (newMarble.Value + marbleToRemove.Value);
|
||||
Scores[_currentPlayer] = currentPlayerScore;
|
||||
@@ -155,17 +141,22 @@ public class Day09 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private void PrintStatus()
|
||||
public void PrintStatus()
|
||||
{
|
||||
Console.Write("[{0}] ", _currentPlayer);
|
||||
Marble? marble = _firstMarble;
|
||||
Marble marble = _firstMarble;
|
||||
do
|
||||
{
|
||||
Console.Write(_currentMarble?.Value == marble?.Value
|
||||
? "({0}) "
|
||||
: "{0} ", marble?.Value);
|
||||
marble = marble?.Next;
|
||||
} while (marble != null && marble.Value != 0);
|
||||
if (_currentMarble.Value == marble.Value)
|
||||
{
|
||||
Console.Write("({0}) ", marble.Value);
|
||||
}
|
||||
else
|
||||
{
|
||||
Console.Write("{0} ", marble.Value);
|
||||
}
|
||||
marble = marble.Next;
|
||||
} while (marble.Value != 0);
|
||||
Console.WriteLine();
|
||||
}
|
||||
|
||||
|
||||
@@ -156,13 +156,13 @@ Impressed by your sub-hour communication capabilities, the Elves are curious: ex
|
||||
|
||||
public class Day10 : IDay
|
||||
{
|
||||
public int Width { get; init; } = 65;
|
||||
public int Height { get; init; } = 12;
|
||||
public int Width { get; set; } = 65;
|
||||
public int Height { get; set; } = 12;
|
||||
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
LightField lightField = new(inputs);
|
||||
int t = lightField.SearchSmallerBoundingBox();
|
||||
int t = lightField.SearchSmallerBoundindBox();
|
||||
string result = lightField.Render(t, Width, Height);
|
||||
return result;
|
||||
}
|
||||
@@ -170,20 +170,20 @@ public class Day10 : IDay
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
LightField lightField = new(inputs);
|
||||
int t = lightField.SearchSmallerBoundingBox();
|
||||
int t = lightField.SearchSmallerBoundindBox();
|
||||
return t.ToString();
|
||||
}
|
||||
|
||||
public class LightPoint
|
||||
{
|
||||
private int X { get; init; }
|
||||
private int Y { get; init; }
|
||||
private int VX { get; init; }
|
||||
private int VY { get; init; }
|
||||
public int X { get; set; }
|
||||
public int Y { get; set; }
|
||||
public int VX { get; set; }
|
||||
public int VY { get; set; }
|
||||
|
||||
public static LightPoint FromString(string strPoint)
|
||||
{
|
||||
string[] parts = strPoint.Split(["position=<", " ", ",", "> velocity=<", ">"], StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] parts = strPoint.Split(new[] { "position=<", " ", ",", "> velocity=<", ">" }, StringSplitOptions.RemoveEmptyEntries);
|
||||
LightPoint point = new() {
|
||||
X = Convert.ToInt32(parts[0]),
|
||||
Y = Convert.ToInt32(parts[1]),
|
||||
@@ -204,11 +204,16 @@ public class Day10 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private class LightField(string[] strPoints)
|
||||
public class LightField
|
||||
{
|
||||
private readonly List<LightPoint> _points = strPoints.Select(LightPoint.FromString).ToList();
|
||||
private readonly List<LightPoint> _points;
|
||||
|
||||
public int SearchSmallerBoundingBox()
|
||||
public LightField(string[] strPoints)
|
||||
{
|
||||
_points = strPoints.Select(strPoint => LightPoint.FromString(strPoint)).ToList();
|
||||
}
|
||||
|
||||
public int SearchSmallerBoundindBox()
|
||||
{
|
||||
int minHeight = int.MaxValue;
|
||||
int minT = 0;
|
||||
@@ -283,7 +288,14 @@ public class Day10 : IDay
|
||||
sb.AppendLine();
|
||||
for (int i = 0; i < width; i++)
|
||||
{
|
||||
sb.Append(field[i, j] > 0 ? "#" : ".");
|
||||
if (field[i, j] > 0)
|
||||
{
|
||||
sb.Append("#");
|
||||
}
|
||||
else
|
||||
{
|
||||
sb.Append(".");
|
||||
}
|
||||
}
|
||||
}
|
||||
return sb.ToString();
|
||||
|
||||
@@ -190,7 +190,7 @@ public class Day11 : IDay
|
||||
return powerLevel;
|
||||
}
|
||||
|
||||
private static void SearchBestRegion(int width, int height, int serial, out int x, out int y, out int size)
|
||||
public 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 bestPowerLevel = int.MinValue;
|
||||
|
||||
@@ -96,23 +96,23 @@ public class Day12 : IDay
|
||||
|
||||
private class PlantRule
|
||||
{
|
||||
public bool Minus2 { get; init; }
|
||||
public bool Minus1 { get; init; }
|
||||
public bool Current { get; init; }
|
||||
public bool Plus1 { get; init; }
|
||||
public bool Plus2 { get; init; }
|
||||
public bool Minus2 { get; set; }
|
||||
public bool Minus1 { get; set; }
|
||||
public bool Current { get; set; }
|
||||
public bool Plus1 { get; set; }
|
||||
public bool Plus2 { get; set; }
|
||||
|
||||
public bool Result { get; init; }
|
||||
public bool Result { get; set; }
|
||||
}
|
||||
|
||||
private const int SideMargin = 5;
|
||||
private const int SideProcessMargin = 2;
|
||||
|
||||
private readonly List<bool> _initialState = [];
|
||||
private readonly List<PlantRule> _rules = [];
|
||||
private List<bool> _initialState = new();
|
||||
private List<PlantRule> _rules = new();
|
||||
private long _offsetField;
|
||||
private bool[] _field = [];
|
||||
private bool[] _workField = [];
|
||||
private bool[] _field;
|
||||
private bool[] _workField;
|
||||
|
||||
private void Initialize(string[] inputs)
|
||||
{
|
||||
@@ -126,8 +126,9 @@ public class Day12 : IDay
|
||||
for (int i = 2; i < inputs.Length; i++)
|
||||
{
|
||||
if (string.IsNullOrEmpty(inputs[i])) { continue; }
|
||||
string[] parts = inputs[i].Split([" => "], StringSplitOptions.RemoveEmptyEntries);
|
||||
_rules.Add(new PlantRule {
|
||||
string[] parts = inputs[i].Split(new[] { " => " }, StringSplitOptions.RemoveEmptyEntries);
|
||||
_rules.Add(new PlantRule
|
||||
{
|
||||
Minus2 = (parts[0][0] == '#'),
|
||||
Minus1 = (parts[0][1] == '#'),
|
||||
Current = (parts[0][2] == '#'),
|
||||
@@ -150,7 +151,9 @@ public class Day12 : IDay
|
||||
|
||||
private void SwapFields()
|
||||
{
|
||||
(_field, _workField) = (_workField, _field);
|
||||
bool[] aux = _field;
|
||||
_field = _workField;
|
||||
_workField = aux;
|
||||
}
|
||||
|
||||
private void RecenterField()
|
||||
@@ -233,7 +236,8 @@ public class Day12 : IDay
|
||||
rule.Minus1 == minus1 &&
|
||||
rule.Current == current &&
|
||||
rule.Plus1 == plus1 &&
|
||||
rule.Plus2 == plus2
|
||||
rule.Plus2 == plus2 &&
|
||||
true
|
||||
)
|
||||
{
|
||||
result = rule.Result;
|
||||
|
||||
@@ -217,7 +217,7 @@ public class Day13 : IDay
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
Initialize(inputs);
|
||||
Train? collidingTrain;
|
||||
Train collidingTrain;
|
||||
do
|
||||
{
|
||||
if (ShowProgress) { ShowGrid(); }
|
||||
@@ -229,7 +229,7 @@ public class Day13 : IDay
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
Initialize(inputs);
|
||||
Train? lastCart;
|
||||
Train lastCart;
|
||||
do
|
||||
{
|
||||
if (ShowProgress) { ShowGrid(); }
|
||||
@@ -371,8 +371,8 @@ public class Day13 : IDay
|
||||
|
||||
private int _width;
|
||||
private int _height;
|
||||
private char[,] _grid = new char[0, 0];
|
||||
private readonly List<Train> _trains = [];
|
||||
private char[,] _grid;
|
||||
private List<Train> _trains = new();
|
||||
|
||||
private void Initialize(string[] inputs)
|
||||
{
|
||||
@@ -387,7 +387,8 @@ public class Day13 : IDay
|
||||
char cell = inputs[j][i];
|
||||
if (cell == '^')
|
||||
{
|
||||
_trains.Add(new Train {
|
||||
_trains.Add(new Train
|
||||
{
|
||||
X = i,
|
||||
Y = j,
|
||||
Direction = TrainDirection.North,
|
||||
@@ -397,7 +398,8 @@ public class Day13 : IDay
|
||||
}
|
||||
if (cell == 'v')
|
||||
{
|
||||
_trains.Add(new Train {
|
||||
_trains.Add(new Train
|
||||
{
|
||||
X = i,
|
||||
Y = j,
|
||||
Direction = TrainDirection.South,
|
||||
@@ -407,7 +409,8 @@ public class Day13 : IDay
|
||||
}
|
||||
if (cell == '<')
|
||||
{
|
||||
_trains.Add(new Train {
|
||||
_trains.Add(new Train
|
||||
{
|
||||
X = i,
|
||||
Y = j,
|
||||
Direction = TrainDirection.West,
|
||||
@@ -417,7 +420,8 @@ public class Day13 : IDay
|
||||
}
|
||||
if (cell == '>')
|
||||
{
|
||||
_trains.Add(new Train {
|
||||
_trains.Add(new Train
|
||||
{
|
||||
X = i,
|
||||
Y = j,
|
||||
Direction = TrainDirection.East,
|
||||
@@ -430,9 +434,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));
|
||||
foreach (Train t in orderedTrains)
|
||||
{
|
||||
@@ -443,13 +447,13 @@ public class Day13 : IDay
|
||||
return collidingTrain;
|
||||
}
|
||||
|
||||
private Train? SimulateForLastCart()
|
||||
private Train SimulateForLastCart()
|
||||
{
|
||||
List<Train> orderedTrains = _trains.OrderBy(t => t.X + (t.Y * _width)).ToList();
|
||||
foreach (Train t in orderedTrains)
|
||||
{
|
||||
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)
|
||||
{
|
||||
_trains.Remove(t);
|
||||
@@ -470,7 +474,7 @@ public class Day13 : IDay
|
||||
{
|
||||
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.Direction == TrainDirection.North)
|
||||
@@ -498,4 +502,5 @@ public class Day13 : IDay
|
||||
Console.WriteLine();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -62,7 +62,7 @@ public class Day14 : IDay
|
||||
{
|
||||
private long _numRecipes;
|
||||
private long _numRecipesAllocated;
|
||||
private byte[] _recipes = [];
|
||||
private byte[] _recipes;
|
||||
private long _idxA;
|
||||
private long _idxB;
|
||||
private long _searchSkip;
|
||||
|
||||
@@ -377,18 +377,18 @@ public class Day15 : IDay
|
||||
{
|
||||
public enum EntityType { Elf, Goblin, }
|
||||
|
||||
private bool Show { get; set; } = false;
|
||||
public bool Show { get; set; } = false;
|
||||
|
||||
public class Entity
|
||||
{
|
||||
private const int GoblinAttackPower = 3;
|
||||
public const int GoblinAttackPower = 3;
|
||||
public static int ElfAttackPower { get; set; } = 3;
|
||||
private const int InitialHealth = 200;
|
||||
public const int InitialHealth = 200;
|
||||
|
||||
public EntityType Type { get; init; }
|
||||
public EntityType Type { get; set; }
|
||||
public int X { get; set; }
|
||||
public int Y { get; set; }
|
||||
public int Health { get; private set; } = InitialHealth;
|
||||
public int Health { get; set; } = InitialHealth;
|
||||
|
||||
public bool IsAlive()
|
||||
{
|
||||
@@ -401,17 +401,18 @@ public class Day15 : IDay
|
||||
(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) ||
|
||||
false
|
||||
)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
public void Attack(char[,] map, Entity other)
|
||||
{
|
||||
if (Type == EntityType.Elf)
|
||||
if(Type == EntityType.Elf)
|
||||
{
|
||||
other.Health -= ElfAttackPower;
|
||||
}
|
||||
@@ -434,27 +435,28 @@ public class Day15 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private class Target
|
||||
public class Target
|
||||
{
|
||||
public int X { get; init; }
|
||||
public int Y { get; init; }
|
||||
public int X { get; set; }
|
||||
public int Y { get; set; }
|
||||
public int Distance { get; set; }
|
||||
public int Priority { get; init; }
|
||||
public int Priority { get; set; }
|
||||
public Entity Entity { get; set; }
|
||||
}
|
||||
|
||||
private int _width;
|
||||
private int _height;
|
||||
private char[,] _map = new char[0, 0];
|
||||
private readonly List<Entity> _entities = [];
|
||||
private BreadthFirstSearchGrid? _search;
|
||||
private char[,] _map;
|
||||
private List<Entity> _entities;
|
||||
private BreadthFirstSearchGrid _search;
|
||||
private int _rounds;
|
||||
|
||||
|
||||
private void Init(string[] inputs)
|
||||
{
|
||||
_height = inputs.Length;
|
||||
_width = inputs.Max(input => input.Length);
|
||||
_map = new char[_width, _height];
|
||||
_entities.Clear();
|
||||
_entities = new List<Entity>();
|
||||
for (int j = 0; j < _height; j++)
|
||||
{
|
||||
for (int i = 0; i < _width; i++)
|
||||
@@ -471,7 +473,8 @@ public class Day15 : IDay
|
||||
}
|
||||
else if (cell == 'E')
|
||||
{
|
||||
_entities.Add(new Entity {
|
||||
_entities.Add(new Entity
|
||||
{
|
||||
Type = EntityType.Elf,
|
||||
X = i,
|
||||
Y = j,
|
||||
@@ -480,7 +483,8 @@ public class Day15 : IDay
|
||||
}
|
||||
else if (cell == 'G')
|
||||
{
|
||||
_entities.Add(new Entity {
|
||||
_entities.Add(new Entity
|
||||
{
|
||||
Type = EntityType.Goblin,
|
||||
X = i,
|
||||
Y = j,
|
||||
@@ -501,7 +505,7 @@ public class Day15 : IDay
|
||||
.ThenBy(e => e.X);
|
||||
}
|
||||
|
||||
private IEnumerable<Entity> GetTargetEntities(Entity entity)
|
||||
public IEnumerable<Entity> GetTargetEntities(Entity entity)
|
||||
{
|
||||
return _entities
|
||||
.Where(e => e.IsAlive() && e.Type != entity.Type)
|
||||
@@ -509,29 +513,30 @@ public class Day15 : IDay
|
||||
.ThenBy(e => e.X);
|
||||
}
|
||||
|
||||
private Entity? GetBestInRangeTarget(Entity entity, IEnumerable<Entity> targets)
|
||||
public Entity GetBestInRangeTarget(Entity entity, IEnumerable<Entity> targets)
|
||||
{
|
||||
return targets
|
||||
.Where(entity.InRangeOf)
|
||||
.Where(e => entity.InRangeOf(e))
|
||||
.OrderBy(e => e.Health)
|
||||
.ThenBy(e => e.Y)
|
||||
.ThenBy(e => e.X)
|
||||
.FirstOrDefault();
|
||||
}
|
||||
|
||||
private void AddTarget(List<Target> targets, int targetX, int targetY, int priority)
|
||||
private void AddTarget(List<Target> targets, int targetX, int targetY, int priority, Entity entity)
|
||||
{
|
||||
if (_search == null) { return;}
|
||||
if (targetX >= 0 && targetX < _width && targetY >= 0 && targetY < _height && _map[targetX, targetY] == '.')
|
||||
{
|
||||
int distance = _search.QueryDistance(targetX, targetY);
|
||||
if (distance >= 0)
|
||||
{
|
||||
targets.Add(new Target {
|
||||
targets.Add(new Target
|
||||
{
|
||||
X = targetX,
|
||||
Y = targetY,
|
||||
Distance = distance,
|
||||
Priority = priority,
|
||||
Entity = entity,
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -539,7 +544,6 @@ public class Day15 : IDay
|
||||
|
||||
private void RunBattle()
|
||||
{
|
||||
if (_search == null) { return;}
|
||||
_rounds = 0;
|
||||
bool running = true;
|
||||
do
|
||||
@@ -548,7 +552,7 @@ public class Day15 : IDay
|
||||
foreach (Entity entity in entities)
|
||||
{
|
||||
if (entity.IsAlive() == false) { continue; }
|
||||
IEnumerable<Entity> entitiesTargets = GetTargetEntities(entity).ToList();
|
||||
IEnumerable<Entity> entitiesTargets = GetTargetEntities(entity);
|
||||
if (entitiesTargets.Any() == false)
|
||||
{
|
||||
running = false;
|
||||
@@ -556,7 +560,7 @@ public class Day15 : IDay
|
||||
}
|
||||
|
||||
// Attack
|
||||
Entity? targetInRange = GetBestInRangeTarget(entity, entitiesTargets);
|
||||
Entity targetInRange = GetBestInRangeTarget(entity, entitiesTargets);
|
||||
if (targetInRange != null)
|
||||
{
|
||||
entity.Attack(_map, targetInRange);
|
||||
@@ -569,18 +573,19 @@ public class Day15 : IDay
|
||||
int priority = 0;
|
||||
foreach (Entity entityTarget in entitiesTargets)
|
||||
{
|
||||
AddTarget(targets, entityTarget.X, entityTarget.Y - 1, priority++);
|
||||
AddTarget(targets, entityTarget.X - 1, entityTarget.Y, priority++);
|
||||
AddTarget(targets, entityTarget.X + 1, entityTarget.Y, priority++);
|
||||
AddTarget(targets, entityTarget.X, entityTarget.Y + 1, priority++);
|
||||
AddTarget(targets, entityTarget.X, entityTarget.Y - 1, priority++, entityTarget);
|
||||
AddTarget(targets, entityTarget.X - 1, entityTarget.Y, priority++, entityTarget);
|
||||
AddTarget(targets, entityTarget.X + 1, entityTarget.Y, priority++, entityTarget);
|
||||
AddTarget(targets, entityTarget.X, entityTarget.Y + 1, priority++, entityTarget);
|
||||
}
|
||||
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)
|
||||
{
|
||||
_search.SearchCharGrid(_map, '.', bestTarget.X, bestTarget.Y);
|
||||
targets.Clear();
|
||||
Target dirTarget;
|
||||
|
||||
Target dirTarget = new() { X = entity.X, Y = entity.Y - 1, Priority = 0, };
|
||||
dirTarget = new Target { X = entity.X, Y = entity.Y - 1, Priority = 0, };
|
||||
dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y);
|
||||
if (dirTarget.Distance >= 0) targets.Add(dirTarget);
|
||||
|
||||
@@ -596,7 +601,7 @@ public class Day15 : IDay
|
||||
dirTarget.Distance = _search.QueryDistance(dirTarget.X, dirTarget.Y);
|
||||
if (dirTarget.Distance >= 0) targets.Add(dirTarget);
|
||||
|
||||
Target? finalTarget = targets
|
||||
Target finalTarget = targets
|
||||
.OrderBy(t => t.Distance)
|
||||
.ThenBy(t => t.Priority)
|
||||
.FirstOrDefault();
|
||||
@@ -604,21 +609,21 @@ public class Day15 : IDay
|
||||
{
|
||||
throw new Exception("No possible direction");
|
||||
}
|
||||
|
||||
|
||||
entity.MoveTo(_map, finalTarget.X, finalTarget.Y);
|
||||
|
||||
// Attack
|
||||
Entity? targetInRangeAfterMove = GetBestInRangeTarget(entity, entitiesTargets);
|
||||
Entity targetInRangeAfterMove = GetBestInRangeTarget(entity, entitiesTargets);
|
||||
if (targetInRangeAfterMove != null)
|
||||
{
|
||||
entity.Attack(_map, targetInRangeAfterMove);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (running == false) { break; }
|
||||
if(running == false) { break; }
|
||||
_rounds++;
|
||||
if (Show) { PrintBattlefield(); }
|
||||
} while (true);
|
||||
} while (running);
|
||||
if (Show) { PrintBattlefield(); }
|
||||
}
|
||||
|
||||
@@ -632,8 +637,7 @@ public class Day15 : IDay
|
||||
{
|
||||
Console.Write(_map[i, j]);
|
||||
}
|
||||
int j1 = j;
|
||||
IEnumerable<Entity> entitiesOnLine = _entities.Where(e => e.IsAlive() && e.Y == j1).OrderBy(e => e.X);
|
||||
IEnumerable<Entity> entitiesOnLine = _entities.Where(e => e.IsAlive() && e.Y == j).OrderBy(e => e.X);
|
||||
foreach (Entity entity in entitiesOnLine)
|
||||
{
|
||||
Console.Write(" {0}({1})", (entity.Type == EntityType.Elf) ? 'E' : 'G', entity.Health);
|
||||
@@ -679,15 +683,16 @@ public class Day15 : IDay
|
||||
private class BFSCell
|
||||
{
|
||||
public bool Visited { get; set; }
|
||||
public BFSCell CameFrom { get; set; }
|
||||
public int Distance { get; set; } = -1;
|
||||
public int X { get; init; }
|
||||
public int Y { get; init; }
|
||||
public int X { get; set; }
|
||||
public int Y { get; set; }
|
||||
}
|
||||
|
||||
private readonly BFSCell[,] _grid;
|
||||
private readonly int _width;
|
||||
private readonly int _height;
|
||||
|
||||
|
||||
public BreadthFirstSearchGrid(int width, int height)
|
||||
{
|
||||
_grid = new BFSCell[width, height];
|
||||
@@ -702,23 +707,24 @@ public class Day15 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private void Reset()
|
||||
public 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];
|
||||
cell.Visited = false;
|
||||
cell.CameFrom = null;
|
||||
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 (grid[nextX, nextY] == empty || current == null)
|
||||
if (grid[nextX, nextY] == empty || current== null)
|
||||
{
|
||||
BFSCell cell = _grid[nextX, nextY];
|
||||
if (cell.Visited == false)
|
||||
@@ -726,6 +732,7 @@ public class Day15 : IDay
|
||||
frontier.Enqueue(cell);
|
||||
cell.Visited = true;
|
||||
cell.Distance = (current?.Distance ?? -1) + 1;
|
||||
cell.CameFrom = current;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -87,8 +87,8 @@ public class Day16 : IDay
|
||||
int count = 0;
|
||||
int i = 0;
|
||||
bool end = false;
|
||||
int[]? beforeRegisters = null;
|
||||
int[]? instruction = null;
|
||||
int[] beforeRegisters = null;
|
||||
int[] instruction = null;
|
||||
const string beforeKeyword = "Before: [";
|
||||
const string afterKeyword = "After: [";
|
||||
while (inputs.Length > i)
|
||||
@@ -160,11 +160,17 @@ public class Day16 : IDay
|
||||
|
||||
private readonly List<ChronoInstruction> _instructions;
|
||||
|
||||
private class ChronoInstruction(string opName, Action<int, int, int> opFunc)
|
||||
private class ChronoInstruction
|
||||
{
|
||||
public int OpCode { get; set; } = -1;
|
||||
public string OpName { get; } = opName;
|
||||
public Action<int, int, int> OpFunc { get; } = opFunc;
|
||||
public string OpName { get; }
|
||||
public Action<int, int, int> OpFunc { get; }
|
||||
|
||||
public ChronoInstruction(string opName, Action<int, int, int> opFunc)
|
||||
{
|
||||
OpName = opName;
|
||||
OpFunc = opFunc;
|
||||
}
|
||||
|
||||
public Dictionary<int, int> OpCodeHistogram { get; } = new();
|
||||
|
||||
@@ -185,7 +191,7 @@ public class Day16 : IDay
|
||||
public ChronoMachine()
|
||||
{
|
||||
_registers = new int[4];
|
||||
_instructions = [
|
||||
_instructions = new List<ChronoInstruction> {
|
||||
new("addr", Op_AddR),
|
||||
new("addi", Op_AddI),
|
||||
new("mulr", Op_MulR),
|
||||
@@ -202,7 +208,7 @@ public class Day16 : IDay
|
||||
new("eqir", Op_EqIR),
|
||||
new("eqri", Op_EqRI),
|
||||
new("eqrr", Op_EqRR),
|
||||
];
|
||||
};
|
||||
}
|
||||
|
||||
public void ResetRegisters()
|
||||
@@ -335,7 +341,7 @@ public class Day16 : IDay
|
||||
|
||||
public void InitOpCodes(bool debug = false)
|
||||
{
|
||||
if (debug)
|
||||
if(debug)
|
||||
{
|
||||
foreach (ChronoInstruction instruction in _instructions)
|
||||
{
|
||||
@@ -368,7 +374,7 @@ public class Day16 : IDay
|
||||
|
||||
instruction.OpCode = opCode;
|
||||
_dictInstructions.Add(opCode, instruction);
|
||||
if (debug) { Console.WriteLine($"{instruction.OpName}: {instruction.OpCode}"); }
|
||||
if(debug) { Console.WriteLine($"{instruction.OpName}: {instruction.OpCode}"); }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -68,8 +68,8 @@ public class Day23 : IDay
|
||||
public string ResolvePart1(string[] inputs)
|
||||
{
|
||||
List<NanoBot> nanoBots = NanoBot.ListFromStrings(inputs);
|
||||
NanoBot? bestNanoBot = nanoBots.OrderBy(nanoBot => nanoBot.Range).LastOrDefault();
|
||||
int countInRange = nanoBots.Count(nanoBot => bestNanoBot?.InRange(nanoBot) == true);
|
||||
NanoBot bestNanoBot = nanoBots.OrderBy(nanoBot => nanoBot.Range).LastOrDefault();
|
||||
int countInRange = nanoBots.Where(nanoBot => bestNanoBot.InRange(nanoBot)).Count();
|
||||
return countInRange.ToString();
|
||||
}
|
||||
|
||||
@@ -82,7 +82,7 @@ public class Day23 : IDay
|
||||
long minX = long.MaxValue;
|
||||
long minY = 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 > maxX) { maxX = nanoBot.X; }
|
||||
@@ -95,7 +95,7 @@ public class Day23 : IDay
|
||||
long sizeY = maxY - minY;
|
||||
long sizeZ = maxZ - minZ;
|
||||
long scale = Math.Min(sizeX, Math.Min(sizeY, sizeZ));
|
||||
|
||||
|
||||
do
|
||||
{
|
||||
scale /= 2;
|
||||
@@ -112,11 +112,11 @@ public class Day23 : IDay
|
||||
for (long i = minX; i <= maxX; i += scale)
|
||||
{
|
||||
int count = 0;
|
||||
foreach (NanoBot nanoBot in nanoBots)
|
||||
foreach(NanoBot nanoBot in nanoBots)
|
||||
{
|
||||
if (nanoBot.InRange(i, j, k, scale)) { count++; }
|
||||
}
|
||||
if (count > bestCount)
|
||||
if(count> bestCount)
|
||||
{
|
||||
bestX = i;
|
||||
bestY = j;
|
||||
@@ -134,7 +134,7 @@ public class Day23 : IDay
|
||||
minZ = bestZ - scale;
|
||||
maxZ = bestZ + scale;
|
||||
|
||||
if (scale == 1)
|
||||
if(scale == 1)
|
||||
{
|
||||
long distance = bestX + bestY + bestZ;
|
||||
return distance.ToString();
|
||||
@@ -145,14 +145,14 @@ public class Day23 : IDay
|
||||
|
||||
public class NanoBot
|
||||
{
|
||||
public long X { get; private init; }
|
||||
public long Y { get; private init; }
|
||||
public long Z { get; private init; }
|
||||
public long Range { get; private init; }
|
||||
public long X { get; set; }
|
||||
public long Y { get; set; }
|
||||
public long Z { get; set; }
|
||||
public long Range { get; set; }
|
||||
|
||||
private static NanoBot? FromString(string strInput)
|
||||
public static NanoBot FromString(string strInput)
|
||||
{
|
||||
string[] parts = strInput.Split(["pos=<", ",", ">, r="], StringSplitOptions.RemoveEmptyEntries);
|
||||
string[] parts = strInput.Split(new[] { "pos=<", ",", ">, r=", }, StringSplitOptions.RemoveEmptyEntries);
|
||||
if (parts.Length != 4) { return null; }
|
||||
NanoBot nanoBot = new() {
|
||||
X = Convert.ToInt64(parts[0]),
|
||||
@@ -166,18 +166,18 @@ public class Day23 : IDay
|
||||
public static List<NanoBot> ListFromStrings(string[] inputs)
|
||||
{
|
||||
List<NanoBot> nanoBots = inputs
|
||||
.Select(FromString)
|
||||
.OfType<NanoBot>()
|
||||
.Select(strInput => FromString(strInput))
|
||||
.Where(nanoBot => nanoBot != null)
|
||||
.ToList();
|
||||
return nanoBots;
|
||||
}
|
||||
|
||||
private long ManhattanDistance(NanoBot other)
|
||||
public long ManhattanDistance(NanoBot other)
|
||||
{
|
||||
return ManhattanDistance(other.X, other.Y, other.Z);
|
||||
}
|
||||
|
||||
private long ManhattanDistance(long x, long y, long z)
|
||||
public long ManhattanDistance(long x, long y, long z)
|
||||
{
|
||||
long distance = Math.Abs(X - x) + Math.Abs(Y - y) + Math.Abs(Z - z);
|
||||
return distance;
|
||||
|
||||
@@ -1,26 +1,24 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2020.Tests</RootNamespace>
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2020.Tests</RootNamespace>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
<IsPackable>false</IsPackable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
|
||||
<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>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<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="..\AdventOfCode2020\AdventOfCode2020.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode2020\AdventOfCode2020.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -7,16 +7,16 @@ public class Day01_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day01 day = new();
|
||||
var day = new Day01();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"1721",
|
||||
"979",
|
||||
"366",
|
||||
"299",
|
||||
"675",
|
||||
"1456",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("514579", result);
|
||||
}
|
||||
@@ -28,16 +28,16 @@ public class Day01_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day01 day = new();
|
||||
var day = new Day01();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"1721",
|
||||
"979",
|
||||
"366",
|
||||
"299",
|
||||
"675",
|
||||
"1456",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("241861950", result);
|
||||
}
|
||||
|
||||
@@ -7,13 +7,13 @@ public class Day02_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day02 day = new();
|
||||
var day = new Day02();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"1-3 a: abcde",
|
||||
"1-3 b: cdefg",
|
||||
"2-9 c: ccccccccc",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
@@ -25,13 +25,13 @@ public class Day02_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day02 day = new();
|
||||
var day = new Day02();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"1-3 a: abcde",
|
||||
"1-3 b: cdefg",
|
||||
"2-9 c: ccccccccc",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("1", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day03_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day03 day = new();
|
||||
var day = new Day03();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"..##.......",
|
||||
"#...#...#..",
|
||||
".#....#..#.",
|
||||
@@ -19,7 +19,7 @@ public class Day03_Tests
|
||||
"#.##...#...",
|
||||
"#...##....#",
|
||||
".#..#...#.#",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("7", result);
|
||||
}
|
||||
@@ -27,9 +27,9 @@ public class Day03_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day03 day = new();
|
||||
var day = new Day03();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"..##.......",
|
||||
"#...#...#..",
|
||||
".#....#..#.",
|
||||
@@ -41,7 +41,7 @@ public class Day03_Tests
|
||||
"#.##...#...",
|
||||
"#...##....#",
|
||||
".#..#...#.#",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("336", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day04_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day04 day = new();
|
||||
var day = new Day04();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"ecl:gry pid:860033327 eyr:2020 hcl:#fffffd",
|
||||
"byr:1937 iyr:2017 cid:147 hgt:183cm",
|
||||
"",
|
||||
@@ -21,7 +21,7 @@ public class Day04_Tests
|
||||
"",
|
||||
"hcl:#cfa07d eyr:2025 pid:166559648",
|
||||
"iyr:2011 ecl:brn hgt:59in",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
@@ -29,9 +29,9 @@ public class Day04_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__ExampleInvalid()
|
||||
{
|
||||
Day04 day = new();
|
||||
var day = new Day04();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"eyr:1972 cid:100",
|
||||
"hcl:#18171d ecl:amb hgt:170 pid:186cm iyr:2018 byr:1926",
|
||||
"",
|
||||
@@ -45,7 +45,7 @@ public class Day04_Tests
|
||||
"hgt:59cm ecl:zzz",
|
||||
"eyr:2038 hcl:74454a iyr:2023",
|
||||
"pid:3556412378 byr:2007",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("0", result);
|
||||
}
|
||||
@@ -53,9 +53,9 @@ public class Day04_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__ExampleValid()
|
||||
{
|
||||
Day04 day = new();
|
||||
var day = new Day04();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"pid:087499704 hgt:74in ecl:grn iyr:2012 eyr:2030 byr:1980",
|
||||
"hcl:#623a2f",
|
||||
"",
|
||||
@@ -68,7 +68,7 @@ public class Day04_Tests
|
||||
"eyr:2022",
|
||||
"",
|
||||
"iyr:2010 hgt:158cm hcl:#b6652a ecl:blu byr:1944 eyr:2021 pid:093154719",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
|
||||
@@ -5,11 +5,11 @@ public class Day05_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
{
|
||||
Day05 day = new();
|
||||
var day = new Day05();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"FBFBBFFRLR",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("357", result);
|
||||
}
|
||||
@@ -17,11 +17,11 @@ public class Day05_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example2()
|
||||
{
|
||||
Day05 day = new();
|
||||
var day = new Day05();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"BFFFBBFRRR",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("567", result);
|
||||
}
|
||||
@@ -29,11 +29,11 @@ public class Day05_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example3()
|
||||
{
|
||||
Day05 day = new();
|
||||
var day = new Day05();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"FFFBBBFRRR",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("119", result);
|
||||
}
|
||||
@@ -41,11 +41,11 @@ public class Day05_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example4()
|
||||
{
|
||||
Day05 day = new();
|
||||
var day = new Day05();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"BBFFBBFRLL",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("820", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day06 day = new();
|
||||
var day = new Day06();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"abc",
|
||||
"",
|
||||
"a",
|
||||
@@ -23,7 +23,7 @@ public class Day06_Tests
|
||||
"a",
|
||||
"",
|
||||
"b",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("11", result);
|
||||
}
|
||||
@@ -31,9 +31,9 @@ public class Day06_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day06 day = new();
|
||||
var day = new Day06();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"abc",
|
||||
"",
|
||||
"a",
|
||||
@@ -49,7 +49,7 @@ public class Day06_Tests
|
||||
"a",
|
||||
"",
|
||||
"b",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("6", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day07_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day07 day = new();
|
||||
var day = new Day07();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"light red bags contain 1 bright white bag, 2 muted yellow bags.",
|
||||
"dark orange bags contain 3 bright white bags, 4 muted yellow bags.",
|
||||
"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.",
|
||||
"faded blue bags contain no other bags.",
|
||||
"dotted black bags contain no other bags.",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
@@ -25,9 +25,9 @@ public class Day07_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day07 day = new();
|
||||
var day = new Day07();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"shiny gold bags contain 2 dark red bags.",
|
||||
"dark red bags contain 2 dark orange 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 blue bags contain 2 dark violet bags.",
|
||||
"dark violet bags contain no other bags.",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("126", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day08_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day08 day = new();
|
||||
var day = new Day08();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"nop +0",
|
||||
"acc +1",
|
||||
"jmp +4",
|
||||
@@ -17,7 +17,7 @@ public class Day08_Tests
|
||||
"acc +1",
|
||||
"jmp -4",
|
||||
"acc +6",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("5", result);
|
||||
}
|
||||
@@ -25,9 +25,9 @@ public class Day08_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day08 day = new();
|
||||
var day = new Day08();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"nop +0",
|
||||
"acc +1",
|
||||
"jmp +4",
|
||||
@@ -37,7 +37,7 @@ public class Day08_Tests
|
||||
"acc +1",
|
||||
"jmp -4",
|
||||
"acc +6",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("8", result);
|
||||
}
|
||||
|
||||
@@ -5,9 +5,9 @@ public class Day09_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day09 day = new();
|
||||
var day = new Day09();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"35",
|
||||
"20",
|
||||
"15",
|
||||
@@ -28,7 +28,7 @@ public class Day09_Tests
|
||||
"277",
|
||||
"309",
|
||||
"576",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("127", result);
|
||||
}
|
||||
@@ -36,9 +36,9 @@ public class Day09_Tests
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day09 day = new();
|
||||
var day = new Day09();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"35",
|
||||
"20",
|
||||
"15",
|
||||
@@ -59,7 +59,7 @@ public class Day09_Tests
|
||||
"277",
|
||||
"309",
|
||||
"576",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("62", result);
|
||||
}
|
||||
|
||||
@@ -1,21 +1,20 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2020</RootNamespace>
|
||||
</PropertyGroup>
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<RootNamespace>AdventOfCode2020</RootNamespace>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Update="inputs\*">
|
||||
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -112,4 +112,5 @@ public class Day03 : IDay
|
||||
}
|
||||
return treeCnt;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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?
|
||||
|
||||
|
||||
|
||||
*/
|
||||
|
||||
public class Day04 : IDay
|
||||
@@ -127,7 +127,7 @@ public class Day04 : IDay
|
||||
{
|
||||
List<Dictionary<string, string>> passports = Passports_Parse(inputs);
|
||||
int cnt = 0;
|
||||
List<string> neededFields = [
|
||||
List<string> neededFields = new() {
|
||||
"byr", // Birth Year
|
||||
"iyr", // Issue Year
|
||||
"eyr", // Expiration Year
|
||||
@@ -135,7 +135,7 @@ public class Day04 : IDay
|
||||
"hcl", // Hair Color
|
||||
"ecl", // Eye Color
|
||||
"pid", // Passport ID
|
||||
];
|
||||
};
|
||||
|
||||
foreach (Dictionary<string, string> passport in passports)
|
||||
{
|
||||
@@ -167,7 +167,7 @@ public class Day04 : IDay
|
||||
|
||||
private List<Dictionary<string, string>> Passports_Parse(string[] inputs)
|
||||
{
|
||||
List<Dictionary<string, string>> passports = [];
|
||||
List<Dictionary<string, string>> passports = new();
|
||||
Dictionary<string, string> passport = new();
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
@@ -257,4 +257,5 @@ public class Day04 : IDay
|
||||
if (input.All(char.IsNumber) == false) { return null; }
|
||||
return Convert.ToInt32(input);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -64,7 +64,7 @@ public class Day05 : IDay
|
||||
int maxSerialNumber = 0;
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
Seat? seat = Seat_Parse(input);
|
||||
Seat seat = Seat_Parse(input);
|
||||
if (seat == null) { continue; }
|
||||
int newSerialNumber = seat.GetSerialNumber();
|
||||
if (newSerialNumber > maxSerialNumber) { maxSerialNumber = newSerialNumber; }
|
||||
@@ -83,7 +83,7 @@ public class Day05 : IDay
|
||||
}
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
Seat? seat = Seat_Parse(input);
|
||||
Seat seat = Seat_Parse(input);
|
||||
if (seat == null) { continue; }
|
||||
|
||||
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 ||
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -67,7 +67,10 @@ public class Day06 : IDay
|
||||
|
||||
foreach (char c in input)
|
||||
{
|
||||
groupMap.TryAdd(c, true);
|
||||
if (groupMap.ContainsKey(c) == false)
|
||||
{
|
||||
groupMap.Add(c, true);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (groupMap.Count > 0)
|
||||
@@ -75,7 +78,7 @@ public class Day06 : IDay
|
||||
groupMaps.Add(groupMap);
|
||||
}
|
||||
|
||||
int total = groupMaps.Sum(dict => dict.Count);
|
||||
int total = groupMaps.Sum(groupMap => groupMap.Count);
|
||||
return total.ToString();
|
||||
|
||||
}
|
||||
@@ -98,9 +101,13 @@ public class Day06 : IDay
|
||||
groupCount++;
|
||||
foreach (char c in input)
|
||||
{
|
||||
if (groupMap.TryAdd(c, 1) == false)
|
||||
if (groupMap.ContainsKey(c) == false)
|
||||
{
|
||||
groupMap[c] += 1;
|
||||
groupMap.Add(c, 1);
|
||||
}
|
||||
else
|
||||
{
|
||||
groupMap[c] = groupMap[c] + 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -72,15 +72,15 @@ public class Day07 : IDay
|
||||
{
|
||||
string myBagColor = "shiny gold";
|
||||
|
||||
List<BaggageRule> rules = [];
|
||||
List<BaggageRule> rules = new();
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
BaggageRule rule = BaggageRule_Parse(input);
|
||||
rules.Add(rule);
|
||||
}
|
||||
|
||||
List<string> bagColorsToCheck = [myBagColor];
|
||||
List<string> bagColorsChecked = [myBagColor];
|
||||
List<string> bagColorsToCheck = new() { myBagColor };
|
||||
List<string> bagColorsChecked = new() { myBagColor };
|
||||
int cntBagColors = 0;
|
||||
while (bagColorsToCheck.Count > 0)
|
||||
{
|
||||
@@ -108,7 +108,7 @@ public class Day07 : IDay
|
||||
{
|
||||
string myBagColor = "shiny gold";
|
||||
|
||||
List<BaggageRule> rules = [];
|
||||
List<BaggageRule> rules = new();
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
BaggageRule rule = BaggageRule_Parse(input);
|
||||
@@ -116,30 +116,31 @@ public class Day07 : IDay
|
||||
}
|
||||
Dictionary<string, BaggageRule> dictRules = rules.ToDictionary(x => x.BagColor);
|
||||
|
||||
int cnt = BaggageRule_CountChildren(myBagColor, dictRules);
|
||||
int cnt = BaggageRule_CountChilds(myBagColor, dictRules);
|
||||
|
||||
return cnt.ToString();
|
||||
}
|
||||
|
||||
private class BaggageContainRule
|
||||
public class BaggageContainRule
|
||||
{
|
||||
public string BagColor { get; set; } = string.Empty;
|
||||
public int Count { get; init; }
|
||||
public string BagColor { get; set; }
|
||||
public int Count { get; set; }
|
||||
}
|
||||
|
||||
private class BaggageRule
|
||||
public class BaggageRule
|
||||
{
|
||||
public string BagColor { get; set; } = string.Empty;
|
||||
public string BagColor { get; set; }
|
||||
|
||||
public List<BaggageContainRule> Contain { get; } = [];
|
||||
public List<BaggageContainRule> Contain { get; set; }
|
||||
}
|
||||
|
||||
private BaggageRule BaggageRule_Parse(string input)
|
||||
public BaggageRule BaggageRule_Parse(string input)
|
||||
{
|
||||
string[] words = input.Split(' ');
|
||||
string status = "Parse Color 1";
|
||||
BaggageRule rule = new();
|
||||
BaggageContainRule? containRule = null;
|
||||
rule.Contain = new List<BaggageContainRule>();
|
||||
BaggageContainRule containRule = null;
|
||||
string color1 = string.Empty;
|
||||
|
||||
foreach (string word in words)
|
||||
@@ -163,14 +164,9 @@ public class Day07 : IDay
|
||||
status = "Parse Contain count";
|
||||
break;
|
||||
case "Parse Contain count":
|
||||
if (word == "no")
|
||||
{
|
||||
status = "End";
|
||||
break;
|
||||
}
|
||||
containRule = new BaggageContainRule {
|
||||
Count = Convert.ToInt32(word),
|
||||
};
|
||||
if (word == "no") { status = "End"; break; }
|
||||
containRule = new BaggageContainRule();
|
||||
containRule.Count = Convert.ToInt32(word);
|
||||
status = "Parse Contain color 1";
|
||||
break;
|
||||
case "Parse Contain color 1":
|
||||
@@ -178,17 +174,12 @@ public class Day07 : IDay
|
||||
status = "Parse Contain color 2";
|
||||
break;
|
||||
case "Parse Contain color 2":
|
||||
if(containRule == null) { break; }
|
||||
containRule.BagColor = string.Concat(color1, " ", word);
|
||||
rule.Contain.Add(containRule);
|
||||
status = "Parse Contain continue";
|
||||
break;
|
||||
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";
|
||||
break;
|
||||
case "End":
|
||||
@@ -198,13 +189,13 @@ public class Day07 : IDay
|
||||
return rule;
|
||||
}
|
||||
|
||||
private int BaggageRule_CountChildren(string color, Dictionary<string, BaggageRule> dictRules)
|
||||
public int BaggageRule_CountChilds(string color, Dictionary<string, BaggageRule> dictRules)
|
||||
{
|
||||
int cnt = 0;
|
||||
BaggageRule rule = dictRules[color];
|
||||
foreach (BaggageContainRule containRule in rule.Contain)
|
||||
{
|
||||
cnt += (BaggageRule_CountChildren(containRule.BagColor, dictRules) + 1) * containRule.Count;
|
||||
cnt += (BaggageRule_CountChilds(containRule.BagColor, dictRules) + 1) * containRule.Count;
|
||||
}
|
||||
return cnt;
|
||||
}
|
||||
|
||||
@@ -124,14 +124,14 @@ public class Day08 : IDay
|
||||
return vm.Accumulator.ToString();
|
||||
}
|
||||
|
||||
private enum OpCode
|
||||
public enum OpCode
|
||||
{
|
||||
Acc,
|
||||
Jmp,
|
||||
Nop,
|
||||
}
|
||||
|
||||
private class Instruction
|
||||
public class Instruction
|
||||
{
|
||||
public OpCode OpCode { get; set; }
|
||||
public int Value { get; set; }
|
||||
@@ -154,9 +154,14 @@ public class Day08 : IDay
|
||||
OpCode = OpCode.Nop;
|
||||
}
|
||||
|
||||
Value = Convert.ToInt32(parts[1].StartsWith("+")
|
||||
? parts[1].Substring(1)
|
||||
: parts[1]);
|
||||
if (parts[1].StartsWith("+"))
|
||||
{
|
||||
Value = Convert.ToInt32(parts[1].Substring(1));
|
||||
}
|
||||
else
|
||||
{
|
||||
Value = Convert.ToInt32(parts[1]);
|
||||
}
|
||||
Executed = false;
|
||||
}
|
||||
}
|
||||
@@ -171,7 +176,7 @@ public class Day08 : IDay
|
||||
|
||||
public VM(string[] inputs)
|
||||
{
|
||||
Instructions = [];
|
||||
Instructions = new List<Instruction>();
|
||||
foreach (string input in inputs)
|
||||
{
|
||||
Instructions.Add(new Instruction(input));
|
||||
|
||||
@@ -163,4 +163,5 @@ public class Day09 : IDay
|
||||
|
||||
return firstInvalid;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,18 +1,17 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2023.Tests</RootNamespace>
|
||||
<Nullable>enable</Nullable>
|
||||
|
||||
<IsPackable>false</IsPackable>
|
||||
<IsTestProject>true</IsTestProject>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0"/>
|
||||
<PackageReference Include="xunit" Version="2.6.3"/>
|
||||
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.8.0" />
|
||||
<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>
|
||||
@@ -20,7 +19,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode2023\AdventOfCode2023.csproj"/>
|
||||
<ProjectReference Include="..\AdventOfCode2023\AdventOfCode2023.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -5,24 +5,24 @@ public class Day01_Tests
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day01 day = new();
|
||||
var day = new Day01();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"1abc2",
|
||||
"pqr3stu8vwx",
|
||||
"a1b2c3d4e5f",
|
||||
"treb7uchet",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("142", result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day01 day = new();
|
||||
var day = new Day01();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"two1nine",
|
||||
"eightwothree",
|
||||
"abcone2threexyz",
|
||||
@@ -30,7 +30,7 @@ public class Day01_Tests
|
||||
"4nineeightseven2",
|
||||
"zoneight234",
|
||||
"7pqrstsixteen",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("281", result);
|
||||
}
|
||||
|
||||
@@ -18,7 +18,7 @@ public class Day02_Tests
|
||||
Assert.Equal(0, game.Sets[2].Blue);
|
||||
Assert.Equal(2, game.Sets[2].Green);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void Game_FromString__ValidExample2()
|
||||
{
|
||||
@@ -35,35 +35,35 @@ public class Day02_Tests
|
||||
Assert.Equal(0, game.Sets[2].Blue);
|
||||
Assert.Equal(5, game.Sets[2].Green);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day02 day = new();
|
||||
|
||||
string result = day.ResolvePart1([
|
||||
|
||||
string result = day.ResolvePart1(new[] {
|
||||
"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 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 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("8", result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day02 day = new();
|
||||
|
||||
string result = day.ResolvePart2([
|
||||
|
||||
string result = day.ResolvePart2(new[] {
|
||||
"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 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 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green",
|
||||
]);
|
||||
});
|
||||
|
||||
Assert.Equal("2286", result);
|
||||
}
|
||||
|
||||
@@ -5,26 +5,26 @@ public class Day03_Tests
|
||||
[Fact]
|
||||
public void SearchNextSchemaNumber__NoNumbers__Null()
|
||||
{
|
||||
string[] inputs = [
|
||||
string[] inputs = new[] {
|
||||
"..........",
|
||||
"..........",
|
||||
"..........",
|
||||
];
|
||||
};
|
||||
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0);
|
||||
|
||||
|
||||
Assert.Null(number);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void SearchNextSchemaNumber__OneNumber__Valid()
|
||||
{
|
||||
string[] inputs = [
|
||||
string[] inputs = new[] {
|
||||
"..........",
|
||||
"....420...",
|
||||
"..........",
|
||||
];
|
||||
};
|
||||
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 0);
|
||||
|
||||
|
||||
Assert.NotNull(number);
|
||||
Assert.Equal(1, number.Value.Row);
|
||||
Assert.Equal(4, number.Value.Column);
|
||||
@@ -35,13 +35,13 @@ public class Day03_Tests
|
||||
[Fact]
|
||||
public void SearchNextSchemaNumber__TwoNumbersSkipFirst__ValidSecond()
|
||||
{
|
||||
string[] inputs = [
|
||||
string[] inputs = new[] {
|
||||
"69........",
|
||||
"....420...",
|
||||
"..........",
|
||||
];
|
||||
};
|
||||
Day03.SchemaNumber? number = Day03.SearchNextSchemaNumber(inputs, 0, 4);
|
||||
|
||||
|
||||
Assert.NotNull(number);
|
||||
Assert.Equal(1, number.Value.Row);
|
||||
Assert.Equal(4, number.Value.Column);
|
||||
@@ -49,7 +49,7 @@ public class Day03_Tests
|
||||
Assert.Equal(420, number.Value.Value);
|
||||
}
|
||||
|
||||
private string[] _example = [
|
||||
private string[] _example = new[] {
|
||||
"467..114..",
|
||||
"...*......",
|
||||
"..35..633.",
|
||||
@@ -60,24 +60,24 @@ public class Day03_Tests
|
||||
"......755.",
|
||||
"...$.*....",
|
||||
".664.598..",
|
||||
];
|
||||
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day03 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("4361", result);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day03 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("467835", result);
|
||||
|
||||
@@ -2,20 +2,20 @@ namespace AdventOfCode2023.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 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 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 6: 31 18 13 56 72 | 74 77 10 23 35 67 36 11",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day04 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("13", result);
|
||||
@@ -25,7 +25,7 @@ public class Day04_Tests
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day04 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("30", result);
|
||||
|
||||
@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day05_Tests
|
||||
{
|
||||
private readonly string[] _example = [
|
||||
private readonly string[] _example = {
|
||||
"seeds: 79 14 55 13",
|
||||
"",
|
||||
"seed-to-soil map:",
|
||||
@@ -36,13 +36,13 @@ public class Day05_Tests
|
||||
"humidity-to-location map:",
|
||||
"60 56 37",
|
||||
"56 93 4",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day05 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("35", result);
|
||||
@@ -52,7 +52,7 @@ public class Day05_Tests
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day05 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("46", result);
|
||||
@@ -61,22 +61,22 @@ public class Day05_Tests
|
||||
[Fact]
|
||||
public void AlmanacMapping_ParseNext__Empty__Null()
|
||||
{
|
||||
Day05.LinesReader reader = new([]);
|
||||
Day05.LinesReader reader = new(Array.Empty<string>());
|
||||
Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader);
|
||||
|
||||
|
||||
Assert.Null(mapping);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void AlmanacMapping_ParseNext__Example1()
|
||||
{
|
||||
Day05.LinesReader reader = new([
|
||||
Day05.LinesReader reader = new(new[] {
|
||||
"seed-to-soil map:",
|
||||
"50 98 2",
|
||||
"52 50 48",
|
||||
]);
|
||||
});
|
||||
Day05.AlmanacMapping? mapping = Day05.AlmanacMapping.ParseNext(reader);
|
||||
|
||||
|
||||
Assert.NotNull(mapping);
|
||||
Assert.Equal("seed-to-soil", mapping.Name);
|
||||
Assert.Equal(2, mapping.RangeMappings.Count);
|
||||
@@ -90,11 +90,11 @@ public class Day05_Tests
|
||||
const long value1 = 100;
|
||||
long valueMapped1 = mapping.Apply(value1);
|
||||
Assert.Equal(100, valueMapped1);
|
||||
|
||||
|
||||
const long value2 = 99;
|
||||
long valueMapped2 = mapping.Apply(value2);
|
||||
Assert.Equal(51, valueMapped2);
|
||||
|
||||
|
||||
const long value3 = 45;
|
||||
long valueMapped3 = mapping.Apply(value3);
|
||||
Assert.Equal(45, valueMapped3);
|
||||
@@ -109,7 +109,7 @@ public class Day05_Tests
|
||||
DestinationStart = 1000,
|
||||
Length = 10,
|
||||
};
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// #####.........................
|
||||
Day05.AlmanacRangeMapping range_Lower = new() {
|
||||
@@ -124,7 +124,7 @@ public class Day05_Tests
|
||||
Assert.Equal(5, range_Lower_Result.PreClip.Value.Length);
|
||||
Assert.Null(range_Lower_Result.Clipped);
|
||||
Assert.Null(range_Lower_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// ##########....................
|
||||
Day05.AlmanacRangeMapping range_LowerTouching = new() {
|
||||
@@ -139,7 +139,7 @@ public class Day05_Tests
|
||||
Assert.Equal(10, range_LowerTouching_Result.PreClip.Value.Length);
|
||||
Assert.Null(range_LowerTouching_Result.Clipped);
|
||||
Assert.Null(range_LowerTouching_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// .........................#####
|
||||
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.DestinationStart);
|
||||
Assert.Equal(5, range_Upper_Result.PostClip.Value.Length);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// ....................##########
|
||||
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.DestinationStart);
|
||||
Assert.Equal(10, range_UpperTouching_Result.PostClip.Value.Length);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// ..........$$$$$$$$$$..........
|
||||
Day05.AlmanacRangeMapping range_IntersectCover = new() {
|
||||
@@ -184,7 +184,7 @@ public class Day05_Tests
|
||||
Assert.Equal(1000, range_IntersectCover_Result.Clipped.Value.DestinationStart);
|
||||
Assert.Equal(10, range_IntersectCover_Result.Clipped.Value.Length);
|
||||
Assert.Null(range_IntersectCover_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// ...............$$$$$..........
|
||||
Day05.AlmanacRangeMapping range_IntersectInsideToEnd = new() {
|
||||
@@ -199,7 +199,7 @@ public class Day05_Tests
|
||||
Assert.Equal(1005, range_IntersectInsideToEnd_Result.Clipped.Value.DestinationStart);
|
||||
Assert.Equal(5, range_IntersectInsideToEnd_Result.Clipped.Value.Length);
|
||||
Assert.Null(range_IntersectInsideToEnd_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// ...............$$$$$#####.....
|
||||
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.DestinationStart);
|
||||
Assert.Equal(5, range_IntersectInsideToOutside_Result.PostClip.Value.Length);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// .....#####$$$$$...............
|
||||
Day05.AlmanacRangeMapping range_IntersectOutsideToInside = new() {
|
||||
@@ -235,7 +235,7 @@ public class Day05_Tests
|
||||
Assert.Equal(1000, range_IntersectOutsideToInside_Result.Clipped.Value.DestinationStart);
|
||||
Assert.Equal(5, range_IntersectOutsideToInside_Result.Clipped.Value.Length);
|
||||
Assert.Null(range_IntersectOutsideToInside_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// .....#####$$$$$$$$$$..........
|
||||
Day05.AlmanacRangeMapping range_IntersectOutsideToEnd = new() {
|
||||
@@ -253,7 +253,7 @@ public class Day05_Tests
|
||||
Assert.Equal(1000, range_IntersectOutsideToEnd_Result.Clipped.Value.DestinationStart);
|
||||
Assert.Equal(10, range_IntersectOutsideToEnd_Result.Clipped.Value.Length);
|
||||
Assert.Null(range_IntersectOutsideToEnd_Result.PostClip);
|
||||
|
||||
|
||||
// ..........■■■■■■■■■■..........
|
||||
// .....#####$$$$$$$$$$#####.....
|
||||
Day05.AlmanacRangeMapping range_IntersectOutsideToOutside = new() {
|
||||
|
||||
@@ -2,16 +2,16 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day06_Tests
|
||||
{
|
||||
private readonly string[] _example = [
|
||||
private readonly string[] _example = {
|
||||
"Time: 7 15 30",
|
||||
"Distance: 9 40 200",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day06 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("288", result);
|
||||
@@ -21,7 +21,7 @@ public class Day06_Tests
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day06 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("71503", result);
|
||||
|
||||
@@ -2,19 +2,19 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day07_Tests
|
||||
{
|
||||
private readonly string[] _example = [
|
||||
private readonly string[] _example = {
|
||||
"32T3K 765",
|
||||
"T55J5 684",
|
||||
"KK677 28",
|
||||
"KTJJT 220",
|
||||
"QQQJA 483",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day07 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("6440", result);
|
||||
@@ -24,7 +24,7 @@ public class Day07_Tests
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day07 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("5905", result);
|
||||
@@ -35,26 +35,26 @@ public class Day07_Tests
|
||||
{
|
||||
Day07.CamelCard card_FiveOfAKind = new("AAAAA");
|
||||
Assert.Equal(Day07.CamelCard.Types.FiveOfAKind, card_FiveOfAKind.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_FourOfAKind = new("AA8AA");
|
||||
Assert.Equal(Day07.CamelCard.Types.FourOfAKind, card_FourOfAKind.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_FullHouse = new("23332");
|
||||
Assert.Equal(Day07.CamelCard.Types.FullHouse, card_FullHouse.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_ThreeOfAKind = new("TTT98");
|
||||
Assert.Equal(Day07.CamelCard.Types.ThreeOfAKind, card_ThreeOfAKind.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_TwoPair = new("23432");
|
||||
Assert.Equal(Day07.CamelCard.Types.TwoPair, card_TwoPair.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_OnePair = new("A23A4");
|
||||
Assert.Equal(Day07.CamelCard.Types.OnePair, card_OnePair.Type);
|
||||
|
||||
|
||||
Day07.CamelCard card_HighCard = new("23456");
|
||||
Assert.Equal(Day07.CamelCard.Types.HighCard, card_HighCard.Type);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void CamelCard_CompareTo__Examples()
|
||||
{
|
||||
@@ -62,7 +62,7 @@ public class Day07_Tests
|
||||
Day07.CamelCard card_02 = new("2AAAA");
|
||||
Assert.Equal(-1, card_01.CompareTo(card_02));
|
||||
Assert.Equal(1, card_02.CompareTo(card_01));
|
||||
|
||||
|
||||
Day07.CamelCard card_77888 = new("77888");
|
||||
Day07.CamelCard card_77788 = new("77788");
|
||||
Assert.Equal(-1, card_77888.CompareTo(card_77788));
|
||||
|
||||
@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day08_Tests
|
||||
{
|
||||
private readonly string[] _example1 = [
|
||||
private readonly string[] _example1 = {
|
||||
"RL",
|
||||
"",
|
||||
"AAA = (BBB, CCC)",
|
||||
@@ -12,37 +12,37 @@ public class Day08_Tests
|
||||
"EEE = (EEE, EEE)",
|
||||
"GGG = (GGG, GGG)",
|
||||
"ZZZ = (ZZZ, ZZZ)",
|
||||
];
|
||||
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
{
|
||||
Day08 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example1);
|
||||
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
|
||||
private readonly string[] _example2 = [
|
||||
private readonly string[] _example2 = {
|
||||
"LLR",
|
||||
"",
|
||||
"AAA = (BBB, BBB)",
|
||||
"BBB = (AAA, ZZZ)",
|
||||
"ZZZ = (ZZZ, ZZZ)",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example2()
|
||||
{
|
||||
Day08 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example2);
|
||||
|
||||
Assert.Equal("6", result);
|
||||
}
|
||||
|
||||
private readonly string[] _example3 = [
|
||||
private readonly string[] _example3 = {
|
||||
"LR",
|
||||
"",
|
||||
"11A = (11B, XXX)",
|
||||
@@ -53,15 +53,16 @@ public class Day08_Tests
|
||||
"22C = (22Z, 22Z)",
|
||||
"22Z = (22B, 22B)",
|
||||
"XXX = (XXX, XXX)",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example3()
|
||||
{
|
||||
Day08 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example3);
|
||||
|
||||
Assert.Equal("6", result);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,17 +2,17 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day09_Tests
|
||||
{
|
||||
private readonly string[] _example = [
|
||||
private readonly string[] _example = {
|
||||
"0 3 6 9 12 15",
|
||||
"1 3 6 10 15 21",
|
||||
"10 13 16 21 30 45",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example()
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example);
|
||||
|
||||
Assert.Equal("114", result);
|
||||
@@ -22,7 +22,7 @@ public class Day09_Tests
|
||||
public void ResolvePart2__Example()
|
||||
{
|
||||
Day09 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example);
|
||||
|
||||
Assert.Equal("2", result);
|
||||
@@ -35,7 +35,7 @@ public class Day09_Tests
|
||||
long result = extrapolator.Extrapolate();
|
||||
Assert.Equal(18, result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void Extrapolator_Extrapolate__Example2()
|
||||
{
|
||||
@@ -43,7 +43,7 @@ public class Day09_Tests
|
||||
long result = extrapolator.Extrapolate();
|
||||
Assert.Equal(28, result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void Extrapolator_Extrapolate__Example3()
|
||||
{
|
||||
@@ -59,7 +59,7 @@ public class Day09_Tests
|
||||
long result = extrapolator.ExtrapolatePast();
|
||||
Assert.Equal(-3, result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void Extrapolator_ExtrapolatePast__Example2()
|
||||
{
|
||||
@@ -67,7 +67,7 @@ public class Day09_Tests
|
||||
long result = extrapolator.ExtrapolatePast();
|
||||
Assert.Equal(0, result);
|
||||
}
|
||||
|
||||
|
||||
[Fact]
|
||||
public void Extrapolator_ExtrapolatePast__Example3()
|
||||
{
|
||||
|
||||
@@ -2,25 +2,25 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day10_Tests
|
||||
{
|
||||
private readonly string[] _example1 = [
|
||||
private readonly string[] _example1 = {
|
||||
"7-F7-",
|
||||
".FJ|7",
|
||||
"SJLL7",
|
||||
"|F--J",
|
||||
"LJ.LJ",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
{
|
||||
Day10 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example1);
|
||||
|
||||
Assert.Equal("8", result);
|
||||
}
|
||||
|
||||
private readonly string[] _example2 = [
|
||||
|
||||
private readonly string[] _example2 = {
|
||||
"...........",
|
||||
".S-------7.",
|
||||
".|F-----7|.",
|
||||
@@ -30,20 +30,20 @@ public class Day10_Tests
|
||||
".|..|.|..|.",
|
||||
".L--J.L--J.",
|
||||
"...........",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example2()
|
||||
{
|
||||
Day10 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example2);
|
||||
|
||||
Assert.Equal("4", result);
|
||||
}
|
||||
|
||||
|
||||
private readonly string[] _example3 = [
|
||||
|
||||
private readonly string[] _example3 = {
|
||||
"FF7FSF7F7F7F7F7F---7",
|
||||
"L|LJ||||||||||||F--J",
|
||||
"FL-7LJLJ||||||LJL-77",
|
||||
@@ -54,13 +54,13 @@ public class Day10_Tests
|
||||
"7-L-JL7||F7|L7F-7F7|",
|
||||
"L.L7LFJ|||||FJL7||LJ",
|
||||
"L7JLJL-JLJLJL--JLJ.L",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example3()
|
||||
{
|
||||
Day10 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart2(_example3);
|
||||
|
||||
Assert.Equal("10", result);
|
||||
|
||||
@@ -2,7 +2,7 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day11_Tests
|
||||
{
|
||||
private readonly string[] _example1 = [
|
||||
private readonly string[] _example1 = {
|
||||
"...#......",
|
||||
".......#..",
|
||||
"#.........",
|
||||
@@ -13,15 +13,16 @@ public class Day11_Tests
|
||||
"..........",
|
||||
".......#..",
|
||||
"#...#.....",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
{
|
||||
Day11 day = new();
|
||||
|
||||
|
||||
string result = day.ResolvePart1(_example1);
|
||||
|
||||
Assert.Equal("374", result);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -2,14 +2,14 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day12_Tests
|
||||
{
|
||||
private readonly string[] _example1 = [
|
||||
private readonly string[] _example1 = {
|
||||
"???.### 1,1,3",
|
||||
".??..??...?##. 1,1,3",
|
||||
"?#?#?#?#?#?#?#? 1,3,1,6",
|
||||
"????.#...#... 4,1,1",
|
||||
"????.######..#####. 1,6,5",
|
||||
"?###???????? 3,2,1",
|
||||
];
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
|
||||
@@ -10,14 +10,14 @@ namespace AdventOfCode2023.Tests;
|
||||
|
||||
public class Day24_Tests
|
||||
{
|
||||
private string[] _example1 = [
|
||||
private readonly string[] _example1 = {
|
||||
"19, 13, 30 @ -2, 1, -2",
|
||||
"18, 19, 22 @ -1, -1, -2",
|
||||
"20, 25, 34 @ -2, -2, -4",
|
||||
"12, 31, 28 @ -1, -2, -1",
|
||||
"20, 19, 15 @ 1, -5, -3",
|
||||
];
|
||||
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart1__Example1()
|
||||
{
|
||||
@@ -28,6 +28,35 @@ public class Day24_Tests
|
||||
Assert.Equal("2", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example1()
|
||||
{
|
||||
Day24 day = new();
|
||||
|
||||
string result = day.ResolvePart2(_example1);
|
||||
|
||||
Assert.Equal("47", result);
|
||||
}
|
||||
|
||||
private readonly string[] _example2 = {
|
||||
"19, 13, 30 @ -2, 1, -2",
|
||||
"18, 19, 22 @ -1, -1, -2",
|
||||
"20, 25, 34 @ -2, -2, -4",
|
||||
"12, 31, 28 @ -1, -2, -1",
|
||||
"20, 19, 15 @ 1, -5, -3",
|
||||
"24, 13, 10 @ -3, 1, 2",
|
||||
};
|
||||
|
||||
[Fact]
|
||||
public void ResolvePart2__Example2()
|
||||
{
|
||||
Day24 day = new();
|
||||
|
||||
string result = day.ResolvePart2(_example2);
|
||||
|
||||
Assert.Equal("47", result);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hail_Intersect2D__Examples1()
|
||||
{
|
||||
@@ -36,35 +65,67 @@ public class Day24_Tests
|
||||
Day24.Hail hailC = new("20, 25, 34 @ -2, -2, -4");
|
||||
Day24.Hail hailD = new("12, 31, 28 @ -1, -2, -1");
|
||||
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);
|
||||
|
||||
(bool intersect_A_C, _, _, _) = hailA.Intersect2D(hailC);
|
||||
|
||||
(bool intersect_A_C, _, _) = hailA.Intersect2D(hailC);
|
||||
Assert.True(intersect_A_C);
|
||||
|
||||
(bool intersect_A_D, _, _, _) = hailA.Intersect2D(hailD);
|
||||
|
||||
(bool intersect_A_D, _, _) = hailA.Intersect2D(hailD);
|
||||
Assert.True(intersect_A_D);
|
||||
|
||||
(bool intersect_A_E, _, _, _) = hailA.Intersect2D(hailE);
|
||||
|
||||
(bool intersect_A_E, _, _) = hailA.Intersect2D(hailE);
|
||||
Assert.True(intersect_A_E);
|
||||
|
||||
(bool intersect_B_C, _, _, _) = hailB.Intersect2D(hailC);
|
||||
|
||||
(bool intersect_B_C, _, _) = hailB.Intersect2D(hailC);
|
||||
Assert.False(intersect_B_C);
|
||||
|
||||
(bool intersect_B_D, _, _, _) = hailB.Intersect2D(hailD);
|
||||
|
||||
(bool intersect_B_D, _, _) = hailB.Intersect2D(hailD);
|
||||
Assert.True(intersect_B_D);
|
||||
|
||||
(bool intersect_B_E, _, _, _) = hailB.Intersect2D(hailE);
|
||||
|
||||
(bool intersect_B_E, _, _) = hailB.Intersect2D(hailE);
|
||||
Assert.True(intersect_B_E);
|
||||
|
||||
(bool intersect_C_D, _, _, _) = hailC.Intersect2D(hailD);
|
||||
|
||||
(bool intersect_C_D, _, _) = hailC.Intersect2D(hailD);
|
||||
Assert.True(intersect_C_D);
|
||||
|
||||
(bool intersect_C_E, _, _, _) = hailC.Intersect2D(hailE);
|
||||
|
||||
(bool intersect_C_E, _, _) = hailC.Intersect2D(hailE);
|
||||
Assert.True(intersect_C_E);
|
||||
|
||||
(bool intersect_D_E, _, _, _) = hailD.Intersect2D(hailE);
|
||||
|
||||
(bool intersect_D_E, _, _) = hailD.Intersect2D(hailE);
|
||||
Assert.True(intersect_D_E);
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void Hail_Intersect3D__Examples1()
|
||||
{
|
||||
Day24.Hail rock = new("24, 13, 10 @ -3, 1, 2");
|
||||
|
||||
Day24.Hail hailA = new("19, 13, 30 @ -2, 1, -2");
|
||||
Day24.Hail hailB = new("18, 19, 22 @ -1, -1, -2");
|
||||
Day24.Hail hailC = new("20, 25, 34 @ -2, -2, -4");
|
||||
Day24.Hail hailD = new("12, 31, 28 @ -1, -2, -1");
|
||||
Day24.Hail hailE = new("20, 19, 15 @ 1, -5, -3");
|
||||
|
||||
(bool intersect_A, double t_A, _) = rock.Intersect3D(hailA);
|
||||
Assert.True(intersect_A);
|
||||
Assert.Equal(5, t_A);
|
||||
|
||||
(bool intersect_B, double t_B, _) = rock.Intersect3D(hailB);
|
||||
Assert.True(intersect_B);
|
||||
Assert.Equal(3, t_B);
|
||||
|
||||
(bool intersect_C, double t_C, _) = rock.Intersect3D(hailC);
|
||||
Assert.True(intersect_C);
|
||||
Assert.Equal(4, t_C);
|
||||
|
||||
(bool intersect_D, double t_D, _) = rock.Intersect3D(hailD);
|
||||
Assert.True(intersect_D);
|
||||
Assert.Equal(6, t_D);
|
||||
|
||||
(bool intersect_E, double t_E, _) = rock.Intersect3D(hailE);
|
||||
Assert.True(intersect_E);
|
||||
Assert.Equal(1, t_E);
|
||||
}
|
||||
}
|
||||
@@ -2,10 +2,10 @@
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<TargetFramework>net7.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
<RootNamespace>AdventOfCode2023</RootNamespace>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
@@ -15,7 +15,7 @@
|
||||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj"/>
|
||||
<ProjectReference Include="..\AdventOfCode.Common\AdventOfCode.Common.csproj" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
||||
@@ -78,7 +78,7 @@ public class Day01 : IDay
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
List<(string Text, int Value)> digits = [
|
||||
List<(string Text, int Value)> digits = new() {
|
||||
("1", 1),
|
||||
("2", 2),
|
||||
("3", 3),
|
||||
@@ -97,7 +97,7 @@ public class Day01 : IDay
|
||||
("seven", 7),
|
||||
("eight", 8),
|
||||
("nine", 9),
|
||||
];
|
||||
};
|
||||
|
||||
int sum = 0;
|
||||
foreach (string line in inputs)
|
||||
|
||||
@@ -102,7 +102,7 @@ public class Day03 : IDay
|
||||
for (column = 0; column < inputs[row].Length; column++)
|
||||
{
|
||||
if (inputs[row][column] != '*') { continue; }
|
||||
|
||||
|
||||
List<SchemaNumber> adjacentNumbers = numbers.Where(n => CellAdjacentToSchemaNumber(row, column, n)).ToList();
|
||||
if (adjacentNumbers.Count != 2) { continue; }
|
||||
|
||||
@@ -115,11 +115,11 @@ public class Day03 : IDay
|
||||
|
||||
public struct SchemaNumber
|
||||
{
|
||||
public string[] Schema { get; init; }
|
||||
public int Row { get; init; }
|
||||
public int Column { get; init; }
|
||||
public int Lenght { get; init; }
|
||||
public int Value { get; init; }
|
||||
public string[] Schema { get; set; }
|
||||
public int Row { get; set; }
|
||||
public int Column { get; set; }
|
||||
public int Lenght { get; set; }
|
||||
public int Value { get; set; }
|
||||
}
|
||||
|
||||
public static SchemaNumber? SearchNextSchemaNumber(string[] schema, int initialRow, int initialColumn)
|
||||
@@ -176,7 +176,7 @@ public class Day03 : IDay
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
private static bool CellAdjacentToSchemaNumber(int row, int column, SchemaNumber number)
|
||||
{
|
||||
int minRow = number.Row - 1;
|
||||
@@ -188,7 +188,8 @@ public class Day03 : IDay
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -118,7 +118,7 @@ public class Day04 : IDay
|
||||
_winningNumbers = GetNumbers(strColumns[0]);
|
||||
_myNumbers = GetNumbers(strColumns[1]);
|
||||
}
|
||||
|
||||
|
||||
private static List<int> GetNumbers(string strNumbers)
|
||||
{
|
||||
string[] parts = strNumbers.Split(' ');
|
||||
@@ -135,5 +135,6 @@ public class Day04 : IDay
|
||||
{
|
||||
return _myNumbers.Count(myNumber => _winningNumbers.Contains(myNumber));
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
@@ -136,7 +136,7 @@ public class Day05 : IDay
|
||||
LinesReader reader = new(inputs);
|
||||
Almanac? almanac = Almanac.Parse(reader);
|
||||
int i = 0;
|
||||
List<AlmanacRangeMapping> ranges = [];
|
||||
List<AlmanacRangeMapping> ranges = new();
|
||||
while (almanac?.Seeds.Count > i)
|
||||
{
|
||||
long seed = almanac.Seeds[i];
|
||||
@@ -155,14 +155,21 @@ public class Day05 : IDay
|
||||
}
|
||||
|
||||
|
||||
public class LinesReader(string[] lines)
|
||||
public class LinesReader
|
||||
{
|
||||
private readonly string[] _lines;
|
||||
private int _index;
|
||||
|
||||
public LinesReader(string[] lines)
|
||||
{
|
||||
_lines = lines;
|
||||
_index = 0;
|
||||
}
|
||||
|
||||
public string? GetLine()
|
||||
{
|
||||
if (_index >= lines.Length) { return null; }
|
||||
string line = lines[_index];
|
||||
if (_index >= _lines.Length) { return null; }
|
||||
string line = _lines[_index];
|
||||
_index++;
|
||||
return line;
|
||||
}
|
||||
@@ -291,7 +298,7 @@ public class Day05 : IDay
|
||||
{
|
||||
public string Name { get; private init; } = string.Empty;
|
||||
|
||||
public List<AlmanacRangeMapping> RangeMappings { get; } = [];
|
||||
public List<AlmanacRangeMapping> RangeMappings { get; } = new();
|
||||
|
||||
public static AlmanacMapping? ParseNext(LinesReader reader)
|
||||
{
|
||||
@@ -339,32 +346,29 @@ public class Day05 : IDay
|
||||
|
||||
public List<AlmanacRangeMapping> Apply(AlmanacRangeMapping range)
|
||||
{
|
||||
List<AlmanacRangeMapping> unMappedRanges = [
|
||||
List<AlmanacRangeMapping> unMappedRanges = new() {
|
||||
range,
|
||||
];
|
||||
List<AlmanacRangeMapping> newUnMappedRanges = [];
|
||||
List<AlmanacRangeMapping> mappedRanges = [];
|
||||
};
|
||||
List<AlmanacRangeMapping> newUnMappedRanges = new();
|
||||
List<AlmanacRangeMapping> mappedRanges = new();
|
||||
|
||||
int i = 0;
|
||||
while (RangeMappings.Count > i)
|
||||
{
|
||||
AlmanacRangeMapping rangeMapping = RangeMappings[i];
|
||||
foreach (AlmanacRangeMapping unMappedRange in unMappedRanges)
|
||||
for (int j = 0; j < unMappedRanges.Count; j++)
|
||||
{
|
||||
AlmanacRangeMapping.ClipResult result = rangeMapping.Clip(unMappedRange);
|
||||
AlmanacRangeMapping.ClipResult result = rangeMapping.Clip(unMappedRanges[j]);
|
||||
if (result.Clipped != null) { mappedRanges.Add(result.Clipped.Value); }
|
||||
if (result.PreClip != null) { newUnMappedRanges.Add(result.PreClip.Value); }
|
||||
if (result.PostClip != null) { newUnMappedRanges.Add(result.PostClip.Value); }
|
||||
}
|
||||
unMappedRanges = newUnMappedRanges;
|
||||
newUnMappedRanges = [];
|
||||
newUnMappedRanges = new List<AlmanacRangeMapping>();
|
||||
i++;
|
||||
}
|
||||
|
||||
List<AlmanacRangeMapping> resultMappedRanges = [];
|
||||
resultMappedRanges.AddRange(mappedRanges);
|
||||
resultMappedRanges.AddRange(unMappedRanges);
|
||||
return resultMappedRanges;
|
||||
return mappedRanges.Union(unMappedRanges).ToList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -377,7 +381,7 @@ public class Day05 : IDay
|
||||
|
||||
public List<long> Seeds { get; }
|
||||
|
||||
private List<AlmanacMapping> Mappings { get; } = [];
|
||||
private List<AlmanacMapping> Mappings { get; } = new();
|
||||
|
||||
public static Almanac? Parse(LinesReader reader)
|
||||
{
|
||||
|
||||
@@ -114,9 +114,9 @@ public class Day07 : IDay
|
||||
|
||||
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';
|
||||
|
||||
public enum Types
|
||||
@@ -174,7 +174,7 @@ public class Day07 : IDay
|
||||
dictLabelCounts.Add(JokerLabel, 5);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (dictLabelCounts.Count == 1) { return Types.FiveOfAKind; }
|
||||
if (dictLabelCounts.Count == 5) { return Types.HighCard; }
|
||||
if (dictLabelCounts.Count == 2)
|
||||
|
||||
@@ -105,11 +105,18 @@ public class Day08 : IDay
|
||||
return steps.ToString();
|
||||
}
|
||||
|
||||
private class MapNode(string strMapNode)
|
||||
private class MapNode
|
||||
{
|
||||
public string Key { get; } = strMapNode.Substring(0, 3);
|
||||
public string LeftKey { get; } = strMapNode.Substring(7, 3);
|
||||
public string RightKey { get; } = strMapNode.Substring(12, 3);
|
||||
public string Key { get; set; }
|
||||
public string LeftKey { get; set; }
|
||||
public string RightKey { get; set; }
|
||||
|
||||
public MapNode(string strMapNode)
|
||||
{
|
||||
Key = strMapNode.Substring(0, 3);
|
||||
LeftKey = strMapNode.Substring(7, 3);
|
||||
RightKey = strMapNode.Substring(12, 3);
|
||||
}
|
||||
}
|
||||
|
||||
private class Map
|
||||
@@ -148,23 +155,32 @@ public class Day08 : IDay
|
||||
}
|
||||
}
|
||||
|
||||
private class MapWalker(Map map, string startKey)
|
||||
private class MapWalker
|
||||
{
|
||||
private MapNode _currentNode = map.GetByKey(startKey) ?? map.Nodes.First();
|
||||
private readonly Map _map;
|
||||
|
||||
private MapNode _currentNode;
|
||||
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)
|
||||
{
|
||||
while (condition(this))
|
||||
{
|
||||
char leftRightInstruction = map.GetInstruction(_steps);
|
||||
char leftRightInstruction = _map.GetInstruction(_steps);
|
||||
if (leftRightInstruction == 'L')
|
||||
{
|
||||
_currentNode = map.GetByKey(_currentNode.LeftKey) ?? map.Nodes.First();
|
||||
_currentNode = _map.GetByKey(_currentNode.LeftKey) ?? _map.Nodes.First();
|
||||
}
|
||||
if (leftRightInstruction == 'R')
|
||||
{
|
||||
_currentNode = map.GetByKey(_currentNode.RightKey) ?? map.Nodes.First();
|
||||
_currentNode = _map.GetByKey(_currentNode.RightKey) ?? _map.Nodes.First();
|
||||
}
|
||||
_steps++;
|
||||
}
|
||||
@@ -180,7 +196,7 @@ public class Day08 : IDay
|
||||
get { return _steps; }
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
// https://en.wikipedia.org/wiki/Euclidean_algorithm#Implementations
|
||||
private static long GreatestCommonDivisor(long a, long b)
|
||||
{
|
||||
|
||||
@@ -164,15 +164,15 @@ public class Day09 : IDay
|
||||
|
||||
return newLastNumber;
|
||||
}
|
||||
|
||||
|
||||
public long ExtrapolatePast()
|
||||
{
|
||||
_derivatives.Last().Insert(0, 0);
|
||||
_derivatives.Last().Insert(0,0);
|
||||
for (int i = _derivatives.Count - 2; i >= 0; i--)
|
||||
{
|
||||
long firstDerivative1 = _derivatives[i].First();
|
||||
long firstDerivative0 = _derivatives[i + 1].First();
|
||||
_derivatives[i].Insert(0, firstDerivative1 - firstDerivative0);
|
||||
_derivatives[i].Insert(0,firstDerivative1 - firstDerivative0);
|
||||
}
|
||||
long firstNumber = _numbers.First();
|
||||
long firstDerivative = _derivatives[0].First();
|
||||
|
||||
@@ -228,10 +228,16 @@ public class Day10 : IDay
|
||||
return countInside.ToString();
|
||||
}
|
||||
|
||||
private struct Point(int x, int y)
|
||||
private struct Point
|
||||
{
|
||||
public int X = x;
|
||||
public int Y = y;
|
||||
public int X;
|
||||
public int Y;
|
||||
|
||||
public Point(int x, int y)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
}
|
||||
}
|
||||
|
||||
private class PipeMaze
|
||||
@@ -317,7 +323,7 @@ public class Day10 : IDay
|
||||
x: point.X + 1,
|
||||
y: point.Y);
|
||||
}
|
||||
if (point.Y == prevPoint.Y && prevPoint.X > point.X)
|
||||
if(point.Y == prevPoint.Y && prevPoint.X > point.X)
|
||||
{
|
||||
return new Point(
|
||||
x: point.X,
|
||||
@@ -333,7 +339,7 @@ public class Day10 : IDay
|
||||
x: point.X - 1,
|
||||
y: point.Y);
|
||||
}
|
||||
if (point.Y == prevPoint.Y && prevPoint.X < point.X)
|
||||
if(point.Y == prevPoint.Y && prevPoint.X < point.X)
|
||||
{
|
||||
return new Point(
|
||||
x: point.X,
|
||||
@@ -349,7 +355,7 @@ public class Day10 : IDay
|
||||
x: point.X - 1,
|
||||
y: point.Y);
|
||||
}
|
||||
if (point.Y == prevPoint.Y && prevPoint.X < point.X)
|
||||
if(point.Y == prevPoint.Y && prevPoint.X < point.X)
|
||||
{
|
||||
return new Point(
|
||||
x: point.X,
|
||||
@@ -365,7 +371,7 @@ public class Day10 : IDay
|
||||
x: point.X + 1,
|
||||
y: point.Y);
|
||||
}
|
||||
if (point.Y == prevPoint.Y && prevPoint.X > point.X)
|
||||
if(point.Y == prevPoint.Y && prevPoint.X > point.X)
|
||||
{
|
||||
return new Point(
|
||||
x: point.X,
|
||||
@@ -391,7 +397,7 @@ public class Day10 : IDay
|
||||
{
|
||||
Point? nextPoint = FollowPipe(point, prevPoint);
|
||||
if (nextPoint == null) { break; }
|
||||
|
||||
|
||||
distance++;
|
||||
int? currentDistance = GetDistance(point);
|
||||
if (currentDistance > distance || currentDistance == null)
|
||||
@@ -403,7 +409,7 @@ public class Day10 : IDay
|
||||
point = nextPoint.Value;
|
||||
} while (true);
|
||||
}
|
||||
|
||||
|
||||
public int GetMaxDistance()
|
||||
{
|
||||
int max = int.MinValue;
|
||||
@@ -432,10 +438,10 @@ public class Day10 : IDay
|
||||
|
||||
private char CalculateCell(Point point)
|
||||
{
|
||||
Point? pointRight = 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? pointUp = FollowPipe(new Point(point.X, point.Y - 1), point);
|
||||
Point? pointRight =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? pointUp =FollowPipe(new Point(point.X, point.Y - 1), point);
|
||||
if (pointRight != null && pointLeft == null && pointDown != null && pointUp == null)
|
||||
{
|
||||
return 'F';
|
||||
@@ -501,12 +507,12 @@ public class Day10 : IDay
|
||||
}
|
||||
else if (cell == 'J')
|
||||
{
|
||||
if (cellStart == 'F')
|
||||
if(cellStart == 'F')
|
||||
{
|
||||
inside = inside != true;
|
||||
cellStart = null;
|
||||
}
|
||||
else if (cellStart == 'L')
|
||||
else if(cellStart == 'L')
|
||||
{
|
||||
cellStart = null;
|
||||
}
|
||||
@@ -517,23 +523,23 @@ public class Day10 : IDay
|
||||
{
|
||||
cellStart = 'F';
|
||||
}
|
||||
else if (cellStart == 'J')
|
||||
else if(cellStart == 'J')
|
||||
{
|
||||
inside = inside != true;
|
||||
cellStart = null;
|
||||
}
|
||||
else if (cellStart == '7')
|
||||
else if(cellStart == '7')
|
||||
{
|
||||
cellStart = null;
|
||||
}
|
||||
}
|
||||
else if (cell == '7')
|
||||
{
|
||||
if (cellStart == 'F')
|
||||
if(cellStart == 'F')
|
||||
{
|
||||
cellStart = null;
|
||||
}
|
||||
else if (cellStart == 'L')
|
||||
else if(cellStart == 'L')
|
||||
{
|
||||
inside = inside != true;
|
||||
cellStart = null;
|
||||
@@ -545,11 +551,11 @@ public class Day10 : IDay
|
||||
{
|
||||
cellStart = 'L';
|
||||
}
|
||||
else if (cellStart == 'J')
|
||||
else if(cellStart == 'J')
|
||||
{
|
||||
cellStart = null;
|
||||
}
|
||||
else if (cellStart == '7')
|
||||
else if(cellStart == '7')
|
||||
{
|
||||
inside = inside != true;
|
||||
cellStart = null;
|
||||
|
||||
@@ -130,8 +130,8 @@ public class Day11 : IDay
|
||||
|
||||
private struct Point
|
||||
{
|
||||
public long X { get; init; }
|
||||
public long Y { get; init; }
|
||||
public long X { get; set; }
|
||||
public long Y { get; set; }
|
||||
}
|
||||
|
||||
private class GalaxyMap
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
using System.Text;
|
||||
|
||||
namespace AdventOfCode2023;
|
||||
|
||||
@@ -211,7 +212,7 @@ public class Day12 : IDay
|
||||
{
|
||||
throw new Exception("Invalid input");
|
||||
}
|
||||
|
||||
|
||||
if (springsRecord.Length < damagedSprings[0])
|
||||
{
|
||||
// Invalid match; Not enough data on record for the current damagedSprings group
|
||||
@@ -229,7 +230,7 @@ public class Day12 : IDay
|
||||
// Skip current damagedSprings group
|
||||
return CountPossibleArrangements(springsRecord.Substring(damagedSprings[0]), damagedSprings.Skip(1).ToArray());
|
||||
}
|
||||
|
||||
|
||||
if (springsRecord.Length < (damagedSprings[0] + 1) || springsRecord[damagedSprings[0]] == '#')
|
||||
{
|
||||
// Invalid match; There must be an operational (or unknown) spring between damaged spring groups
|
||||
|
||||
@@ -72,6 +72,44 @@ However, you'll need to search a much larger test area if you want to see if any
|
||||
|
||||
Considering only the X and Y axes, check all pairs of hailstones' future paths for intersections. How many of these intersections occur within the test area?
|
||||
|
||||
--- Part Two ---
|
||||
|
||||
Upon further analysis, it doesn't seem like any hailstones will naturally collide. It's up to you to fix that!
|
||||
|
||||
You find a rock on the ground nearby. While it seems extremely unlikely, if you throw it just right, you should be able to hit every hailstone in a single throw!
|
||||
|
||||
You can use the probably-magical winds to reach any integer position you like and to propel the rock at any integer velocity. Now including the Z axis in your calculations, if you throw the rock at time 0, where do you need to be so that the rock perfectly collides with every hailstone? Due to probably-magical inertia, the rock won't slow down or change direction when it collides with a hailstone.
|
||||
|
||||
In the example above, you can achieve this by moving to position 24, 13, 10 and throwing the rock at velocity -3, 1, 2. If you do this, you will hit every hailstone as follows:
|
||||
|
||||
Hailstone: 19, 13, 30 @ -2, 1, -2
|
||||
Collision time: 5
|
||||
Collision position: 9, 18, 20
|
||||
|
||||
Hailstone: 18, 19, 22 @ -1, -1, -2
|
||||
Collision time: 3
|
||||
Collision position: 15, 16, 16
|
||||
|
||||
Hailstone: 20, 25, 34 @ -2, -2, -4
|
||||
Collision time: 4
|
||||
Collision position: 12, 17, 18
|
||||
|
||||
Hailstone: 12, 31, 28 @ -1, -2, -1
|
||||
Collision time: 6
|
||||
Collision position: 6, 19, 22
|
||||
|
||||
Hailstone: 20, 19, 15 @ 1, -5, -3
|
||||
Collision time: 1
|
||||
Collision position: 21, 14, 12
|
||||
|
||||
Above, each hailstone is identified by its initial position and its velocity. Then, the time and position of that hailstone's collision with your rock are given.
|
||||
|
||||
After 1 nanosecond, the rock has exactly the same position as one of the hailstones, obliterating it into ice dust! Another hailstone is smashed to bits two nanoseconds after that. After a total of 6 nanoseconds, all of the hailstones have been destroyed.
|
||||
|
||||
So, at time 0, the rock needs to be at X position 24, Y position 13, and Z position 10. Adding these three coordinates together produces 47. (Don't add any coordinates from the rock's velocity.)
|
||||
|
||||
Determine the exact position and velocity the rock needs to have at time 0 so that it perfectly collides with every hailstone. What do you get if you add up the X, Y, and Z coordinates of that initial position?
|
||||
|
||||
|
||||
*/
|
||||
|
||||
@@ -88,10 +126,15 @@ public class Day24 : IDay
|
||||
{
|
||||
for (int j = i + 1; j < hails.Length; j++)
|
||||
{
|
||||
(bool intersects, double s, double t, Vector3D point) = hails[i].Intersect2D(hails[j]);
|
||||
if (intersects && s > 0 && t > 0 && point.X >= min && point.X <= max && point.Y >= min && point.Y <= max)
|
||||
(bool intersects, double s, double t) = hails[i].Intersect2D(hails[j]);
|
||||
if (intersects && s > 0 && t > 0)
|
||||
{
|
||||
count++;
|
||||
long x = (long)(hails[i].Position.X + t * hails[i].Velocity.X);
|
||||
long y = (long)(hails[i].Position.Y + t * hails[i].Velocity.Y);
|
||||
if (x >= min && x <= max && y >= min && y <= max)
|
||||
{
|
||||
count++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -100,20 +143,240 @@ public class Day24 : IDay
|
||||
|
||||
public string ResolvePart2(string[] inputs)
|
||||
{
|
||||
throw new NotImplementedException();
|
||||
string result = ResolvePart2_SolutionInDataSet(inputs);
|
||||
if (string.IsNullOrEmpty(result) == false)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
result = ResolvePart2_BruteForceXY(inputs);
|
||||
if (string.IsNullOrEmpty(result) == false)
|
||||
{
|
||||
return result;
|
||||
}
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public struct Vector3D(long x, long y, long z)
|
||||
|
||||
public string ResolvePart2_BruteForceXY(string[] inputs)
|
||||
{
|
||||
public readonly long X = x;
|
||||
public readonly long Y = y;
|
||||
public readonly long Z = z;
|
||||
Hail[] hails = inputs.Select(input => new Hail(input)).ToArray();
|
||||
|
||||
// Brute force solution
|
||||
long absMax = hails
|
||||
.Select(h => new[] { h.Velocity.X, h.Velocity.Y, h.Velocity.Z, })
|
||||
.SelectMany(x => x).Select(Math.Abs)
|
||||
.Max();
|
||||
Console.WriteLine($"Velocity AbsMax: {absMax}");
|
||||
long minV = -absMax;
|
||||
long maxV = absMax;
|
||||
Vector3D? collisionPoint = null;
|
||||
for (long vy = minV; vy < maxV && collisionPoint == null; vy++)
|
||||
{
|
||||
for (long vx = minV; vx < maxV && collisionPoint == null; vx++)
|
||||
{
|
||||
Vector3D newVelocity0 = new(
|
||||
x: hails[0].Velocity.X - vx,
|
||||
y: hails[0].Velocity.Y - vy,
|
||||
z: hails[0].Velocity.Z);
|
||||
Hail shiftedHail0 = new(hails[0].Position, newVelocity0);
|
||||
Vector3D newVelocity1 = new(
|
||||
x: hails[1].Velocity.X - vx,
|
||||
y: hails[1].Velocity.Y - vy,
|
||||
z: hails[1].Velocity.Z);
|
||||
Hail shiftedHail1 = new(hails[1].Position, newVelocity1);
|
||||
(bool intersects, double s, double t) = shiftedHail0.Intersect2D(shiftedHail1);
|
||||
if (intersects == false || s < 0.0f || t < 0.0) { continue; }
|
||||
|
||||
long x = (long)(shiftedHail0.Position.X + t * shiftedHail0.Velocity.X);
|
||||
long y = (long)(shiftedHail0.Position.Y + t * shiftedHail0.Velocity.Y);
|
||||
Vector3D firstCollisionPoint = new(x, y, 0);
|
||||
//Console.WriteLine($"Possible Rock: {vx} {vy} | {firstCollisionPoint.X}, {firstCollisionPoint.Y}, {firstCollisionPoint.Z} @ {vx}, {vy}, ?? | {s} {t}");
|
||||
Hail[] shiftedHails = hails.Select(h =>
|
||||
{
|
||||
Vector3D newVelocity = new(
|
||||
x: h.Velocity.X - vx,
|
||||
y: h.Velocity.Y - vy,
|
||||
z: h.Velocity.Z);
|
||||
Hail newHail = new(h.Position, newVelocity);
|
||||
return newHail;
|
||||
}).ToArray();
|
||||
Vector3D currentCollisionPoint = firstCollisionPoint;
|
||||
bool allCollided = true;
|
||||
for (int i = 2; i < shiftedHails.Length; i++)
|
||||
{
|
||||
(bool intersectsIter, double sIter, double tIter) = shiftedHails[0].Intersect2D(shiftedHails[i]);
|
||||
long xIter = (long)(shiftedHail0.Position.X + tIter * shiftedHail0.Velocity.X);
|
||||
long yIter = (long)(shiftedHail0.Position.Y + tIter * shiftedHail0.Velocity.Y);
|
||||
Vector3D collisionPointIter = new(xIter, yIter, 0);
|
||||
if (
|
||||
intersectsIter &&
|
||||
currentCollisionPoint.Cmp2D(collisionPointIter) &&
|
||||
true)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
allCollided = false;
|
||||
//Console.WriteLine($"... Invalid rock: {i}");
|
||||
break;
|
||||
}
|
||||
if (allCollided)
|
||||
{
|
||||
long xCollision = (long)(hails[0].Position.X + t * hails[0].Velocity.X);
|
||||
long yCollision = (long)(hails[0].Position.Y + t * hails[0].Velocity.Y);
|
||||
long zCollision = (long)(hails[0].Position.Z + t * hails[0].Velocity.Z);
|
||||
Console.WriteLine($"Possible Rock: {xCollision}, {yCollision}, {zCollision} @ {vx}, {vy}, ?? | {t}");
|
||||
collisionPoint = new Vector3D(xCollision, yCollision, zCollision);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (collisionPoint == null)
|
||||
{
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
return (collisionPoint.Value.X + collisionPoint.Value.Y + collisionPoint.Value.Z).ToString();
|
||||
}
|
||||
|
||||
private string ResolvePart2_BruteForceXYZ(string[] inputs)
|
||||
{
|
||||
Hail[] hails = inputs.Select(input => new Hail(input)).ToArray();
|
||||
|
||||
// Brute force solution
|
||||
long absMax = hails
|
||||
.Select(h => new[] { h.Velocity.X, h.Velocity.Y, h.Velocity.Z, })
|
||||
.SelectMany(x => x).Select(Math.Abs)
|
||||
.Max();
|
||||
Console.WriteLine($"Velocity AbsMax: {absMax}");
|
||||
long minV = -absMax;
|
||||
long maxV = absMax;
|
||||
Vector3D? collisionPoint = null;
|
||||
for (long vz = minV; vz < maxV && collisionPoint == null; vz++)
|
||||
{
|
||||
Console.WriteLine($"Brute forcing Z layer {vz}");
|
||||
for (long vy = minV; vy < maxV && collisionPoint == null; vy++)
|
||||
{
|
||||
for (long vx = minV; vx < maxV && collisionPoint == null; vx++)
|
||||
{
|
||||
Vector3D newVelocity0 = new(
|
||||
x: hails[0].Velocity.X - vx,
|
||||
y: hails[0].Velocity.Y - vy,
|
||||
z: hails[0].Velocity.Z - vz);
|
||||
Hail shiftedHail0 = new(hails[0].Position, newVelocity0);
|
||||
Vector3D newVelocity1 = new(
|
||||
x: hails[1].Velocity.X - vx,
|
||||
y: hails[1].Velocity.Y - vy,
|
||||
z: hails[1].Velocity.Z - vz);
|
||||
Hail shiftedHail1 = new(hails[1].Position, newVelocity1);
|
||||
(bool intersects, double t, Vector3D? firstCollisionPoint) = shiftedHail0.Intersect3D(shiftedHail1, sameT: false);
|
||||
if (intersects == false || firstCollisionPoint == null || t < 0.0) { continue; }
|
||||
|
||||
//Console.WriteLine($"Possible Rock: {firstCollisionPoint.Value.X}, {firstCollisionPoint.Value.Y}, {firstCollisionPoint.Value.Z} @ {vx}, {vy}, {vz} | {t}");
|
||||
Hail[] shiftedHails = hails.Select(h =>
|
||||
{
|
||||
Vector3D newVelocity = new(
|
||||
x: h.Velocity.X - vx,
|
||||
y: h.Velocity.Y - vy,
|
||||
z: h.Velocity.Z - vz);
|
||||
Hail newHail = new(h.Position, newVelocity);
|
||||
return newHail;
|
||||
}).ToArray();
|
||||
Vector3D currentCollisionPoint = firstCollisionPoint.Value;
|
||||
bool allCollided = true;
|
||||
for (int i = 2; i < shiftedHails.Length; i++)
|
||||
{
|
||||
(bool intersectsIter, double tIter, Vector3D? collisionPointIter) = shiftedHails[0].Intersect3D(shiftedHails[i], sameT: false);
|
||||
if (
|
||||
intersectsIter &&
|
||||
tIter >= -0.001f &&
|
||||
collisionPointIter != null &&
|
||||
currentCollisionPoint.Cmp3D(collisionPointIter.Value) &&
|
||||
true)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
allCollided = false;
|
||||
//Console.WriteLine($"... Invalid rock: {i}");
|
||||
break;
|
||||
}
|
||||
if (allCollided)
|
||||
{
|
||||
collisionPoint = currentCollisionPoint;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return collisionPoint != null
|
||||
? (collisionPoint.Value.X + collisionPoint.Value.Y + collisionPoint.Value.Z).ToString()
|
||||
: string.Empty;
|
||||
}
|
||||
|
||||
private string ResolvePart2_SolutionInDataSet(string[] inputs)
|
||||
{
|
||||
Hail[] hails = inputs.Select(input => new Hail(input)).ToArray();
|
||||
|
||||
// Check if any hail is doing the same as the rock
|
||||
Hail? bestMatch = null;
|
||||
for (int i = 0; i < hails.Length; i++)
|
||||
{
|
||||
bool allCollided = true;
|
||||
for (int j = 0; j < hails.Length; j++)
|
||||
{
|
||||
if (i == j) { continue; }
|
||||
(bool intersects, _, _) = hails[i].Intersect3D(hails[j]);
|
||||
if (intersects) { continue; }
|
||||
|
||||
allCollided = false;
|
||||
break;
|
||||
}
|
||||
if (allCollided)
|
||||
{
|
||||
bestMatch = hails[i];
|
||||
}
|
||||
}
|
||||
if (bestMatch != null)
|
||||
{
|
||||
return (bestMatch.Value.Position.X + bestMatch.Value.Position.Y + bestMatch.Value.Position.Z).ToString();
|
||||
}
|
||||
|
||||
return string.Empty;
|
||||
}
|
||||
|
||||
public readonly struct Vector3D
|
||||
{
|
||||
public readonly long X;
|
||||
public readonly long Y;
|
||||
public readonly long Z;
|
||||
|
||||
public Vector3D(long x, long y, long z)
|
||||
{
|
||||
X = x;
|
||||
Y = y;
|
||||
Z = z;
|
||||
}
|
||||
|
||||
public bool Cmp2D(Vector3D other)
|
||||
{
|
||||
return X == other.X && Y == other.Y;
|
||||
}
|
||||
|
||||
public bool Cmp3D(Vector3D other)
|
||||
{
|
||||
return X == other.X && Y == other.Y && Z == other.Z;
|
||||
}
|
||||
}
|
||||
|
||||
public readonly struct Hail
|
||||
{
|
||||
public readonly Vector3D Position;
|
||||
private readonly Vector3D _velocity;
|
||||
public readonly Vector3D Velocity;
|
||||
|
||||
public Hail(Vector3D position, Vector3D velocity)
|
||||
{
|
||||
Position = position;
|
||||
Velocity = velocity;
|
||||
}
|
||||
|
||||
public Hail(string input)
|
||||
{
|
||||
@@ -124,30 +387,49 @@ public class Day24 : IDay
|
||||
y: Convert.ToInt64(strPosition[1]),
|
||||
z: Convert.ToInt64(strPosition[2]));
|
||||
string[] strVelocity = parts[1].Split(", ");
|
||||
_velocity = new Vector3D(
|
||||
Velocity = new Vector3D(
|
||||
x: Convert.ToInt64(strVelocity[0]),
|
||||
y: Convert.ToInt64(strVelocity[1]),
|
||||
z: Convert.ToInt64(strVelocity[2]));
|
||||
}
|
||||
|
||||
public (bool intersects, double s, double t, Vector3D point) Intersect2D(Hail other)
|
||||
public (bool intersects, double s, double t) 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)
|
||||
{
|
||||
return (false, 0, 0, new Vector3D());
|
||||
return (false, 0, 0);
|
||||
}
|
||||
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)
|
||||
{
|
||||
return (false, 0, 0, new Vector3D());
|
||||
return (false, 0, 0);
|
||||
}
|
||||
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);
|
||||
return (true, s, t, intersection);
|
||||
return (true, s, t);
|
||||
}
|
||||
|
||||
public (bool intersects, double t, Vector3D? point) Intersect3D(Hail other, bool sameT = true)
|
||||
{
|
||||
(bool intersects, double s, double t) = Intersect2D(other);
|
||||
if (intersects == false || (sameT && Math.Abs(s - t) > 0.001))
|
||||
{
|
||||
return (false, 0, null);
|
||||
}
|
||||
|
||||
long zThis = (long)(Position.Z + t * Velocity.Z);
|
||||
long zOther = (long)(other.Position.Z + s * other.Velocity.Z);
|
||||
if (Math.Abs(zThis - zOther) > 0.001)
|
||||
{
|
||||
return (false, 0, null);
|
||||
}
|
||||
long yThis = (long)(Position.Y + t * Velocity.Y);
|
||||
long xThis = (long)(Position.X + t * Velocity.X);
|
||||
|
||||
return (true, t, new Vector3D(xThis, yThis, zThis));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,26 +0,0 @@
|
||||
<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>
|
||||
@@ -1,38 +0,0 @@
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1,38 +0,0 @@
|
||||
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
Reference in New Issue
Block a user