docs: add xml comments

This commit is contained in:
Stevan Freeborn
2023-12-03 23:03:46 -06:00
parent 19c35bc946
commit 9a29e0f5c6
6 changed files with 74 additions and 5 deletions
+2 -1
View File
@@ -1,2 +1,3 @@
global using Xunit;
global using FluentAssertions;
global using Xunit;
+57
View File
@@ -36,8 +36,16 @@ public class Program
}
}
/// <summary>
/// Solves the puzzle.
/// </summary>
public class PuzzleSolver
{
/// <summary>
/// Sums all part numbers in the schematic.
/// </summary>
/// <param name="schematic">The schematic to parse.</param>
/// <returns>The sum of all part numbers.</returns>
public int SumPartNumbers(string[] schematic)
{
var allPartNumbers = new List<int>();
@@ -54,6 +62,11 @@ public class PuzzleSolver
return allPartNumbers.Sum();
}
/// <summary>
/// Sums all gear ratios in the schematic.
/// </summary>
/// <param name="schematic">The schematic to parse.</param>
/// <returns>The sum of all gear ratios.</returns>
public int SumGearRatios(string[] schematic)
{
var allGearRatios = new List<int>();
@@ -71,17 +84,40 @@ public class PuzzleSolver
}
}
/// <summary>
/// Represents a line in the schematic.
/// </summary>
/// <param name="numbers">The numbers in the line.</param>
/// <param name="specialCharacters">The special characters in the line.</param>
/// <returns>A line in the schematic.</returns>
public class Line(
List<Dictionary<int, Indexes>> numbers,
List<Dictionary<string, Indexes>> specialCharacters
)
{
/// <summary>
/// Gets the numbers in the line.
/// </summary>
public List<Dictionary<int, Indexes>> Numbers { get; init; } = numbers;
/// <summary>
/// Gets the special characters in the line.
/// </summary>
public List<Dictionary<string, Indexes>> SpecialCharacters { get; init; } = specialCharacters;
/// <summary>
/// Gets the indexes of all special characters in the line.
/// </summary>
public List<int> SpecialCharacterIndexes => SpecialCharacters.SelectMany(dict => dict.Values).Select(v => v.Start).ToList();
private bool IsGearCharacter(string character) => character == "*";
/// <summary>
/// Gets the gear ratios in the line.
/// </summary>
/// <param name="previousLine">The previous line in the schematic.</param>
/// <param name="nextLine">The next line in the schematic.</param>
/// <returns>A list of gear ratios.</returns>
public List<int> GetGearRatios(Line? previousLine = null, Line? nextLine = null)
{
var gearRatios = new List<int>();
@@ -125,6 +161,12 @@ public class Line(
return gearRatios;
}
/// <summary>
/// Gets the part numbers in the line.
/// </summary>
/// <param name="previousLine">The previous line in the schematic.</param>
/// <param name="nextLine">The next line in the schematic.</param>
/// <returns>A list of part numbers.</returns>
public List<int> GetPartNumbers(Line? previousLine = null, Line? nextLine = null)
{
var partNumbers = new List<int>();
@@ -156,6 +198,11 @@ public class Line(
return partNumbers;
}
/// <summary>
/// Parses a line in the schematic.
/// </summary>
/// <param name="line">The line to parse.</param>
/// <returns>An instance of <see cref="Line"/>.</returns>
public static Line Parse(string line)
{
var numbers = new List<Dictionary<int, Indexes>>();
@@ -221,8 +268,18 @@ public class Line(
}
}
/// <summary>
/// Represents the start and end indexes of a number or special character.
/// </summary>
public class Indexes(int start, int end)
{
/// <summary>
/// Gets the start index. The start index is the position of the first character in the number or special character.
/// </summary>
public int Start { get; init; } = start;
/// <summary>
/// Gets the end index. The end index is the position of the last character in the number or special character.
/// </summary>
public int End { get; init; } = end;
}
+6 -1
View File
@@ -82,9 +82,14 @@ public class Indexes
Then you see if those numbers are part numbers just by checking if a special character proceeds or follows their start and end indexes.
```csharp
```
If not then you need to see if there is a previous line and whether there is a special character at on the previous line that has an index that is between 1 less than the start index and 1 more than the end index.
If not then you need to see if there is a next line and whether there is a special character at on the next line that has an index that is between 1 less than the start index and 1 more than the end index.
```
Basic approach:
- Parse the current, previous, and next lines into a model that keeps track of the numbers and special characters and their indexes for that line.
- Then each line should be able to evaluate what is a part number or not. Or what is a gear or not given its previous and next lines.
+7 -1
View File
@@ -27,13 +27,19 @@ To run the solutions, navigate to the solution folder and run the following comm
dotnet run -- <path-to-input-file>
```
Or for part 2 solutions
```bash
dotnet run -- <path-to-input-file> part2
```
## Challenges
| Day | Problem | Solution | Status | Notes |
| --- | -------------------------- | :-----------------------------: | :----: | ------------------------------------------------------------------- |
| 01 | [Problem](./01/PROBLEM.md) | [Solution](./01/Trebuchet/) | ✅ | The trickiest part here was accounting for overlapping digit words. |
| 02 | [Problem](./02/PROBLEM.md) | [Solution](./02/CubeConundrum/) | ✅ | The key to me here was to parse the input into a useful model. |
| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/GearRatios/) | |
| 03 | [Problem](./03/PROBLEM.md) | [Solution](./03/GearRatios/) | ✅ | The edge case that got me here was lines ending with a part number. |
| 04 | [Problem](./04/PROBLEM.md) | [Solution](./04/) | ⌛ |
| 05 | [Problem](./05/PROBLEM.md) | [Solution](./05/) | ⌛ |
| 06 | [Problem](./06/PROBLEM.md) | [Solution](./06/) | ⌛ |