diff --git a/AdventOfCode.HelperClasses.Tests/AdventOfCode.HelperClasses.Tests.csproj b/AdventOfCode.HelperClasses.Tests/AdventOfCode.HelperClasses.Tests.csproj new file mode 100644 index 0000000..280d23c --- /dev/null +++ b/AdventOfCode.HelperClasses.Tests/AdventOfCode.HelperClasses.Tests.csproj @@ -0,0 +1,25 @@ + + + + net9.0 + enable + enable + false + + + + + + + + + + + + + + + + + + diff --git a/AdventOfCode.HelperClasses.Tests/IntegerRangeTests.cs b/AdventOfCode.HelperClasses.Tests/IntegerRangeTests.cs new file mode 100644 index 0000000..6d0e442 --- /dev/null +++ b/AdventOfCode.HelperClasses.Tests/IntegerRangeTests.cs @@ -0,0 +1,60 @@ +namespace AdventOfCode.HelperClasses.Tests; + +public class IntegerRangeTests +{ + private readonly IntegerRange _sut; + public IntegerRangeTests() + { + _sut = new IntegerRange(1, 10); + } + + [Fact] + public void Range1_10_Count_equals_10() + { + var actual = _sut.Count; + + Assert.Equal(10, actual); + } + + [Theory] + [InlineData(10)] + [InlineData(1)] + [InlineData(5)] + public void Range1_10_Contains_data_is_true(int data) + { + var actual = _sut.Contains(data); + + Assert.True(actual); + } + + [Theory] + [InlineData(10)] + [InlineData(1)] + [InlineData(5)] + [InlineData(11)] + [InlineData(20)] + [InlineData(15)] + public void CombinedRange1_20_Contains_data_is_true(int data) + { + var actual = _sut.TryCombine(new IntegerRange(11, 20), out var combined); + Assert.True(actual); + actual = combined.Contains(data); + Assert.True(actual); + } + + [Fact] + public void First_equals_1() + { + var actual = _sut.First(); + + Assert.Equal(1, actual); + } + + [Fact] + public void Last_equals_10() + { + var actual = _sut.Last(); + + Assert.Equal(10, actual); + } +} \ No newline at end of file diff --git a/AdventOfCode.HelperClasses/IntegerRange.cs b/AdventOfCode.HelperClasses/IntegerRange.cs index 59b4d31..c4e8810 100644 --- a/AdventOfCode.HelperClasses/IntegerRange.cs +++ b/AdventOfCode.HelperClasses/IntegerRange.cs @@ -1,21 +1,23 @@ -namespace AdventOfCode.HelperClasses; +using System.Collections; -public record IntegerRange(long start, long end) +namespace AdventOfCode.HelperClasses; + +public record IntegerRange(long start, long end) : IEnumerable { - public long Count() => end - start + 1; + public long Count => end - start + 1; public bool Contains(long number) => start <= number && end >= number; public bool TryCombine(IntegerRange other, out IntegerRange combined) { - if (Contains(other.start)) + if (Contains(other.start) || other.start == end + 1) { var isEndInRange = Contains(other.end); combined = isEndInRange ? this : this with {end = other.end}; return true; } - if (other.Contains(start)) + if (other.Contains(start) || start == other.end + 1) { var isEndInRange = other.Contains(end); combined = isEndInRange ? other : other with {end = end}; @@ -25,4 +27,34 @@ public record IntegerRange(long start, long end) combined = this; return false; } + + public IEnumerator GetEnumerator() => new IntegerRangeEnumerator(start, end); + + IEnumerator IEnumerable.GetEnumerator() => GetEnumerator(); +} + +public record IntegerRangeEnumerator(long start, long end) : IEnumerator +{ + private long _current = start - 1; + + public bool MoveNext() + { + if(_current >= end) return false; + _current++; + return true; + } + + public void Reset() + { + _current = start - 1; + } + + long IEnumerator.Current => _current; + + object? IEnumerator.Current => _current; + + public void Dispose() + { + GC.SuppressFinalize(this); + } } \ No newline at end of file diff --git a/AdventOfCode.sln b/AdventOfCode.sln index 7ca1055..645a128 100644 --- a/AdventOfCode.sln +++ b/AdventOfCode.sln @@ -14,6 +14,8 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode.Extensions", " EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode.HelperClasses", "AdventOfCode.HelperClasses\AdventOfCode.HelperClasses.csproj", "{D47175BB-5AD6-43A8-9287-FF5E6F1816E3}" EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "AdventOfCode.HelperClasses.Tests", "AdventOfCode.HelperClasses.Tests\AdventOfCode.HelperClasses.Tests.csproj", "{3D09528A-09A7-4B0B-9D45-7D3AAB26449A}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -44,6 +46,10 @@ Global {D47175BB-5AD6-43A8-9287-FF5E6F1816E3}.Debug|Any CPU.Build.0 = Debug|Any CPU {D47175BB-5AD6-43A8-9287-FF5E6F1816E3}.Release|Any CPU.ActiveCfg = Release|Any CPU {D47175BB-5AD6-43A8-9287-FF5E6F1816E3}.Release|Any CPU.Build.0 = Release|Any CPU + {3D09528A-09A7-4B0B-9D45-7D3AAB26449A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {3D09528A-09A7-4B0B-9D45-7D3AAB26449A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {3D09528A-09A7-4B0B-9D45-7D3AAB26449A}.Release|Any CPU.ActiveCfg = Release|Any CPU + {3D09528A-09A7-4B0B-9D45-7D3AAB26449A}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(NestedProjects) = preSolution {4F395AE3-DABB-4546-A4D0-5A62425FE168} = {05EBAA1C-B33B-4AFE-8635-A58D7CA509A7} diff --git a/AoC_2025/Day05.cs b/AoC_2025/Day05.cs index a682d0b..5b1d895 100644 --- a/AoC_2025/Day05.cs +++ b/AoC_2025/Day05.cs @@ -106,7 +106,7 @@ public class Day05 : IPuzzleSolver private static IEnumerable CountIdsInRanges(IEnumerable combinedRanges) { - var countIdsInRanges = combinedRanges.Select(range => range.Count()); + var countIdsInRanges = combinedRanges.Select(range => range.Count); return countIdsInRanges; } } \ No newline at end of file