aboutsummaryrefslogtreecommitdiff
path: root/challenge-143
diff options
context:
space:
mode:
author冯昶 <seaker@qq.com>2021-12-28 18:45:54 +0800
committer冯昶 <seaker@qq.com>2021-12-28 18:45:54 +0800
commit839d7a80050e6cdcede7c9d658c3c35406671d7e (patch)
tree032b745e0c2f8ee32f907c7da96d0321970de183 /challenge-143
parentfb3913c8d38cf4ce52c90ae62bb92737d2836a0d (diff)
downloadperlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.tar.gz
perlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.tar.bz2
perlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.zip
challenge 143, raku solutions
Diffstat (limited to 'challenge-143')
-rwxr-xr-xchallenge-143/feng-chang/raku/ch-1.raku63
-rwxr-xr-xchallenge-143/feng-chang/raku/ch-2.raku15
2 files changed, 78 insertions, 0 deletions
diff --git a/challenge-143/feng-chang/raku/ch-1.raku b/challenge-143/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..2ba225b57f
--- /dev/null
+++ b/challenge-143/feng-chang/raku/ch-1.raku
@@ -0,0 +1,63 @@
+#!/bin/env raku
+
+use MONKEY-SEE-NO-EVAL;
+
+grammar Expression {
+ rule TOP { <expression> }
+
+ rule expression { <term>+ % <add-op> }
+ rule term { <item>+ % <mul-op> }
+ rule item { || '(' <expression> ')' || <number> }
+
+ token add-op { '+' | '-' }
+ token mul-op { '*' | '/' }
+ token number { \d+ }
+}
+
+class ExpressionActions {
+ method TOP($/) { make $<expression>.made }
+
+ method expression($/) {
+ my $n = $<term>[0].made;
+ for $<add-op>».made Z $<term>[1..*]».made -> (\op, \term) {
+ given op {
+ when '+' { $n += term }
+ when '-' { $n -= term }
+ }
+ }
+ make $n;
+ }
+
+ method term($/) {
+ my $n = $<item>[0].made;
+ for $<mul-op>».made Z $<item>[1..*]».made -> (\op, \item) {
+ given op {
+ when '*' { $n *= item }
+ when '/' { $n div= item }
+ }
+ }
+ make $n;
+ }
+
+ method item($/) { make $<expression>.defined ?? $<expression>.made !! $<number>.made }
+
+ method add-op($/) { make $/.Str }
+ method mul-op($/) { make $/.Str }
+ method number($/) { make $/.Int }
+}
+
+my Str $s;
+
+use Test;
+
+repeat {
+ $s = prompt 'Please enter an arithmetic expression: ';
+ { put ''; last } unless $s;
+
+ my $er = (EVAL $s).Int;
+ my $gr = Expression.parse($s, :actions(ExpressionActions)).made;
+
+ is $er, $gr, "'$s' = $gr, EVAL agrees with Grammar";
+} while $s.chars > 0;
+
+done-testing;
diff --git a/challenge-143/feng-chang/raku/ch-2.raku b/challenge-143/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..5f561558ac
--- /dev/null
+++ b/challenge-143/feng-chang/raku/ch-2.raku
@@ -0,0 +1,15 @@
+#!/bin/env raku
+
+unit sub MAIN(UInt:D \n);
+
+sub is-stealthy(UInt:D \n --> Bool:D) {
+ (1..sqrt(n).Int)
+ .grep(n %% *)
+ .map({ [$_, n div $_] })
+ .combinations(2)
+ .grep({ abs(.[0].sum - .[1].sum) == 1 })
+ .elems
+ > 0
+}
+
+put +is-stealthy(n);