Add day 10
This commit is contained in:
@@ -21,6 +21,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day8", "Day8\Day8.csproj",
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day9", "Day9\Day9.csproj", "{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}"
|
||||
EndProject
|
||||
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Day10", "Day10\Day10.csproj", "{9DA97BBA-99AF-4FA7-97BB-C6EF3F8B24A4}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
@@ -63,6 +65,10 @@ Global
|
||||
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{E343E757-5AAC-4CDC-9B78-A5FB2466DAE2}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{9DA97BBA-99AF-4FA7-97BB-C6EF3F8B24A4}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{9DA97BBA-99AF-4FA7-97BB-C6EF3F8B24A4}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{9DA97BBA-99AF-4FA7-97BB-C6EF3F8B24A4}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{9DA97BBA-99AF-4FA7-97BB-C6EF3F8B24A4}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
|
||||
16
Day10/Day10.csproj
Normal file
16
Day10/Day10.csproj
Normal file
@@ -0,0 +1,16 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>net8.0</TargetFramework>
|
||||
<ImplicitUsings>enable</ImplicitUsings>
|
||||
<Nullable>enable</Nullable>
|
||||
</PropertyGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<None Update="input.txt">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</None>
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
142
Day10/Program.cs
Normal file
142
Day10/Program.cs
Normal file
@@ -0,0 +1,142 @@
|
||||
var rawTopographicMap = File.ReadLines("input.txt");
|
||||
var topographicMap = CreateTopographicMap(rawTopographicMap);
|
||||
|
||||
var availableDirections = new List<(int, int)>()
|
||||
{
|
||||
(-1, 0), // Up
|
||||
(1, 0), // Down
|
||||
(0, -1), // Left
|
||||
(0, 1) // Right
|
||||
};
|
||||
|
||||
Console.WriteLine($"Part1: {Part1(topographicMap, availableDirections)}\nPart2: {Part2(topographicMap, availableDirections)}");
|
||||
|
||||
|
||||
int Part2(int[,] mapInput, List<(int, int)> directions)
|
||||
{
|
||||
var totalRating = 0;
|
||||
for (var r = 0; r < mapInput.GetLength(0); r++)
|
||||
{
|
||||
for (var c = 0; c < mapInput.GetLength(1); c++)
|
||||
{
|
||||
if (mapInput[r, c] == 0)
|
||||
{
|
||||
totalRating += FindDistinctTrails(r, c, mapInput, directions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return totalRating;
|
||||
}
|
||||
|
||||
int FindDistinctTrails(int r, int c, int[,] mapInput, List<(int, int)> directions)
|
||||
{
|
||||
var stack = new Stack<List<(int, int)>>();
|
||||
stack.Push(new List<(int, int)> { (r, c) });
|
||||
var trails = 0;
|
||||
|
||||
while (stack.Count > 0)
|
||||
{
|
||||
var currentPath = stack.Pop();
|
||||
var (cr, cc) = currentPath[^1];
|
||||
|
||||
if (mapInput[cr, cc] == 9)
|
||||
{
|
||||
trails++;
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var (dr, dc) in directions)
|
||||
{
|
||||
var nr = cr + dr;
|
||||
var nc = cc + dc;
|
||||
|
||||
if (nr >= 0 && nr < mapInput.GetLength(0) && nc >= 0 && nc < mapInput.GetLength(1) &&
|
||||
mapInput[nr, nc] == mapInput[cr, cc] + 1)
|
||||
{
|
||||
var nextPath = new List<(int, int)>(currentPath);
|
||||
nextPath.Add((nr, nc));
|
||||
stack.Push(nextPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return trails;
|
||||
}
|
||||
|
||||
int Part1(int[,] map, List<(int, int)> directions)
|
||||
{
|
||||
var totalScore = 0;
|
||||
|
||||
for (var row = 0; row < map.GetLength(0); row++)
|
||||
{
|
||||
for (var column = 0; column < map.GetLength(1); column++)
|
||||
{
|
||||
if (map[row, column] == 0)
|
||||
{
|
||||
totalScore += TrailHead(row, column, map, directions);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return totalScore;
|
||||
}
|
||||
|
||||
int TrailHead(int startRow, int startColumn, int[,] map, List<(int, int)> directions)
|
||||
{
|
||||
var rows = map.GetLength(0);
|
||||
var cols = map.GetLength(1);
|
||||
var queue = new Queue<(int, int)>();
|
||||
var visited = new HashSet<(int, int)>();
|
||||
var reachableNines = new HashSet<(int, int)>();
|
||||
|
||||
queue.Enqueue((startRow, startColumn));
|
||||
|
||||
while (queue.Count > 0)
|
||||
{
|
||||
var (r, c) = queue.Dequeue();
|
||||
|
||||
if (visited.Contains((r, c)))
|
||||
continue;
|
||||
|
||||
visited.Add((r, c));
|
||||
|
||||
if (map[r, c] == 9)
|
||||
{
|
||||
reachableNines.Add((r, c));
|
||||
continue;
|
||||
}
|
||||
|
||||
foreach (var dir in directions)
|
||||
{
|
||||
var nr = r + dir.Item1;
|
||||
var nc = c + dir.Item2;
|
||||
|
||||
if (nr >= 0 && nr < rows && nc >= 0 && nc < cols)
|
||||
{
|
||||
if (map[nr, nc] == map[r, c] + 1)
|
||||
{
|
||||
queue.Enqueue((nr, nc));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return reachableNines.Count;
|
||||
}
|
||||
|
||||
int[,] CreateTopographicMap(IEnumerable<string> lines)
|
||||
{
|
||||
var lineList = lines.Select(line => line.Trim()).ToList();
|
||||
var map = new int[lineList.Count, lineList[0].Length];
|
||||
|
||||
for (var r = 0; r < map.GetLength(0); r++)
|
||||
{
|
||||
for (var c = 0; c < map.GetLength(1); c++)
|
||||
{
|
||||
map[r, c] = lineList[r][c] - '0';
|
||||
}
|
||||
}
|
||||
|
||||
return map;
|
||||
}
|
||||
48
Day10/input.txt
Normal file
48
Day10/input.txt
Normal file
@@ -0,0 +1,48 @@
|
||||
101987698323656762989721011010987456780121243210
|
||||
234012567210547891078892012101072345891030984569
|
||||
142103454345432012367743423232161654322345855678
|
||||
051054965236701103456656894343450783210496764789
|
||||
962167850149896543245765765456980892108587053298
|
||||
873076701056787600130876554967821876549652142103
|
||||
954987432165634512021989478876782965678703234012
|
||||
765876541074328763145672369805493454302212547654
|
||||
896968953981019854236981054012349854211243478943
|
||||
657857762876567610765100340101238763210798545692
|
||||
765446891001498723834232215293045678189877632781
|
||||
802335432312387654923341004382167669012368701020
|
||||
911124701421019870110056905673458978975459345210
|
||||
320099876598943065232167810569898963287561276349
|
||||
456787756787854104343054321678107854196510389458
|
||||
329878941012763210454988934521256981075431343367
|
||||
019561030323678923567867141010345410987123454321
|
||||
878432321410589854543252012367894322346001067800
|
||||
965678798523470189630141043454387011055432108912
|
||||
234309657631063238745632658965296545765443297983
|
||||
103210545432154127030745667870101239812344589854
|
||||
123451236943061032121836789654320149801256678765
|
||||
018760147858978945412921078761012456789107967810
|
||||
569676546567167656503832099908901327898798856921
|
||||
678989432100016987434512187819832010145610765430
|
||||
567010498761221498729603456520743016234431254321
|
||||
154321343254330327018777895431654327652342341232
|
||||
034501656189945012310689765432343678541056540765
|
||||
127652783076876763423676543087652589230767439856
|
||||
098743692105677894534589832198101450121858921045
|
||||
769878901234786765109689101265012376543929012234
|
||||
878963210121099889278770125654321289012210430123
|
||||
987654323452016776308765210787430100101121522434
|
||||
670122014560125655419654354896508921089037611078
|
||||
549831009871234534328323763011017632176548902369
|
||||
038742789965676548933214892182126543210423098454
|
||||
125653656234987837654300321099234304321012167823
|
||||
034564540165832921020311456788765015698143456910
|
||||
321078939874981021011232321001298923789874301501
|
||||
012981543403876120102345409876387654301565217652
|
||||
565470034512985433201456912345401543214321438943
|
||||
678321127621076894398567810126918754265410521032
|
||||
099128938902345765487656787637829662178345621001
|
||||
187019878213765496567678698540134543089210782789
|
||||
236520569347874385438569187687238956745432893610
|
||||
945431450956901276329430056796549875856721894523
|
||||
876532321876101301210321149823456721949890765434
|
||||
765321012765432340343434231012545430132101256545
|
||||
Reference in New Issue
Block a user