diff --git a/src/main/java/com/thealgorithms/maths/MathBuilder.java b/src/main/java/com/thealgorithms/maths/MathBuilder.java index 3534749dd41c..1cf3d8b7fc9a 100644 --- a/src/main/java/com/thealgorithms/maths/MathBuilder.java +++ b/src/main/java/com/thealgorithms/maths/MathBuilder.java @@ -26,7 +26,7 @@ public double get() { public long toLong() { try { if (Double.isNaN(result)) { - throw new IllegalArgumentException("Cannot convert NaN to long"); + throw new IllegalArgumentException("Cannot convert NaN to long!"); } if (result == Double.POSITIVE_INFINITY) { return Long.MAX_VALUE; @@ -48,6 +48,8 @@ public long toLong() { public static class Builder { private double number; + private double sideNumber; + private boolean inParenthesis; private double memory = 0; public Builder() { @@ -59,26 +61,44 @@ public Builder(double num) { } public Builder add(double num) { - number += num; + if (inParenthesis) { + sideNumber += num; + } else { + number += num; + } return this; } // Takes a number and a condition, only does the operation if condition is true. public Builder addIf(double num, BiFunction condition) { - if (condition.apply(number, num)) { + if (!condition.apply(number, num)) { + return this; + } + if (inParenthesis) { + sideNumber += num; + } else { number += num; } return this; } public Builder minus(double num) { - number -= num; + if (inParenthesis) { + sideNumber -= num; + } else { + number -= num; + } return this; } // Takes a number and a condition, only does the operation if condition is true. public Builder minusIf(double num, BiFunction condition) { - if (condition.apply(number, num)) { + if (!condition.apply(number, num)) { + return this; + } + if (inParenthesis) { + sideNumber -= num; + } else { number -= num; } return this; @@ -113,7 +133,6 @@ public Builder e() { } public Builder randomInRange(double min, double max) { - if (number != 0) { throw new RuntimeException("Number must be zero for random assignment!"); } @@ -123,28 +142,49 @@ public Builder randomInRange(double min, double max) { } public Builder toDegrees() { - number = Math.toDegrees(number); + if (inParenthesis) { + sideNumber = Math.toDegrees(sideNumber); + } else { + number = Math.toDegrees(number); + } return this; } public Builder max(double num) { - number = Math.max(number, num); + if (inParenthesis) { + sideNumber = Math.max(sideNumber, num); + } else { + number = Math.max(number, num); + } return this; } public Builder min(double num) { - number = Math.min(number, num); + if (inParenthesis) { + sideNumber = Math.min(sideNumber, num); + } else { + number = Math.min(number, num); + } return this; } public Builder multiply(double num) { - number *= num; + if (inParenthesis) { + sideNumber *= num; + } else { + number *= num; + } return this; } // Takes a number and a condition, only does the operation if condition is true. public Builder multiplyIf(double num, BiFunction condition) { - if (condition.apply(number, num)) { + if (!condition.apply(number, num)) { + return this; + } + if (inParenthesis) { + sideNumber *= num; + } else { number *= num; } return this; @@ -154,7 +194,11 @@ public Builder divide(double num) { if (num == 0) { return this; } - number /= num; + if (inParenthesis) { + sideNumber /= num; + } else { + number /= num; + } return this; } @@ -163,107 +207,189 @@ public Builder divideIf(double num, BiFunction conditio if (num == 0) { return this; } - if (condition.apply(number, num)) { + if (!condition.apply(number, num)) { + return this; + } + if (inParenthesis) { + sideNumber /= num; + } else { number /= num; } return this; } public Builder mod(double num) { - number %= num; + if (inParenthesis) { + sideNumber %= num; + } else { + number %= num; + } return this; } // Takes a number and a condition, only does the operation if condition is true. public Builder modIf(double num, BiFunction condition) { - if (condition.apply(number, num)) { + if (!condition.apply(number, num)) { + return this; + } + if (inParenthesis) { + sideNumber %= num; + } else { number %= num; } return this; } public Builder pow(double num) { - number = Math.pow(number, num); + if (inParenthesis) { + sideNumber = Math.pow(sideNumber, num); + } else { + number = Math.pow(number, num); + } return this; } public Builder sqrt() { - number = Math.sqrt(number); + if (inParenthesis) { + sideNumber = Math.sqrt(sideNumber); + } else { + number = Math.sqrt(number); + } return this; } public Builder round() { - number = Math.round(number); + if (inParenthesis) { + sideNumber = Math.round(sideNumber); + } else { + number = Math.round(number); + } return this; } public Builder floor() { - number = Math.floor(number); + if (inParenthesis) { + sideNumber = Math.floor(sideNumber); + } else { + number = Math.floor(number); + } return this; } public Builder ceil() { - number = Math.ceil(number); + if (inParenthesis) { + sideNumber = Math.ceil(sideNumber); + } else { + number = Math.ceil(number); + } return this; } public Builder abs() { - number = Math.abs(number); + if (inParenthesis) { + sideNumber = Math.abs(sideNumber); + } else { + number = Math.abs(number); + } return this; } public Builder cbrt() { - number = Math.cbrt(number); + if (inParenthesis) { + sideNumber = Math.cbrt(sideNumber); + } else { + number = Math.cbrt(number); + } return this; } public Builder log() { - number = Math.log(number); + if (inParenthesis) { + sideNumber = Math.log(sideNumber); + } else { + number = Math.log(number); + } return this; } public Builder log10() { - number = Math.log10(number); + if (inParenthesis) { + sideNumber = Math.log10(sideNumber); + } else { + number = Math.log10(number); + } return this; } public Builder sin() { - number = Math.sin(number); + if (inParenthesis) { + sideNumber = Math.sin(sideNumber); + } else { + number = Math.sin(number); + } return this; } public Builder cos() { - number = Math.cos(number); + if (inParenthesis) { + sideNumber = Math.cos(sideNumber); + } else { + number = Math.cos(number); + } return this; } public Builder tan() { - number = Math.tan(number); + if (inParenthesis) { + sideNumber = Math.tan(sideNumber); + } else { + number = Math.tan(number); + } return this; } public Builder sinh() { - number = Math.sinh(number); + if (inParenthesis) { + sideNumber = Math.sinh(sideNumber); + } else { + number = Math.sinh(number); + } return this; } public Builder cosh() { - number = Math.cosh(number); + if (inParenthesis) { + sideNumber = Math.cosh(sideNumber); + } else { + number = Math.cosh(number); + } return this; } public Builder tanh() { - number = Math.tanh(number); + if (inParenthesis) { + sideNumber = Math.tanh(sideNumber); + } else { + number = Math.tanh(number); + } return this; } public Builder exp() { - number = Math.exp(number); + if (inParenthesis) { + sideNumber = Math.exp(sideNumber); + } else { + number = Math.exp(number); + } return this; } public Builder toRadians() { - number = Math.toRadians(number); + if (inParenthesis) { + sideNumber = Math.toRadians(sideNumber); + } else { + number = Math.toRadians(number); + } return this; } @@ -279,7 +405,6 @@ public Builder recall(boolean cleanMemory) { if (cleanMemory) { memory = 0; } - return this; } @@ -292,7 +417,6 @@ public Builder recallIf(Function condition, boolean cleanMemory if (cleanMemory) { memory = 0; } - return this; } @@ -322,6 +446,40 @@ public Builder print() { return this; } + public Builder openParenthesis(double num) { + sideNumber = num; + inParenthesis = true; + return this; + } + + public Builder closeParenthesisAndPlus() { + number += sideNumber; + inParenthesis = false; + sideNumber = 0; + return this; + } + + public Builder closeParenthesisAndMinus() { + number -= sideNumber; + inParenthesis = false; + sideNumber = 0; + return this; + } + + public Builder closeParenthesisAndMultiply() { + number *= sideNumber; + inParenthesis = false; + sideNumber = 0; + return this; + } + + public Builder closeParenthesisAndDivide() { + number /= sideNumber; + inParenthesis = false; + sideNumber = 0; + return this; + } + public Builder format(String format) { DecimalFormat formater = new DecimalFormat(format); String num = formater.format(number); diff --git a/src/test/java/com/thealgorithms/maths/MathBuilderTest.java b/src/test/java/com/thealgorithms/maths/MathBuilderTest.java index b6ecc6746701..dc381bfca5d3 100644 --- a/src/test/java/com/thealgorithms/maths/MathBuilderTest.java +++ b/src/test/java/com/thealgorithms/maths/MathBuilderTest.java @@ -35,4 +35,18 @@ void batchSalaryProcessing() { long[] expectedSalaries = {1840, 3036, 4048, 5060}; assertArrayEquals(expectedSalaries, processedSalaries); } + + @Test + void parenthesis() { + // 10 + (20*5) - 40 + (100 / 10) = 80 + double result = new MathBuilder.Builder(10).openParenthesis(20).multiply(5).closeParenthesisAndPlus().minus(40).openParenthesis(100).divide(10).closeParenthesisAndPlus().build().get(); + assertEquals(80, result); + } + + @Test + void areaOfCircle() { + // Radius is 4 + double area = new MathBuilder.Builder().pi().openParenthesis(4).multiply(4).closeParenthesisAndMultiply().build().get(); + assertEquals(Math.PI * 4 * 4, area); + } }