diff options
| author | 冯昶 <seaker@qq.com> | 2021-12-28 18:45:54 +0800 |
|---|---|---|
| committer | 冯昶 <seaker@qq.com> | 2021-12-28 18:45:54 +0800 |
| commit | 839d7a80050e6cdcede7c9d658c3c35406671d7e (patch) | |
| tree | 032b745e0c2f8ee32f907c7da96d0321970de183 /challenge-143 | |
| parent | fb3913c8d38cf4ce52c90ae62bb92737d2836a0d (diff) | |
| download | perlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.tar.gz perlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.tar.bz2 perlweeklychallenge-club-839d7a80050e6cdcede7c9d658c3c35406671d7e.zip | |
challenge 143, raku solutions
Diffstat (limited to 'challenge-143')
| -rwxr-xr-x | challenge-143/feng-chang/raku/ch-1.raku | 63 | ||||
| -rwxr-xr-x | challenge-143/feng-chang/raku/ch-2.raku | 15 |
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); |
