diff options
| author | Mohammad Sajid Anwar <Mohammad.Anwar@yahoo.com> | 2023-07-30 10:03:47 +0100 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2023-07-30 10:03:47 +0100 |
| commit | baa42870a9e7c455b36f97561e468b401e718316 (patch) | |
| tree | 8bd41305ee79d7b89e920b653f4f8f783460909d | |
| parent | d55a51072e1222ecfe9938e90109bdf72fc57ead (diff) | |
| parent | 5e6a2d493a042ef22e861ea5079140328c089037 (diff) | |
| download | perlweeklychallenge-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-x | challenge-227/andreas-voegele/kotlin/ch-2.kts | 26 | ||||
| -rwxr-xr-x | challenge-227/andreas-voegele/perl/ch-2.pl | 19 |
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'); |
