feat: create parser to parse game into model
This commit is contained in:
@@ -36,6 +36,6 @@ public class PartTwoPuzzleSolverTests
|
|||||||
{
|
{
|
||||||
var input = await File.ReadAllLinesAsync("INPUT.txt");
|
var input = await File.ReadAllLinesAsync("INPUT.txt");
|
||||||
var result = _sut.SumCalibrationValues(input);
|
var result = _sut.SumCalibrationValues(input);
|
||||||
result.Should().BeLessThan(54249);
|
result.Should().Be(54249);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1 +1,2 @@
|
|||||||
global using Xunit;
|
global using Xunit;
|
||||||
|
global using FluentAssertions;
|
||||||
@@ -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<object[]> CubeStrings = new List<object[]>
|
||||||
|
{
|
||||||
|
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<object[]> ResultStrings = new List<object[]>
|
||||||
|
{
|
||||||
|
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<object[]> GameStrings = new List<object[]>
|
||||||
|
{
|
||||||
|
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 }
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
namespace CubeConundrum.Tests;
|
|
||||||
|
|
||||||
public class UnitTest1
|
|
||||||
{
|
|
||||||
[Fact]
|
|
||||||
public void Test1()
|
|
||||||
{
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,2 +1,85 @@
|
|||||||
// See https://aka.ms/new-console-template for more information
|
namespace CubeConundrum;
|
||||||
Console.WriteLine("Hello, World!");
|
|
||||||
|
public class Program
|
||||||
|
{
|
||||||
|
public async static Task<int> 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<CubeColor>(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<Result> Results { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Result
|
||||||
|
{
|
||||||
|
public List<Cube> Cubes { get; set; } = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
public class Cube
|
||||||
|
{
|
||||||
|
public int Count { get; set; }
|
||||||
|
public CubeColor Color { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum CubeColor
|
||||||
|
{
|
||||||
|
Red,
|
||||||
|
Green,
|
||||||
|
Blue
|
||||||
|
}
|
||||||
@@ -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> Results { get; set; }
|
||||||
|
}
|
||||||
|
|
||||||
|
class Results
|
||||||
|
{
|
||||||
|
public List<Cube> 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
|
||||||
@@ -5,29 +5,29 @@ This repository contains my solutions for the [Advent of Code 2023](https://adve
|
|||||||
## Challenges
|
## Challenges
|
||||||
|
|
||||||
| Day | Problem | Solution | Status | Notes |
|
| 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. |
|
| 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) | :hourglass_flowing_sand: |
|
| 02 | [Problem](./02/PROBLEM.md) | [Solution](./02/CubeConundrum/Program.cs) | ⌛ |
|
||||||
| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/) | :hourglass_flowing_sand: |
|
| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/) | ⌛ |
|
||||||
| 04 | [Problem](./04/PROBLEM.md) | [Solution](./04/) | :hourglass_flowing_sand: |
|
| 04 | [Problem](./04/PROBLEM.md) | [Solution](./04/) | ⌛ |
|
||||||
| 05 | [Problem](./05/PROBLEM.md) | [Solution](./05/) | :hourglass_flowing_sand: |
|
| 05 | [Problem](./05/PROBLEM.md) | [Solution](./05/) | ⌛ |
|
||||||
| 06 | [Problem](./06/PROBLEM.md) | [Solution](./06/) | :hourglass_flowing_sand: |
|
| 06 | [Problem](./06/PROBLEM.md) | [Solution](./06/) | ⌛ |
|
||||||
| 07 | [Problem](./07/PROBLEM.md) | [Solution](./07/) | :hourglass_flowing_sand: |
|
| 07 | [Problem](./07/PROBLEM.md) | [Solution](./07/) | ⌛ |
|
||||||
| 08 | [Problem](./08/PROBLEM.md) | [Solution](./08/) | :hourglass_flowing_sand: |
|
| 08 | [Problem](./08/PROBLEM.md) | [Solution](./08/) | ⌛ |
|
||||||
| 09 | [Problem](./09/PROBLEM.md) | [Solution](./09/) | :hourglass_flowing_sand: |
|
| 09 | [Problem](./09/PROBLEM.md) | [Solution](./09/) | ⌛ |
|
||||||
| 10 | [Problem](./10/PROBLEM.md) | [Solution](./10/) | :hourglass_flowing_sand: |
|
| 10 | [Problem](./10/PROBLEM.md) | [Solution](./10/) | ⌛ |
|
||||||
| 11 | [Problem](./11/PROBLEM.md) | [Solution](./11/) | :hourglass_flowing_sand: |
|
| 11 | [Problem](./11/PROBLEM.md) | [Solution](./11/) | ⌛ |
|
||||||
| 12 | [Problem](./12/PROBLEM.md) | [Solution](./12/) | :hourglass_flowing_sand: |
|
| 12 | [Problem](./12/PROBLEM.md) | [Solution](./12/) | ⌛ |
|
||||||
| 13 | [Problem](./13/PROBLEM.md) | [Solution](./13/) | :hourglass_flowing_sand: |
|
| 13 | [Problem](./13/PROBLEM.md) | [Solution](./13/) | ⌛ |
|
||||||
| 14 | [Problem](./14/PROBLEM.md) | [Solution](./14/) | :hourglass_flowing_sand: |
|
| 14 | [Problem](./14/PROBLEM.md) | [Solution](./14/) | ⌛ |
|
||||||
| 15 | [Problem](./15/PROBLEM.md) | [Solution](./15/) | :hourglass_flowing_sand: |
|
| 15 | [Problem](./15/PROBLEM.md) | [Solution](./15/) | ⌛ |
|
||||||
| 16 | [Problem](./16/PROBLEM.md) | [Solution](./16/) | :hourglass_flowing_sand: |
|
| 16 | [Problem](./16/PROBLEM.md) | [Solution](./16/) | ⌛ |
|
||||||
| 17 | [Problem](./17/PROBLEM.md) | [Solution](./17/) | :hourglass_flowing_sand: |
|
| 17 | [Problem](./17/PROBLEM.md) | [Solution](./17/) | ⌛ |
|
||||||
| 18 | [Problem](./18/PROBLEM.md) | [Solution](./18/) | :hourglass_flowing_sand: |
|
| 18 | [Problem](./18/PROBLEM.md) | [Solution](./18/) | ⌛ |
|
||||||
| 19 | [Problem](./19/PROBLEM.md) | [Solution](./19/) | :hourglass_flowing_sand: |
|
| 19 | [Problem](./19/PROBLEM.md) | [Solution](./19/) | ⌛ |
|
||||||
| 20 | [Problem](./20/PROBLEM.md) | [Solution](./20/) | :hourglass_flowing_sand: |
|
| 20 | [Problem](./20/PROBLEM.md) | [Solution](./20/) | ⌛ |
|
||||||
| 21 | [Problem](./21/PROBLEM.md) | [Solution](./21/) | :hourglass_flowing_sand: |
|
| 21 | [Problem](./21/PROBLEM.md) | [Solution](./21/) | ⌛ |
|
||||||
| 22 | [Problem](./22/PROBLEM.md) | [Solution](./22/) | :hourglass_flowing_sand: |
|
| 22 | [Problem](./22/PROBLEM.md) | [Solution](./22/) | ⌛ |
|
||||||
| 23 | [Problem](./23/PROBLEM.md) | [Solution](./23/) | :hourglass_flowing_sand: |
|
| 23 | [Problem](./23/PROBLEM.md) | [Solution](./23/) | ⌛ |
|
||||||
| 24 | [Problem](./24/PROBLEM.md) | [Solution](./24/) | :hourglass_flowing_sand: |
|
| 24 | [Problem](./24/PROBLEM.md) | [Solution](./24/) | ⌛ |
|
||||||
| 25 | [Problem](./25/PROBLEM.md) | [Solution](./25/) | :hourglass_flowing_sand: |
|
| 25 | [Problem](./25/PROBLEM.md) | [Solution](./25/) | ⌛ |
|
||||||
|
|||||||
Reference in New Issue
Block a user