From bef54ff55100d7c7860dbc35e98704383f56d76d Mon Sep 17 00:00:00 2001 From: Sebastian Lindemeier Date: Fri, 12 Dec 2025 20:37:31 +0100 Subject: [PATCH] Introduce regex-based methods `SolvePart1Regex` and `SolvePart2Regex` in Day02 for another invalid ID detection --- AoC_2025.Tests/Day02Test.cs | 32 +++++++++++++++++++++++++++ AoC_2025/Day02.cs | 44 +++++++++++++++++++++++++++++++++++-- 2 files changed, 74 insertions(+), 2 deletions(-) diff --git a/AoC_2025.Tests/Day02Test.cs b/AoC_2025.Tests/Day02Test.cs index fce2908..85fb9ff 100644 --- a/AoC_2025.Tests/Day02Test.cs +++ b/AoC_2025.Tests/Day02Test.cs @@ -29,6 +29,22 @@ public class Day02Test 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] public void Part02_Test_equals_4174379265() { @@ -44,4 +60,20 @@ public class Day02Test 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); + } } \ No newline at end of file diff --git a/AoC_2025/Day02.cs b/AoC_2025/Day02.cs index e08cb18..8bbea8a 100644 --- a/AoC_2025/Day02.cs +++ b/AoC_2025/Day02.cs @@ -1,8 +1,9 @@ -using AdvenOfCode.Contracts; +using System.Text.RegularExpressions; +using AdvenOfCode.Contracts; namespace AoC_2025; -public class Day02 : IPuzzleSolver +public partial class Day02 : IPuzzleSolver { private string[] ParsePuzzleInput(string path) { @@ -20,6 +21,14 @@ public class Day02 : IPuzzleSolver 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) { var idRanges = ParsePuzzleInput(pathToPuzzleInput); @@ -27,6 +36,14 @@ public class Day02 : IPuzzleSolver var sum = invalidIds.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 FindInvalidIds(string range) { @@ -36,6 +53,24 @@ public class Day02 : IPuzzleSolver return invalidIds; } + private IEnumerable FindInvalidIdsRegex(string range) + { + return FindAllInvalidIds(range, RepeatedInputRegex()); + } + + private IEnumerable FindInvalidSegmentedIdsRegex(string range) + { + return FindAllInvalidIds(range, SegmentRepeatedInputRegex()); + } + + private IEnumerable 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 FindInvalidSegmentedIds(string range) { var (start, end) = Parse(range); @@ -128,4 +163,9 @@ public class Day02 : IPuzzleSolver (tuple, segment) => (tuple.allEqual && (tuple.prev == "" || tuple.prev == segment), segment)); return allEqual; } + + [GeneratedRegex(@"^(.+)\1+$")] + private static partial Regex SegmentRepeatedInputRegex(); + [GeneratedRegex(@"^(.+)\1$")] + private static partial Regex RepeatedInputRegex(); } \ No newline at end of file