feat: solve part 2

This commit is contained in:
Stevan Freeborn
2023-12-11 02:03:46 -06:00
parent 630576c065
commit 77e5ab8018
6 changed files with 138 additions and 7 deletions
+2 -1
View File
@@ -1,2 +1,3 @@
global using Xunit;
global using FluentAssertions; global using FluentAssertions;
global using Xunit;
+78 -1
View File
@@ -36,13 +36,25 @@ public class MazeTests
[MemberData(nameof(TestData.FurthestStepFromStartTestData), MemberType = typeof(TestData))] [MemberData(nameof(TestData.FurthestStepFromStartTestData), MemberType = typeof(TestData))]
public void FurthestStepFromStart_WhenGivenInput_ItShouldReturnExpectedFurthestStepFromStart(Maze maze, int expectedFurthestStepFromStart) public void FurthestStepFromStart_WhenGivenInput_ItShouldReturnExpectedFurthestStepFromStart(Maze maze, int expectedFurthestStepFromStart)
{ {
maze.FarthestStepFromStart maze.GetFarthestStepFromStart()
.Should() .Should()
.Be(expectedFurthestStepFromStart); .Be(expectedFurthestStepFromStart);
} }
[Theory]
[MemberData(nameof(TestData.AreaTestData), MemberType = typeof(TestData))]
public void Area_WhenGivenInput_ItShouldReturnExpectedArea(string[] input, int expectedArea)
{
var maze = Maze.Parse(input);
maze.GetAreaOfLoop()
.Should()
.Be(expectedArea);
}
public static class TestData public static class TestData
{ {
private static readonly string[] Input = File.ReadAllLines("INPUT.txt");
private static readonly string[] TestMazeInput = private static readonly string[] TestMazeInput =
{ {
".....", ".....",
@@ -68,6 +80,66 @@ public class MazeTests
] ]
); );
public static IEnumerable<object[]> AreaTestData =>
new List<object[]>
{
new object[]
{
new string[]
{
"...........",
".S-------7.",
".|F-----7|.",
".||.....||.",
".||.....||.",
".|L-7.F-J|.",
".|..|.|..|.",
".L--J.L--J.",
"...........",
},
4,
},
new object[]
{
new string[]
{
".F----7F7F7F7F-7....",
".|F--7||||||||FJ....",
".||.FJ||||||||L7....",
"FJL7L7LJLJ||LJ.L-7..",
"L--J.L7...LJS7F-7L7.",
"....F-J..F7FJ|L7L7L7",
"....L7.F7||L7|.L7L7|",
".....|FJLJ|FJ|F7|.LJ",
"....FJL-7.||.||||...",
"....L---J.LJ.LJLJ...",
},
8
},
new object[]
{
new string[]
{
"FF7FSF7F7F7F7F7F---7",
"L|LJ||||||||||||F--J",
"FL-7LJLJ||||||LJL-77",
"F--JF--7||LJLJ7F7FJ-",
"L---JF-JLJ.||-FJLJJ7",
"|F|F-JF---7F7-L7L|7|",
"|FFJF7L7F-JF7|JL---7",
"7-L-JL7||F7|L7F-7F7|",
"L.L7LFJ|||||FJL7||LJ",
"L7JLJL-JLJLJL--JLJ.L",
},
10
},
new object[]
{
Input,
287,
}
};
public static IEnumerable<object[]> FurthestStepFromStartTestData => public static IEnumerable<object[]> FurthestStepFromStartTestData =>
new List<object[]> new List<object[]>
{ {
@@ -112,6 +184,11 @@ public class MazeTests
] ]
), ),
8, 8,
},
new object[]
{
Maze.Parse(Input),
6870,
} }
}; };
+6
View File
@@ -27,4 +27,10 @@
<ProjectReference Include="..\PipeMaze\PipeMaze.csproj" /> <ProjectReference Include="..\PipeMaze\PipeMaze.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Content Include="..\INPUT.txt">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Project> </Project>
+50 -3
View File
@@ -1,4 +1,5 @@
using System.Diagnostics; using System.Diagnostics;
using System.Runtime.CompilerServices;
namespace PipeMaze; namespace PipeMaze;
@@ -18,21 +19,31 @@ public class Program
return -2; return -2;
} }
var isPart2 = args.Length > 1 && args[1] == "part2";
var input = await File.ReadAllLinesAsync(args[0]); var input = await File.ReadAllLinesAsync(args[0]);
var stopwatch = new Stopwatch(); var stopwatch = new Stopwatch();
stopwatch.Start(); stopwatch.Start();
var result = Maze.Parse(input).FarthestStepFromStart; var maze = Maze.Parse(input);
var result = isPart2 ? maze.GetAreaOfLoop() : maze.GetFarthestStepFromStart();
stopwatch.Stop(); stopwatch.Stop();
Console.WriteLine($"The farthest step from the starting pipe is {result}. ({stopwatch.ElapsedMilliseconds}ms)"); if (isPart2)
{
Console.WriteLine($"The area of the loop is {result}. ({stopwatch.ElapsedMilliseconds}ms)");
}
else
{
Console.WriteLine($"The farthest step from the start is {result}. ({stopwatch.ElapsedMilliseconds}ms)");
}
return result; return result;
} }
} }
public class Maze( public class Maze(
int width, int width,
int height, int height,
@@ -56,7 +67,43 @@ public class Maze(
public Pipe? StartingPipe => Pipes.FirstOrDefault(p => p.Type is PipeType.Unknown); public Pipe? StartingPipe => Pipes.FirstOrDefault(p => p.Type is PipeType.Unknown);
public int FarthestStepFromStart => GetLoop().Count / 2; public int GetFarthestStepFromStart() => GetLoop().Count / 2;
public int GetAreaOfLoop()
{
var count = 0;
var loop = GetLoop();
var areInsideLoop = false;
var verticalBoundaries = new List<PipeType>()
{
PipeType.UpAndDown,
PipeType.UpAndRight,
PipeType.UpAndLeft,
};
for (var row = 0; row < Height; row++)
{
for (var column = 0; column < Width; column++)
{
var pipe = loop.FirstOrDefault(p => p.Coordinate.Column == column && p.Coordinate.Row == row);
if (pipe is null && areInsideLoop is true)
{
count++;
}
if (
pipe is not null &&
verticalBoundaries.Contains(pipe.Type) is true
)
{
areInsideLoop = !areInsideLoop;
}
}
}
return count;
}
public List<Pipe> GetLoop() public List<Pipe> GetLoop()
{ {