diff --git a/Numbers/NumberFactory/AbstractNumbers.cs b/Numbers/NumberFactory/AbstractNumbers.cs
index 0c5a724..aa4e84e 100644
--- a/Numbers/NumberFactory/AbstractNumbers.cs
+++ b/Numbers/NumberFactory/AbstractNumbers.cs
@@ -8,8 +8,7 @@ namespace Numbers.NumberFactory;
///
public abstract class AbstractNumbers : INumbers
{
- // TODO
- // private readonly List _list;
+ private readonly List _list;
///
/// Creates a new instance of with the given bounds.
@@ -19,15 +18,22 @@ public abstract class AbstractNumbers : INumbers
/// Upper bound of the number range
protected AbstractNumbers(long lowerBound, long upperBound)
{
- // TODO
+ LowerBound = lowerBound;
+ UpperBound = upperBound;
+ _list = [];
+ GenerateNumbers();
}
public long this[int index]
{
get
{
- // TODO
- return -1L;
+ if (index < 0 || index >= _list.Count)
+ {
+ return -1;
+ }
+
+ return _list[index];
}
}
@@ -35,15 +41,20 @@ public abstract class AbstractNumbers : INumbers
public long UpperBound { get; }
- public int Length => -1; // TODO
+ public int Length => _list.Count;
+ public IEnumerator GetEnumerator() => new NumbersEnumerator(_list);
- public IEnumerator GetEnumerator() => null!; // TODO
-
- IEnumerator IEnumerable.GetEnumerator() => null!; // TODO
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
private void GenerateNumbers()
{
- // TODO
+ for (var i = LowerBound; i <= UpperBound; i++)
+ {
+ if (PickNumber(i))
+ {
+ _list.Add(i);
+ }
+ }
}
///
diff --git a/Numbers/NumberFactory/Factory.cs b/Numbers/NumberFactory/Factory.cs
index 8cd0757..643fc67 100644
--- a/Numbers/NumberFactory/Factory.cs
+++ b/Numbers/NumberFactory/Factory.cs
@@ -16,8 +16,19 @@ public static class Factory
/// Appropriate instance or null if requested type is unknown
public static INumbers Create(NumberType type, long lowerBound, long upperBound)
{
- // TODO
- return null!;
+ switch (type)
+ {
+ case NumberType.Even:
+ return new EvenNumbers(lowerBound, upperBound);
+ case NumberType.Odd:
+ return new OddNumbers(lowerBound, upperBound);
+ case NumberType.Prime:
+ return new PrimeNumbers(lowerBound, upperBound);
+ case NumberType.Square:
+ return new SquareNumbers(lowerBound, upperBound);
+ default:
+ return null!;
+ }
}
}
diff --git a/Numbers/NumberFactory/NumberImpls/EvenNumbers.cs b/Numbers/NumberFactory/NumberImpls/EvenNumbers.cs
index c53359a..58bfe90 100644
--- a/Numbers/NumberFactory/NumberImpls/EvenNumbers.cs
+++ b/Numbers/NumberFactory/NumberImpls/EvenNumbers.cs
@@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
///
public sealed class EvenNumbers(long lowerBound, long upperBound) : AbstractNumbers(lowerBound, upperBound)
{
- protected override bool PickNumber(long number) => false; // TODO
+ protected override bool PickNumber(long number) => number % 2 == 0;
}
diff --git a/Numbers/NumberFactory/NumberImpls/OddNumbers.cs b/Numbers/NumberFactory/NumberImpls/OddNumbers.cs
index 6378f98..59eb2cf 100644
--- a/Numbers/NumberFactory/NumberImpls/OddNumbers.cs
+++ b/Numbers/NumberFactory/NumberImpls/OddNumbers.cs
@@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
///
public sealed class OddNumbers(long lowerBound, long upperBound) : AbstractNumbers(lowerBound, upperBound)
{
- protected override bool PickNumber(long number) => false; // TODO
+ protected override bool PickNumber(long number) => number % 2 != 0;
}
diff --git a/Numbers/NumberFactory/NumberImpls/PrimeNumbers.cs b/Numbers/NumberFactory/NumberImpls/PrimeNumbers.cs
index 02fc1d3..4d936d8 100644
--- a/Numbers/NumberFactory/NumberImpls/PrimeNumbers.cs
+++ b/Numbers/NumberFactory/NumberImpls/PrimeNumbers.cs
@@ -6,5 +6,30 @@ namespace Numbers.NumberFactory.NumberImpls;
///
public sealed class PrimeNumbers(long lowerBound, long upperBound) : AbstractNumbers(lowerBound, upperBound)
{
- protected override bool PickNumber(long number) => false; // TODO
+ protected override bool PickNumber(long number)
+ {
+ if (number < 2)
+ {
+ return false;
+ }
+ if (number == 2)
+ {
+ return true;
+ }
+ if (number % 2 == 0)
+ {
+ return false;
+ }
+
+ long sqrtNum = (long)Math.Sqrt(number);
+ for (int i = 3; i <= sqrtNum; i += 2)
+ {
+ if (number % i == 0)
+ {
+ return false;
+ }
+ }
+
+ return true;
+ }
}
diff --git a/Numbers/NumberFactory/NumberImpls/SquareNumbers.cs b/Numbers/NumberFactory/NumberImpls/SquareNumbers.cs
index f023fa9..f316073 100644
--- a/Numbers/NumberFactory/NumberImpls/SquareNumbers.cs
+++ b/Numbers/NumberFactory/NumberImpls/SquareNumbers.cs
@@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
///
public sealed class SquareNumbers(long lowerBound, long upperBound) : AbstractNumbers(lowerBound, upperBound)
{
- protected override bool PickNumber(long number) => false; // TODO
+ protected override bool PickNumber(long number) => Math.Sqrt(number) % 1 == 0;
}
diff --git a/Numbers/NumberFactory/NumbersEnumerator.cs b/Numbers/NumberFactory/NumbersEnumerator.cs
index 7f0f4df..6d0b3bc 100644
--- a/Numbers/NumberFactory/NumbersEnumerator.cs
+++ b/Numbers/NumberFactory/NumbersEnumerator.cs
@@ -14,26 +14,44 @@ public sealed class NumbersEnumerator : IEnumerator
/// List to iterate over
public NumbersEnumerator(List list)
{
- // TODO
- List = null!;
+ List = list;
+ Index = -1;
}
private int Index { get; set; }
private List List { get; }
- public long Current => -1L; // TODO
-
- public void Dispose()
+ public long Current
{
- // TODO?
+ get
+ {
+ if (Index < 0 || Index >= List.Count)
+ {
+ return -1;
+ }
+
+ return List[Index];
+ }
}
- object IEnumerator.Current => null!; // TODO
+ public void Dispose() { }
- public bool MoveNext() => false; // TODO
+ object IEnumerator.Current => Current;
+
+ public bool MoveNext()
+ {
+ if (Index >= List.Count - 1)
+ {
+ return false;
+ }
+
+ Index++;
+ return true;
+
+ }
public void Reset()
{
- // TODO
+ Index = -1;
}
}
diff --git a/Numbers/NumberString/DigitEnumerator.cs b/Numbers/NumberString/DigitEnumerator.cs
index d08bc0f..fda90e3 100644
--- a/Numbers/NumberString/DigitEnumerator.cs
+++ b/Numbers/NumberString/DigitEnumerator.cs
@@ -8,9 +8,8 @@ namespace Numbers.NumberString;
///
public sealed class DigitEnumerator : IEnumerator
{
- // TODO
- // private readonly string _text;
- // private int _index;
+ private readonly string _text;
+ private int _index;
///
/// Creates a new instance of based on the given text.
@@ -19,35 +18,42 @@ public sealed class DigitEnumerator : IEnumerator
/// The text to iterate over (containing both letters and digits)
public DigitEnumerator(string text)
{
- // TODO
+ _text = text;
+ _index = -1;
}
public bool MoveNext()
{
- // TODO
+ while (++_index < _text.Length)
+ {
+ if (char.IsDigit(_text[_index]))
+ {
+ return true;
+ }
+ }
return false;
}
public void Reset()
{
- // TODO
+ _index = -1;
}
public int Current
{
get
{
- // TODO
- return -1;
-
- //static int GetDigit(char c) => c - '0';
+ if (_index < 0 || _index >= _text.Length || !char.IsDigit(_text[_index]))
+ {
+ return -1;
+ }
+
+ return GetDigit(_text[_index]);
+ static int GetDigit(char c) => c - '0';
}
}
- object IEnumerator.Current => null!; // TODO
+ object IEnumerator.Current => Current;
- public void Dispose()
- {
- // TODO?
- }
+ public void Dispose() { }
}
diff --git a/Numbers/NumberString/NumberString.cs b/Numbers/NumberString/NumberString.cs
index 6377f73..ddbc8e7 100644
--- a/Numbers/NumberString/NumberString.cs
+++ b/Numbers/NumberString/NumberString.cs
@@ -9,9 +9,8 @@ namespace Numbers.NumberString;
///
public sealed class NumberString : IEnumerable, IComparable
{
- // TODO
- // private readonly string _text;
- // private int? _numericValue;
+ private readonly string _text;
+ private int? _numericValue;
///
/// Creates a new instance of based on the given text.
@@ -20,13 +19,15 @@ public sealed class NumberString : IEnumerable, IComparable
/// A string containing digits and letters
public NumberString(string text)
{
- // TODO
+ _text = text;
+ string digitsOnly = new string(text.Where(char.IsDigit).ToArray());
+ _numericValue = digitsOnly.Length > 0 ? int.Parse(digitsOnly) : 0;
}
///
/// Gets the numeric value contained in the number string
///
- public int NumericValue => -1; // TODO
+ public int NumericValue => _numericValue ?? 0;
///
/// Gets the digit at the given index.
@@ -37,30 +38,47 @@ public sealed class NumberString : IEnumerable, IComparable
{
get
{
- // TODO
- return -1;
+ string numberString = _numericValue.HasValue ? _numericValue.Value.ToString() : string.Empty;
+ if (index < 0 || index >= numberString.Length || numberString == string.Empty)
+ {
+ return -1;
+ }
+ return GetDigit(numberString[index]);
+ static int GetDigit(char c) => c - '0';
}
}
- public int CompareTo(NumberString? other) => -1; // TODO
+ public int CompareTo(NumberString? other)
+ {
+ if (ReferenceEquals(this, other))
+ {
+ return 1;
+ }
+
+ return NumericValue.CompareTo(other?.NumericValue);
+ }
- public IEnumerator GetEnumerator() => null!; // TODO
+ public IEnumerator GetEnumerator() => new DigitEnumerator(_text);
- IEnumerator IEnumerable.GetEnumerator() => null!; // TODO
+ IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
public override bool Equals(object? obj)
{
- // TODO
- return false;
+ if (obj is not NumberString numberString)
+ {
+ return false;
+ }
+
+ return numberString._numericValue == _numericValue;
}
- public override int GetHashCode() => -1; // TODO
+ public override int GetHashCode() => _numericValue?.GetHashCode() ?? 0;
- public static bool operator >(NumberString a, NumberString b) => false; // TODO
+ public static bool operator >(NumberString a, NumberString b) => a.CompareTo(b) > 0;
- public static bool operator <(NumberString a, NumberString b) => false; // TODO
+ public static bool operator <(NumberString a, NumberString b) => a.CompareTo(b) < 0;
- public static bool operator ==(NumberString a, NumberString b) => false; // TODO
+ public static bool operator ==(NumberString a, NumberString b) => a?.Equals(b) ?? ReferenceEquals(b, null);
- public static bool operator !=(NumberString a, NumberString b) => false; // TODO
+ public static bool operator !=(NumberString a, NumberString b) => !(a == b);
}