From 166dceb9718c354f01321be888633c9d4fa983b9 Mon Sep 17 00:00:00 2001 From: norangebit Date: Sun, 9 Jun 2019 12:43:34 +0200 Subject: [PATCH] add exercise of equations --- .../it/norangeb/algorithms/exam/Equations.kt | 73 +++++++++++++++++++ .../norangeb/algorithms/exam/EquationsTest.kt | 56 ++++++++++++++ 2 files changed, 129 insertions(+) create mode 100644 src/main/kotlin/it/norangeb/algorithms/exam/Equations.kt create mode 100644 src/test/kotlin/it/norangeb/algorithms/exam/EquationsTest.kt diff --git a/src/main/kotlin/it/norangeb/algorithms/exam/Equations.kt b/src/main/kotlin/it/norangeb/algorithms/exam/Equations.kt new file mode 100644 index 0000000..4cb7b09 --- /dev/null +++ b/src/main/kotlin/it/norangeb/algorithms/exam/Equations.kt @@ -0,0 +1,73 @@ +/* + * MIT License + * + * Copyright (c) 2019 norangebit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package it.norangeb.algorithms.exam + +import java.lang.Exception +import java.util.Stack + +object Equations { + fun compute(equation: String): Double { + val operator = Stack() + val operandi = Stack() + + equation.split(" ").forEach { + when (it) { + "+" -> operator.push(Operations.PLUS) + "-" -> operator.push(Operations.MINUS) + "*" -> operator.push(Operations.PER) + ")" -> operandi.push( + canculate(operator.pop(), operandi.pop(), operandi.pop()) + ) + else -> { + try { + operandi.push(it.toDouble()) + } catch (e: Exception) { + println("error, $e") + } + } + } + } + + return operandi.pop() + } + + private fun canculate( + op: Operations, + d1: Double, + d2: Double + ): Double { + println("$d1, $op, $d2") + return when (op) { + Operations.PLUS -> d1 + d2 + Operations.MINUS -> d2 - d1 + Operations.PER -> d1 * d2 + } + } +} + +enum class Operations { + PLUS, MINUS, PER +} \ No newline at end of file diff --git a/src/test/kotlin/it/norangeb/algorithms/exam/EquationsTest.kt b/src/test/kotlin/it/norangeb/algorithms/exam/EquationsTest.kt new file mode 100644 index 0000000..d1ca635 --- /dev/null +++ b/src/test/kotlin/it/norangeb/algorithms/exam/EquationsTest.kt @@ -0,0 +1,56 @@ +/* + * MIT License + * + * Copyright (c) 2019 norangebit + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + * + */ + +package it.norangeb.algorithms.exam + +import org.amshove.kluent.`should be equal to` +import org.spekframework.spek2.Spek +import org.spekframework.spek2.style.gherkin.Feature + +object EquationsTest : Spek({ + Feature("equations") { + Scenario("equations") { + val calculator by memoized { Equations } + + var result: Double = 0.0 + + When("compute 2 + 3 * ( 3 - 1 )") { + result = calculator.compute("( 2 + ( 3 * ( 3 - 1 ) ) )") + } + + Then("result should equal 8") { + result `should be equal to` 8.0 + } + + When("compute (((1 + 2) * (2 + 3)) + 1) * ( 3 - 1 )") { + result = calculator.compute("( ( ( ( 1 + 2 ) * ( 2 + 3 ) ) + 1 ) * ( 3 - 1 ) )") + } + + Then("result should equal 32") { + result `should be equal to` 32.0 + } + } + } +}) \ No newline at end of file