From dc8bd473b99c9f32c8bb1019b6e24495eda461d8 Mon Sep 17 00:00:00 2001 From: Stevan Freeborn <65925598+StevanFreeborn@users.noreply.github.com> Date: Sat, 2 Dec 2023 10:41:00 -0600 Subject: [PATCH] feat: create parser to parse game into model --- .../PartTwoPuzzleSolverTests.cs | 2 +- 02/CubeConundrum.Tests/GlobalUsings.cs | 3 +- 02/CubeConundrum.Tests/PuzzleParserTests.cs | 94 +++++++++++++++++++ 02/CubeConundrum.Tests/UnitTest1.cs | 10 -- 02/CubeConundrum/Program.cs | 87 ++++++++++++++++- 02/SCRATCH.md | 75 +++++++++++++++ README.md | 54 +++++------ 7 files changed, 284 insertions(+), 41 deletions(-) create mode 100644 02/CubeConundrum.Tests/PuzzleParserTests.cs delete mode 100644 02/CubeConundrum.Tests/UnitTest1.cs create mode 100644 02/SCRATCH.md diff --git a/01/Trebuchet.Tests/PartTwoPuzzleSolverTests.cs b/01/Trebuchet.Tests/PartTwoPuzzleSolverTests.cs index 3854d4f..3e7cd26 100644 --- a/01/Trebuchet.Tests/PartTwoPuzzleSolverTests.cs +++ b/01/Trebuchet.Tests/PartTwoPuzzleSolverTests.cs @@ -36,6 +36,6 @@ public class PartTwoPuzzleSolverTests { var input = await File.ReadAllLinesAsync("INPUT.txt"); var result = _sut.SumCalibrationValues(input); - result.Should().BeLessThan(54249); + result.Should().Be(54249); } } \ No newline at end of file diff --git a/02/CubeConundrum.Tests/GlobalUsings.cs b/02/CubeConundrum.Tests/GlobalUsings.cs index 8c927eb..7fef4b0 100644 --- a/02/CubeConundrum.Tests/GlobalUsings.cs +++ b/02/CubeConundrum.Tests/GlobalUsings.cs @@ -1 +1,2 @@ -global using Xunit; \ No newline at end of file +global using Xunit; +global using FluentAssertions; \ No newline at end of file diff --git a/02/CubeConundrum.Tests/PuzzleParserTests.cs b/02/CubeConundrum.Tests/PuzzleParserTests.cs new file mode 100644 index 0000000..22bdd05 --- /dev/null +++ b/02/CubeConundrum.Tests/PuzzleParserTests.cs @@ -0,0 +1,94 @@ +namespace CubeConundrum.Tests; + +public class PuzzleParserTests +{ + private readonly PuzzleParser _sut = new(); + + [Theory, MemberData(nameof(TestData.CubeStrings), MemberType = typeof(TestData))] + public void ParseCube_GivenAStringThatRepresentsACube_ItShouldReturnTheEquivalentCubeModel(string input, Cube expected) + { + var result = _sut.ParseCube(input); + result.Should().BeEquivalentTo(expected); + } + + [Theory, MemberData(nameof(TestData.ResultStrings), MemberType = typeof(TestData))] + public void ParseResult_GivenAStringThatRepresentsAResult_ItShouldReturnTheEquivalentResultModel(string input, Result expected) + { + var result = _sut.ParseResult(input); + result.Should().BeEquivalentTo(expected); + } + + [Theory, MemberData(nameof(TestData.GameStrings), MemberType = typeof(TestData))] + public void ParseGame_GivenAStringThatRepresentsAGame_ItShouldReturnTheEquivalentGameModel(string input, Game expected) + { + var result = _sut.ParseGame(input); + result.Should().BeEquivalentTo(expected); + } +} + +public static class TestData +{ + public static readonly IEnumerable CubeStrings = new List + { + new object[] { "4 red", new Cube { Count = 4, Color = CubeColor.Red } }, + new object[] { "1 green", new Cube { Count = 1, Color = CubeColor.Green } }, + new object[] { "2 blue", new Cube { Count = 2, Color = CubeColor.Blue } } + }; + + public static readonly IEnumerable ResultStrings = new List + { + new object[] + { + "4 red, 1 green, 2 blue", + new Result + { + Cubes = + [ + new (){ Count = 4, Color = CubeColor.Red }, + new (){ Count = 1, Color = CubeColor.Green }, + new() { Count = 2, Color = CubeColor.Blue } + ] + } + } + }; + + public static readonly IEnumerable GameStrings = new List + { + new object[] + { + "Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green", + new Game + { + Id = 1, + Results = + [ + new() + { + Cubes = + [ + new() { Count = 3, Color = CubeColor.Blue }, + new() { Count = 4, Color = CubeColor.Red } + ] + }, + new Result + { + Cubes = + [ + new() { Count = 1, Color = CubeColor.Red }, + new() { Count = 2, Color = CubeColor.Green }, + new() { Count = 6, Color = CubeColor.Blue } + ] + }, + new Result + { + Cubes = + [ + new(){ Count = 2, Color = CubeColor.Green } + ] + } + ] + } + } + }; + +} \ No newline at end of file diff --git a/02/CubeConundrum.Tests/UnitTest1.cs b/02/CubeConundrum.Tests/UnitTest1.cs deleted file mode 100644 index d26506e..0000000 --- a/02/CubeConundrum.Tests/UnitTest1.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace CubeConundrum.Tests; - -public class UnitTest1 -{ - [Fact] - public void Test1() - { - - } -} \ No newline at end of file diff --git a/02/CubeConundrum/Program.cs b/02/CubeConundrum/Program.cs index 3751555..f71439b 100644 --- a/02/CubeConundrum/Program.cs +++ b/02/CubeConundrum/Program.cs @@ -1,2 +1,85 @@ -ο»Ώ// See https://aka.ms/new-console-template for more information -Console.WriteLine("Hello, World!"); +ο»Ώnamespace CubeConundrum; + +public class Program +{ + public async static Task Main(string[] args) + { + return await Task.FromResult(0); + } +} + +public class PartOnePuzzleSolver +{ + +} + +public class PuzzleParser +{ + public Cube ParseCube(string cubeString) + { + var parts = cubeString.Split(' '); + var count = int.Parse(parts[0]); + var color = Enum.Parse(parts[1], true); + + return new() + { + Count = count, + Color = color + }; + } + + public Result ParseResult(string resultString) + { + var cubes = resultString + .Split(',') + .Select(s => s.Trim()) + .Select(ParseCube) + .ToList(); + + return new() + { + Cubes = cubes + }; + } + + public Game ParseGame(string gameString) + { + var parts = gameString.Split(':'); + var gameId = int.Parse(parts[0].Split(' ')[1]); + var results = parts[1] + .Split(';') + .Select(s => s.Trim()) + .Select(ParseResult) + .ToList(); + + return new() + { + Id = gameId, + Results = results + }; + } +} + +public class Game +{ + public int Id { get; set; } + public List Results { get; set; } = []; +} + +public class Result +{ + public List Cubes { get; set; } = []; +} + +public class Cube +{ + public int Count { get; set; } + public CubeColor Color { get; set; } +} + +public enum CubeColor +{ + Red, + Green, + Blue +} \ No newline at end of file diff --git a/02/SCRATCH.md b/02/SCRATCH.md new file mode 100644 index 0000000..8a7389e --- /dev/null +++ b/02/SCRATCH.md @@ -0,0 +1,75 @@ +# Notes + +## Constraints + +### Total number of cubes: 39 + +The elf can't show me more than 39 dice at a time. + +### Total number of each cube type: 12 red, 13 green, 14 blue + +The elf can't show me more than 12 red cubes at a time. +The elf can't show me more than 13 green cubes at a time. +The elf can't show me more than 14 blue cubes at a time. + +### Types of cubes: red, green, blue + +The elf can only show me red, green, or blue cubes. +The elf though can show me any combination of red, green, or blue cubes including none of a particular color or all of a particular color. + +## Structure + +Each game is a line of text. +Each game is delimited by "Game N: " where N is the game id. +Each game consists of a semi-colon delimited list of sets of cubes. +Each set of cubes is a comma delimited list of the number of cubes and the color of the cubes. + +```text +Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green +``` + +❓ How would I model this? + +```csharp +class Game +{ + public int Id { get; set; } + public List Results { get; set; } +} + +class Results +{ + public List Cubes { get; set; } +} + +class Cube +{ + public int Count { get; set; } + public CubeColor Color { get; set; } +} + +enum CubeColor +{ + Red, + Green, + Blue +} +``` + +## Problems + +### Problem 1 + +πŸ”΄ Need to determine which results are possible given the known # of cubes and known # of cubes for each color. + +### Problem 2 + +πŸ”΄ Need to determine if all the results for a given game are possible + +### Problem 3 + +πŸ”΄ Need to determine the sum of the game ids for all the possible games + +### Problem 4 + +πŸ”΄ Need to determine the sum of the game ids for all the possible games diff --git a/README.md b/README.md index 8ee50d1..dac8b30 100644 --- a/README.md +++ b/README.md @@ -4,30 +4,30 @@ This repository contains my solutions for the [Advent of Code 2023](https://adve ## Challenges -| Day | Problem | Solution | Status | Notes | -| --- | -------------------------- | :---------------------------------------: | :----------------------: | ------------------------------------------------------------------- | -| 01 | [Problem](./01/PROBLEM.md) | [Solution](./01/Trebuchet/Program.cs) | :white_check_mark: | The trickiest part here was accounting for overlapping digit words. | -| 02 | [Problem](./02/PROBLEM.md) | [Solution](./02/CubeConundrum/Program.cs) | :hourglass_flowing_sand: | -| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/) | :hourglass_flowing_sand: | -| 04 | [Problem](./04/PROBLEM.md) | [Solution](./04/) | :hourglass_flowing_sand: | -| 05 | [Problem](./05/PROBLEM.md) | [Solution](./05/) | :hourglass_flowing_sand: | -| 06 | [Problem](./06/PROBLEM.md) | [Solution](./06/) | :hourglass_flowing_sand: | -| 07 | [Problem](./07/PROBLEM.md) | [Solution](./07/) | :hourglass_flowing_sand: | -| 08 | [Problem](./08/PROBLEM.md) | [Solution](./08/) | :hourglass_flowing_sand: | -| 09 | [Problem](./09/PROBLEM.md) | [Solution](./09/) | :hourglass_flowing_sand: | -| 10 | [Problem](./10/PROBLEM.md) | [Solution](./10/) | :hourglass_flowing_sand: | -| 11 | [Problem](./11/PROBLEM.md) | [Solution](./11/) | :hourglass_flowing_sand: | -| 12 | [Problem](./12/PROBLEM.md) | [Solution](./12/) | :hourglass_flowing_sand: | -| 13 | [Problem](./13/PROBLEM.md) | [Solution](./13/) | :hourglass_flowing_sand: | -| 14 | [Problem](./14/PROBLEM.md) | [Solution](./14/) | :hourglass_flowing_sand: | -| 15 | [Problem](./15/PROBLEM.md) | [Solution](./15/) | :hourglass_flowing_sand: | -| 16 | [Problem](./16/PROBLEM.md) | [Solution](./16/) | :hourglass_flowing_sand: | -| 17 | [Problem](./17/PROBLEM.md) | [Solution](./17/) | :hourglass_flowing_sand: | -| 18 | [Problem](./18/PROBLEM.md) | [Solution](./18/) | :hourglass_flowing_sand: | -| 19 | [Problem](./19/PROBLEM.md) | [Solution](./19/) | :hourglass_flowing_sand: | -| 20 | [Problem](./20/PROBLEM.md) | [Solution](./20/) | :hourglass_flowing_sand: | -| 21 | [Problem](./21/PROBLEM.md) | [Solution](./21/) | :hourglass_flowing_sand: | -| 22 | [Problem](./22/PROBLEM.md) | [Solution](./22/) | :hourglass_flowing_sand: | -| 23 | [Problem](./23/PROBLEM.md) | [Solution](./23/) | :hourglass_flowing_sand: | -| 24 | [Problem](./24/PROBLEM.md) | [Solution](./24/) | :hourglass_flowing_sand: | -| 25 | [Problem](./25/PROBLEM.md) | [Solution](./25/) | :hourglass_flowing_sand: | +| Day | Problem | Solution | Status | Notes | +| --- | -------------------------- | :---------------------------------------: | :----: | ------------------------------------------------------------------- | +| 01 | [Problem](./01/PROBLEM.md) | [Solution](./01/Trebuchet/Program.cs) | βœ… | The trickiest part here was accounting for overlapping digit words. | +| 02 | [Problem](./02/PROBLEM.md) | [Solution](./02/CubeConundrum/Program.cs) | βŒ› | +| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/) | βŒ› | +| 04 | [Problem](./04/PROBLEM.md) | [Solution](./04/) | βŒ› | +| 05 | [Problem](./05/PROBLEM.md) | [Solution](./05/) | βŒ› | +| 06 | [Problem](./06/PROBLEM.md) | [Solution](./06/) | βŒ› | +| 07 | [Problem](./07/PROBLEM.md) | [Solution](./07/) | βŒ› | +| 08 | [Problem](./08/PROBLEM.md) | [Solution](./08/) | βŒ› | +| 09 | [Problem](./09/PROBLEM.md) | [Solution](./09/) | βŒ› | +| 10 | [Problem](./10/PROBLEM.md) | [Solution](./10/) | βŒ› | +| 11 | [Problem](./11/PROBLEM.md) | [Solution](./11/) | βŒ› | +| 12 | [Problem](./12/PROBLEM.md) | [Solution](./12/) | βŒ› | +| 13 | [Problem](./13/PROBLEM.md) | [Solution](./13/) | βŒ› | +| 14 | [Problem](./14/PROBLEM.md) | [Solution](./14/) | βŒ› | +| 15 | [Problem](./15/PROBLEM.md) | [Solution](./15/) | βŒ› | +| 16 | [Problem](./16/PROBLEM.md) | [Solution](./16/) | βŒ› | +| 17 | [Problem](./17/PROBLEM.md) | [Solution](./17/) | βŒ› | +| 18 | [Problem](./18/PROBLEM.md) | [Solution](./18/) | βŒ› | +| 19 | [Problem](./19/PROBLEM.md) | [Solution](./19/) | βŒ› | +| 20 | [Problem](./20/PROBLEM.md) | [Solution](./20/) | βŒ› | +| 21 | [Problem](./21/PROBLEM.md) | [Solution](./21/) | βŒ› | +| 22 | [Problem](./22/PROBLEM.md) | [Solution](./22/) | βŒ› | +| 23 | [Problem](./23/PROBLEM.md) | [Solution](./23/) | βŒ› | +| 24 | [Problem](./24/PROBLEM.md) | [Solution](./24/) | βŒ› | +| 25 | [Problem](./25/PROBLEM.md) | [Solution](./25/) | βŒ› |