From 839d7a80050e6cdcede7c9d658c3c35406671d7e Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Tue, 28 Dec 2021 18:45:54 +0800 Subject: challenge 143, raku solutions --- challenge-143/feng-chang/raku/ch-1.raku | 63 +++++++++++++++++++++++++++++++++ challenge-143/feng-chang/raku/ch-2.raku | 15 ++++++++ 2 files changed, 78 insertions(+) create mode 100755 challenge-143/feng-chang/raku/ch-1.raku create mode 100755 challenge-143/feng-chang/raku/ch-2.raku 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 { } + + rule expression { + % } + rule term { + % } + rule item { || '(' ')' || } + + token add-op { '+' | '-' } + token mul-op { '*' | '/' } + token number { \d+ } +} + +class ExpressionActions { + method TOP($/) { make $.made } + + method expression($/) { + my $n = $[0].made; + for $».made Z $[1..*]».made -> (\op, \term) { + given op { + when '+' { $n += term } + when '-' { $n -= term } + } + } + make $n; + } + + method term($/) { + my $n = $[0].made; + for $».made Z $[1..*]».made -> (\op, \item) { + given op { + when '*' { $n *= item } + when '/' { $n div= item } + } + } + make $n; + } + + method item($/) { make $.defined ?? $.made !! $.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); -- cgit