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); }