Introduce regex-based methods `SolvePart1Regex` and `SolvePart2Regex` in Day02 for another invalid ID detection

This commit is contained in:
Sebastian Lindemeier 2025-12-12 20:37:31 +01:00
parent 024eb77fbe
commit bef54ff551
2 changed files with 74 additions and 2 deletions

View File

@ -29,6 +29,22 @@ public class Day02Test
Assert.Equal(13919717792, actual); Assert.Equal(13919717792, actual);
} }
[Fact]
public void Part01Regex_Test_equals_4174379265()
{
var actual = (_sut as Day02).SolvePart1Regex(TestInputPath);
Assert.Equal(1227775554, actual);
}
[Fact]
public void Part01Regex_Prod_equals_14582313461()
{
var actual = (_sut as Day02).SolvePart1Regex(ProdInputPath);
Assert.Equal(13919717792, actual);
}
[Fact] [Fact]
public void Part02_Test_equals_4174379265() public void Part02_Test_equals_4174379265()
{ {
@ -44,4 +60,20 @@ public class Day02Test
Assert.Equal(14582313461, actual); Assert.Equal(14582313461, actual);
} }
[Fact]
public void Part02Regex_Test_equals_4174379265()
{
var actual = (_sut as Day02).SolvePart2Regex(TestInputPath);
Assert.Equal(4174379265, actual);
}
[Fact]
public void Part02Regex_Prod_equals_14582313461()
{
var actual = (_sut as Day02).SolvePart2Regex(ProdInputPath);
Assert.Equal(14582313461, actual);
}
} }

View File

@ -1,8 +1,9 @@
using AdvenOfCode.Contracts; using System.Text.RegularExpressions;
using AdvenOfCode.Contracts;
namespace AoC_2025; namespace AoC_2025;
public class Day02 : IPuzzleSolver<long> public partial class Day02 : IPuzzleSolver<long>
{ {
private string[] ParsePuzzleInput(string path) private string[] ParsePuzzleInput(string path)
{ {
@ -20,6 +21,14 @@ public class Day02 : IPuzzleSolver<long>
return sum; return sum;
} }
public long SolvePart1Regex(string pathToPuzzleInput)
{
var idRanges = ParsePuzzleInput(pathToPuzzleInput);
var invalidIds = idRanges.SelectMany(range => FindInvalidIdsRegex(range));
var sum = invalidIds.Sum();
return sum;
}
public long SolvePart2(string pathToPuzzleInput) public long SolvePart2(string pathToPuzzleInput)
{ {
var idRanges = ParsePuzzleInput(pathToPuzzleInput); var idRanges = ParsePuzzleInput(pathToPuzzleInput);
@ -28,6 +37,14 @@ public class Day02 : IPuzzleSolver<long>
return sum; return sum;
} }
public long SolvePart2Regex(string pathToPuzzleInput)
{
var idRanges = ParsePuzzleInput(pathToPuzzleInput);
var invalidIds = idRanges.SelectMany(range => FindInvalidSegmentedIdsRegex(range));
var sum = invalidIds.Sum();
return sum;
}
private IEnumerable<long> FindInvalidIds(string range) private IEnumerable<long> FindInvalidIds(string range)
{ {
var (start, end) = Parse(range); var (start, end) = Parse(range);
@ -36,6 +53,24 @@ public class Day02 : IPuzzleSolver<long>
return invalidIds; return invalidIds;
} }
private IEnumerable<long> FindInvalidIdsRegex(string range)
{
return FindAllInvalidIds(range, RepeatedInputRegex());
}
private IEnumerable<long> FindInvalidSegmentedIdsRegex(string range)
{
return FindAllInvalidIds(range, SegmentRepeatedInputRegex());
}
private IEnumerable<long> FindAllInvalidIds(string range, Regex regex)
{
var (start, end) = Parse(range);
var invalidIds = Range(start, end)
.Where(id => regex.IsMatch(id.ToString()));
return invalidIds;
}
private IEnumerable<long> FindInvalidSegmentedIds(string range) private IEnumerable<long> FindInvalidSegmentedIds(string range)
{ {
var (start, end) = Parse(range); var (start, end) = Parse(range);
@ -128,4 +163,9 @@ public class Day02 : IPuzzleSolver<long>
(tuple, segment) => (tuple.allEqual && (tuple.prev == "" || tuple.prev == segment), segment)); (tuple, segment) => (tuple.allEqual && (tuple.prev == "" || tuple.prev == segment), segment));
return allEqual; return allEqual;
} }
[GeneratedRegex(@"^(.+)\1+$")]
private static partial Regex SegmentRepeatedInputRegex();
[GeneratedRegex(@"^(.+)\1$")]
private static partial Regex RepeatedInputRegex();
} }