aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMohammad Sajid Anwar <Mohammad.Anwar@yahoo.com>2023-07-30 10:03:47 +0100
committerGitHub <noreply@github.com>2023-07-30 10:03:47 +0100
commitbaa42870a9e7c455b36f97561e468b401e718316 (patch)
tree8bd41305ee79d7b89e920b653f4f8f783460909d
parentd55a51072e1222ecfe9938e90109bdf72fc57ead (diff)
parent5e6a2d493a042ef22e861ea5079140328c089037 (diff)
downloadperlweeklychallenge-club-baa42870a9e7c455b36f97561e468b401e718316.tar.gz
perlweeklychallenge-club-baa42870a9e7c455b36f97561e468b401e718316.tar.bz2
perlweeklychallenge-club-baa42870a9e7c455b36f97561e468b401e718316.zip
Merge pull request #8463 from voegelas/challenge-227
Evaluate strings
-rwxr-xr-xchallenge-227/andreas-voegele/kotlin/ch-2.kts26
-rwxr-xr-xchallenge-227/andreas-voegele/perl/ch-2.pl19
2 files changed, 43 insertions, 2 deletions
diff --git a/challenge-227/andreas-voegele/kotlin/ch-2.kts b/challenge-227/andreas-voegele/kotlin/ch-2.kts
index fd9d4f3e7a..7fe5e15c9a 100755
--- a/challenge-227/andreas-voegele/kotlin/ch-2.kts
+++ b/challenge-227/andreas-voegele/kotlin/ch-2.kts
@@ -108,11 +108,35 @@ class Roman private constructor(val number: Double) {
override fun toString() = encodeRoman(number)
}
+fun romanMaths(expression: String): Roman {
+ val functionFor = mapOf(
+ "+" to Roman::plus,
+ "-" to Roman::minus,
+ "*" to Roman::times,
+ "/" to Roman::div,
+ "%" to Roman::rem,
+ "**" to Roman::pow,
+ )
+ val match = Regex(
+ """
+ ([IVXLCDM]+) # Numeral
+ \s*
+ ([-+*/%]|[*][*]) # Operator
+ \s*
+ ([IVXLCDM]+) # Numeral
+ """,
+ RegexOption.COMMENTS,
+ ).matchEntire(expression)
+ ?: throw IllegalArgumentException("Invalid expression $expression")
+ val (x, op, y) = match.destructured
+ return functionFor[op]!!.invoke(Roman(x), Roman(y))
+}
+
println(Roman("IV") + Roman("V"))
println(Roman("M") - Roman("I"))
println(Roman("X") / Roman("II"))
println(Roman("XI") * Roman("VI"))
-println(Roman("VII").pow(Roman("III")))
+println(romanMaths("VII ** III"))
println(Roman("V") - Roman("V"))
println(Roman("V") / Roman("II"))
println(Roman("MMM") + Roman("M"))
diff --git a/challenge-227/andreas-voegele/perl/ch-2.pl b/challenge-227/andreas-voegele/perl/ch-2.pl
index 0c253aa7cb..3ce453acda 100755
--- a/challenge-227/andreas-voegele/perl/ch-2.pl
+++ b/challenge-227/andreas-voegele/perl/ch-2.pl
@@ -110,15 +110,32 @@ use overload
package main;
+use Carp qw(croak);
+
sub roman ($string) {
return Roman->new($string);
}
+sub roman_maths ($expression) {
+ my ($x, $op, $y) = $expression =~ m{
+ \A
+ ([IVXLCDM]+) # Numeral
+ \s*
+ ([-+*/%]|[*][*]) # Operator
+ \s*
+ ([IVXLCDM]+) # Numeral
+ \z
+ }xms
+ or croak "Invalid expression $expression";
+ ## no critic (ProhibitStringyEval)
+ return eval qq{roman('$x') $op roman('$y')};
+}
+
say roman('IV') + roman('V');
say roman('M') - roman('I');
say roman('X') / roman('II');
say roman('XI') * roman('VI');
-say roman('VII')**roman('III');
+say roman_maths('VII ** III');
say roman('V') - roman('V');
say roman('V') / roman('II');
say roman('MMM') + roman('M');