summaryrefslogtreecommitdiff
path: root/DSACore/Auxiliary/Calculator
diff options
context:
space:
mode:
Diffstat (limited to 'DSACore/Auxiliary/Calculator')
-rw-r--r--DSACore/Auxiliary/Calculator/Argument.cs23
-rw-r--r--DSACore/Auxiliary/Calculator/ISolvable.cs4
-rw-r--r--DSACore/Auxiliary/Calculator/Operator.cs18
-rw-r--r--DSACore/Auxiliary/Calculator/Ops.cs4
-rw-r--r--DSACore/Auxiliary/Calculator/StringSolver.cs109
5 files changed, 63 insertions, 95 deletions
diff --git a/DSACore/Auxiliary/Calculator/Argument.cs b/DSACore/Auxiliary/Calculator/Argument.cs
index 52f33a9..5ed9ee3 100644
--- a/DSACore/Auxiliary/Calculator/Argument.cs
+++ b/DSACore/Auxiliary/Calculator/Argument.cs
@@ -1,9 +1,9 @@
-namespace DSACore.Auxiliary.Calculator
+using System;
+
+namespace DSACore.Auxiliary.Calculator
{
- using System;
-
/// <summary>
- /// Provides an ISolvable class to save numbers. The class handles Argument checking and conversion from string to int.
+ /// Provides an ISolvable class to save numbers. The class handles Argument checking and conversion from string to int.
/// </summary>
public class Argument : ISolvable
{
@@ -12,27 +12,24 @@
public Argument(string value)
{
// check whether the value given is an empty string
- if (string.IsNullOrEmpty(value))
- {
- throw new ArgumentException("Argument kann nicht mit einem leeren string instanziert werden. ", nameof(value));
- }
+ if (string.IsNullOrEmpty(value))
+ throw new ArgumentException("Argument kann nicht mit einem leeren string instanziert werden. ",
+ nameof(value));
- if (!int.TryParse(value, out int result))
- {
+ if (!int.TryParse(value, out var result))
throw new ArgumentException($"Kann {value} nicht in Integer konvertieren");
- }
this.value = result;
}
public int Solve()
{
- return this.value;
+ return value;
}
public override string ToString()
{
- return this.value.ToString();
+ return value.ToString();
}
}
} \ No newline at end of file
diff --git a/DSACore/Auxiliary/Calculator/ISolvable.cs b/DSACore/Auxiliary/Calculator/ISolvable.cs
index 1f571d0..7be4d19 100644
--- a/DSACore/Auxiliary/Calculator/ISolvable.cs
+++ b/DSACore/Auxiliary/Calculator/ISolvable.cs
@@ -1,10 +1,10 @@
namespace DSACore.Auxiliary.Calculator
{
/// <summary>
- /// Object has to be able to return an integer as it's value
+ /// Object has to be able to return an integer as it's value
/// </summary>
public interface ISolvable
{
int Solve();
}
-}
+} \ No newline at end of file
diff --git a/DSACore/Auxiliary/Calculator/Operator.cs b/DSACore/Auxiliary/Calculator/Operator.cs
index 440e21e..31b2a9b 100644
--- a/DSACore/Auxiliary/Calculator/Operator.cs
+++ b/DSACore/Auxiliary/Calculator/Operator.cs
@@ -4,7 +4,7 @@ using DSACorev.Auxiliary.Calculator;
namespace DSACore.Auxiliary.Calculator
{
/// <summary>
- /// The Operator Class represents a binary operator with tow Arguments and an Operation type
+ /// The Operator Class represents a binary operator with tow Arguments and an Operation type
/// </summary>
public class Operator : ISolvable
{
@@ -14,7 +14,7 @@ namespace DSACore.Auxiliary.Calculator
{
this.arg1 = arg1;
this.arg2 = arg2;
- this.OperatorType = operatorType;
+ OperatorType = operatorType;
}
public Ops OperatorType { get; set; }
@@ -22,19 +22,19 @@ namespace DSACore.Auxiliary.Calculator
public int Solve()
{
int result;
- switch (this.OperatorType)
+ switch (OperatorType)
{
case Ops.Dice:
- result = Dice.Roll(this.arg1.Solve(), this.arg2.Solve());
+ result = Dice.Roll(arg1.Solve(), arg2.Solve());
break;
case Ops.Multiply:
- result = this.arg1.Solve() * this.arg2.Solve();
+ result = arg1.Solve() * arg2.Solve();
break;
case Ops.Add:
- result = this.arg1.Solve() + this.arg2.Solve();
+ result = arg1.Solve() + arg2.Solve();
break;
case Ops.Subtract:
- result = this.arg1.Solve() - this.arg2.Solve();
+ result = arg1.Solve() - arg2.Solve();
break;
default:
throw new ArgumentOutOfRangeException();
@@ -45,7 +45,7 @@ namespace DSACore.Auxiliary.Calculator
public override string ToString()
{
- return $"({this.arg1} {this.OperatorType} {this.arg2})";
+ return $"({arg1} {OperatorType} {arg2})";
}
}
-}
+} \ No newline at end of file
diff --git a/DSACore/Auxiliary/Calculator/Ops.cs b/DSACore/Auxiliary/Calculator/Ops.cs
index 702558d..a5c9a2d 100644
--- a/DSACore/Auxiliary/Calculator/Ops.cs
+++ b/DSACore/Auxiliary/Calculator/Ops.cs
@@ -1,7 +1,7 @@
namespace DSACorev.Auxiliary.Calculator
{
/// <summary>
- /// The Different Operations, witch can be performed in execution-order
+ /// The Different Operations, witch can be performed in execution-order
/// </summary>
public enum Ops
{
@@ -10,4 +10,4 @@
Subtract,
Add
}
-}
+} \ No newline at end of file
diff --git a/DSACore/Auxiliary/Calculator/StringSolver.cs b/DSACore/Auxiliary/Calculator/StringSolver.cs
index 2eff5b4..b2a7d83 100644
--- a/DSACore/Auxiliary/Calculator/StringSolver.cs
+++ b/DSACore/Auxiliary/Calculator/StringSolver.cs
@@ -5,49 +5,47 @@ using DSACorev.Auxiliary.Calculator;
namespace DSACore.Auxiliary.Calculator
{
- using System;
- using System.Collections.Generic;
- using System.Linq;
-
/// <summary>
- /// The StringSolver divides the calculation string into operations and SubStringSolvers if the string contains parentheses
+ /// The StringSolver divides the calculation string into operations and SubStringSolvers if the string contains
+ /// parentheses
/// </summary>
public class StringSolver : ISolvable
{
- private readonly string input;
private readonly List<object> arguments = new List<object>();
+ private readonly string input;
public StringSolver(string input)
{
this.input = input;
}
- public override string ToString()
- {
- return "(0+" + this.input.Replace(" ", string.Empty).ToLower() + ")";
- }
-
public int Solve()
{
- string workInput = "0+" + this.input.Replace(" ", string.Empty).ToLower();
+ var workInput = "0+" + input.Replace(" ", string.Empty).ToLower();
workInput = ExpandParentheses(workInput);
-
+
// Create a List of the different parts of the calculation, e.g.:{"0", "+", "(5+6)", "d", "3"}.
- this.AtomizeOperations(workInput);
+ AtomizeOperations(workInput);
// traverse the List in order of Operation to Create the binary operation tree .
- this.NestOperations();
+ NestOperations();
// the List now contains only the top operation node, witch can be solved recursively,
- return ((ISolvable)this.arguments.First()).Solve();
+ return ((ISolvable) arguments.First()).Solve();
}
- private static string GetInner(ref string input) // extract the inner bracket an remove the section from the input string
+ public override string ToString()
{
- int depth = 0;
+ return "(0+" + input.Replace(" ", string.Empty).ToLower() + ")";
+ }
+
+ private static string
+ GetInner(ref string input) // extract the inner bracket an remove the section from the input string
+ {
+ var depth = 0;
for (var index = 1; index < input.Length; index++)
{
- char c = input[index];
+ var c = input[index];
switch (c)
{
case '(':
@@ -92,21 +90,13 @@ namespace DSACore.Auxiliary.Calculator
private static string ExpandParentheses(string input) // insert * between Parentheses and digits
{
- for (int i = 0; i < input.Length - 1; i++)
- {
+ for (var i = 0; i < input.Length - 1; i++)
if (input[i + 1] == '(' && char.IsNumber(input[i]))
- {
input = input.Insert(i + 1, "*");
- }
- }
- for (int i = 1; i < input.Length; i++)
- {
+ for (var i = 1; i < input.Length; i++)
if (input[i - 1] == ')' && char.IsNumber(input[i]))
- {
input = input.Insert(i, "*");
- }
- }
return input;
}
@@ -115,16 +105,14 @@ namespace DSACore.Auxiliary.Calculator
{
for (var index = 0; index < workInput.Length; index++)
{
- char c = workInput[index];
+ var c = workInput[index];
if (char.IsNumber(c))
{
// if char number, check if at end of string, else continue looping
if (index == workInput.Length - 1)
- {
// if at end of string; add remaining number to arguments
- this.arguments.Add(new Argument(workInput.Substring(0, index + 1)));
- }
+ arguments.Add(new Argument(workInput.Substring(0, index + 1)));
continue;
}
@@ -132,18 +120,15 @@ namespace DSACore.Auxiliary.Calculator
switch (c)
{
case ')':
- throw new ArgumentException($"Unmögliche Anordnung von Klammern");
+ throw new ArgumentException("Unmögliche Anordnung von Klammern");
case '(':
- this.arguments.Add(new StringSolver(GetInner(ref workInput)));
+ arguments.Add(new StringSolver(GetInner(ref workInput)));
index = -1;
break;
default:
- if (index > 0)
- {
- this.arguments.Add(new Argument(workInput.Substring(0, index)));
- }
+ if (index > 0) arguments.Add(new Argument(workInput.Substring(0, index)));
- this.arguments.Add(GetOps(c));
+ arguments.Add(GetOps(c));
workInput = workInput.Remove(0, index + 1);
index = -1;
break;
@@ -154,58 +139,44 @@ namespace DSACore.Auxiliary.Calculator
private void NestOperations()
{
foreach (Ops currentOp in Enum.GetValues(typeof(Ops)))
- {
// cycle through operators in operational order
- for (var index = 0; index < this.arguments.Count; index++)
+ for (var index = 0; index < arguments.Count; index++)
{
- var arg = this.arguments[index];
+ var arg = arguments[index];
- if (arg.GetType() != typeof(Ops))
- {
- continue;
- }
+ if (arg.GetType() != typeof(Ops)) continue;
// arg is of type Ops
- var op = (Ops)arg;
+ var op = (Ops) arg;
- if (op != currentOp)
- {
- continue;
- }
+ if (op != currentOp) continue;
// arg describes the current operation
- this.HandleSpecialFormatting(ref index, op); // Deal with special needs...
+ HandleSpecialFormatting(ref index, op); // Deal with special needs...
// replace the previous current and next Element in the List with one Operation object
- var temp = new Operator((ISolvable)this.arguments[index - 1], (ISolvable)this.arguments[index + 1], op);
- this.arguments[index - 1] = temp;
- this.arguments.RemoveRange(index, 2);
+ var temp = new Operator((ISolvable) arguments[index - 1], (ISolvable) arguments[index + 1], op);
+ arguments[index - 1] = temp;
+ arguments.RemoveRange(index, 2);
index--;
}
- }
}
private void HandleSpecialFormatting(ref int index, Ops op)
{
- var arg1 = this.arguments[index - 1];
+ var arg1 = arguments[index - 1];
if (arg1.GetType() == typeof(Ops))
{
- if (op == Ops.Dice)
- {
- this.arguments.Insert(index++, new Argument("1")); // w6 -> 1w6
- }
+ if (op == Ops.Dice) arguments.Insert(index++, new Argument("1")); // w6 -> 1w6
- if (op == Ops.Subtract)
- {
- this.arguments.Insert(index++, new Argument("0")); // +-3 -> +0-3
- }
+ if (op == Ops.Subtract) arguments.Insert(index++, new Argument("0")); // +-3 -> +0-3
}
- var arg2 = this.arguments[index + 1]; // 3+-5 -> 3+(0-5)
+ var arg2 = arguments[index + 1]; // 3+-5 -> 3+(0-5)
if (arg2.GetType() == typeof(Ops))
{
- this.arguments[index + 1] = new Operator(new Argument("0"), (ISolvable)this.arguments[index + 2], (Ops)arg2);
- this.arguments.RemoveAt(index + 2);
+ arguments[index + 1] = new Operator(new Argument("0"), (ISolvable) arguments[index + 2], (Ops) arg2);
+ arguments.RemoveAt(index + 2);
}
}
}