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