Finished
This commit is contained in:
parent
e487452b18
commit
0e72a5eb05
9 changed files with 146 additions and 57 deletions
|
|
@ -8,8 +8,7 @@ namespace Numbers.NumberFactory;
|
|||
/// <inheritdoc cref="INumbers" />
|
||||
public abstract class AbstractNumbers : INumbers
|
||||
{
|
||||
// TODO
|
||||
// private readonly List<long> _list;
|
||||
private readonly List<long> _list;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of <see cref="AbstractNumbers" /> with the given bounds.
|
||||
|
|
@ -19,15 +18,22 @@ public abstract class AbstractNumbers : INumbers
|
|||
/// <param name="upperBound">Upper bound of the number range</param>
|
||||
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<long> GetEnumerator() => new NumbersEnumerator(_list);
|
||||
|
||||
public IEnumerator<long> 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
|
|
@ -16,8 +16,19 @@ public static class Factory
|
|||
/// <returns>Appropriate instance or null if requested type is unknown</returns>
|
||||
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!;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
|
|||
/// <inheritdoc cref="AbstractNumbers" />
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
|
|||
/// <inheritdoc cref="AbstractNumbers" />
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,5 +6,30 @@ namespace Numbers.NumberFactory.NumberImpls;
|
|||
/// <inheritdoc cref="AbstractNumbers" />
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -6,5 +6,5 @@ namespace Numbers.NumberFactory.NumberImpls;
|
|||
/// <inheritdoc cref="AbstractNumbers" />
|
||||
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;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -14,26 +14,44 @@ public sealed class NumbersEnumerator : IEnumerator<long>
|
|||
/// <param name="list">List to iterate over</param>
|
||||
public NumbersEnumerator(List<long> list)
|
||||
{
|
||||
// TODO
|
||||
List = null!;
|
||||
List = list;
|
||||
Index = -1;
|
||||
}
|
||||
|
||||
private int Index { get; set; }
|
||||
private List<long> 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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -8,9 +8,8 @@ namespace Numbers.NumberString;
|
|||
/// <inheritdoc cref="IEnumerator{T}"/>
|
||||
public sealed class DigitEnumerator : IEnumerator<int>
|
||||
{
|
||||
// TODO
|
||||
// private readonly string _text;
|
||||
// private int _index;
|
||||
private readonly string _text;
|
||||
private int _index;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of <see cref="DigitEnumerator"/> based on the given text.
|
||||
|
|
@ -19,35 +18,42 @@ public sealed class DigitEnumerator : IEnumerator<int>
|
|||
/// <param name="text">The text to iterate over (containing both letters and digits)</param>
|
||||
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() { }
|
||||
}
|
||||
|
|
|
|||
|
|
@ -9,9 +9,8 @@ namespace Numbers.NumberString;
|
|||
/// <inheritdoc cref="IComparable{T}" />
|
||||
public sealed class NumberString : IEnumerable<int>, IComparable<NumberString>
|
||||
{
|
||||
// TODO
|
||||
// private readonly string _text;
|
||||
// private int? _numericValue;
|
||||
private readonly string _text;
|
||||
private int? _numericValue;
|
||||
|
||||
/// <summary>
|
||||
/// Creates a new instance of <see cref="NumberString" /> based on the given text.
|
||||
|
|
@ -20,13 +19,15 @@ public sealed class NumberString : IEnumerable<int>, IComparable<NumberString>
|
|||
/// <param name="text">A string containing digits and letters</param>
|
||||
public NumberString(string text)
|
||||
{
|
||||
// TODO
|
||||
_text = text;
|
||||
string digitsOnly = new string(text.Where(char.IsDigit).ToArray());
|
||||
_numericValue = digitsOnly.Length > 0 ? int.Parse(digitsOnly) : 0;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Gets the numeric value contained in the number string
|
||||
/// </summary>
|
||||
public int NumericValue => -1; // TODO
|
||||
public int NumericValue => _numericValue ?? 0;
|
||||
|
||||
/// <summary>
|
||||
/// Gets the digit at the given index.
|
||||
|
|
@ -37,30 +38,47 @@ public sealed class NumberString : IEnumerable<int>, IComparable<NumberString>
|
|||
{
|
||||
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<int> GetEnumerator() => null!; // TODO
|
||||
public IEnumerator<int> 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);
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue