aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-141/feng-chang/raku/ch-1.raku5
-rwxr-xr-xchallenge-141/feng-chang/raku/ch-2.raku5
-rwxr-xr-xchallenge-143/feng-chang/raku/ch-1.raku63
-rwxr-xr-xchallenge-143/feng-chang/raku/ch-2.raku15
-rwxr-xr-xchallenge-144/feng-chang/raku/ch-1.raku6
-rwxr-xr-xchallenge-144/feng-chang/raku/ch-2.raku19
-rwxr-xr-xchallenge-145/feng-chang/raku/ch-1.raku4
-rw-r--r--challenge-145/feng-chang/raku/i01.txt2
-rwxr-xr-xchallenge-146/feng-chang/raku/ch-1.raku3
-rwxr-xr-xchallenge-146/feng-chang/raku/ch-2.raku16
10 files changed, 138 insertions, 0 deletions
diff --git a/challenge-141/feng-chang/raku/ch-1.raku b/challenge-141/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..ba42e19fb3
--- /dev/null
+++ b/challenge-141/feng-chang/raku/ch-1.raku
@@ -0,0 +1,5 @@
+#!/bin/env raku
+
+my method divisors(UInt:D $n : --> Seq:D) { (1..$n).grep($n %% *) }
+
+put (1..∞).grep(*.&divisors == 8)[^10];
diff --git a/challenge-141/feng-chang/raku/ch-2.raku b/challenge-141/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..4f47828458
--- /dev/null
+++ b/challenge-141/feng-chang/raku/ch-2.raku
@@ -0,0 +1,5 @@
+#!/bin/env raku
+
+sub MAIN(UInt:D \m, UInt:D \n) {
+ put m.comb.combinations(1 .. m.comb.elems-1)».join.grep(* %% n).elems;
+}
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);
diff --git a/challenge-144/feng-chang/raku/ch-1.raku b/challenge-144/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..396b38301c
--- /dev/null
+++ b/challenge-144/feng-chang/raku/ch-1.raku
@@ -0,0 +1,6 @@
+#!/bin/env raku
+
+unit sub MAIN(UInt:D \N = 300);
+
+my @candis = (2..sqrt(N).Int).grep(*.is-prime);
+put (@candis X* @candis).grep(* < N).sort.unique;
diff --git a/challenge-144/feng-chang/raku/ch-2.raku b/challenge-144/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..10bd9f5d44
--- /dev/null
+++ b/challenge-144/feng-chang/raku/ch-2.raku
@@ -0,0 +1,19 @@
+#!/bin/env raku
+
+unit sub MAIN(UInt:D \u, UInt:D \v where v > u);
+
+my @ulam = lazy gather {
+ take u;
+ take v;
+
+ my $n = 2;
+ loop {
+ my %b;
+ (@ulam[^$n] X @ulam[^$n]).map({ ++%b{.[0]+.[1]} if .[1] > .[0] });
+ take %b.keys».UInt.sort.grep({ $_ > @ulam[$n-1] and %b{$_} == 1 }).first;
+
+ ++$n;
+ }
+};
+
+put @ulam[^20];
diff --git a/challenge-145/feng-chang/raku/ch-1.raku b/challenge-145/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..5cde190653
--- /dev/null
+++ b/challenge-145/feng-chang/raku/ch-1.raku
@@ -0,0 +1,4 @@
+#!/bin/env raku
+
+put [+] prompt('Array @a: ').words».Int »*«
+ prompt('Array @b: ').words».Int;
diff --git a/challenge-145/feng-chang/raku/i01.txt b/challenge-145/feng-chang/raku/i01.txt
new file mode 100644
index 0000000000..b36d133ce1
--- /dev/null
+++ b/challenge-145/feng-chang/raku/i01.txt
@@ -0,0 +1,2 @@
+1 2 3
+4 5 6
diff --git a/challenge-146/feng-chang/raku/ch-1.raku b/challenge-146/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..acba62e935
--- /dev/null
+++ b/challenge-146/feng-chang/raku/ch-1.raku
@@ -0,0 +1,3 @@
+#!/bin/env raku
+
+put (2..∞).grep(*.is-prime)[100_00];
diff --git a/challenge-146/feng-chang/raku/ch-2.raku b/challenge-146/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..86f1c53b16
--- /dev/null
+++ b/challenge-146/feng-chang/raku/ch-2.raku
@@ -0,0 +1,16 @@
+#!/bin/env raku
+
+unit sub MAIN(Rat:D \r);
+
+put "parent: {r.&parent.&toStr} " ~
+ "grandparent: {r.&parent.&parent.&toStr}";
+
+my method parent(Rat:D \r : --> Rat:D) {
+ r < 1 ??
+ r.numerator/(r.denominator - r.numerator) !!
+ (r.numerator - r.denominator)/r.denominator
+}
+
+my method toStr(Rat:D \r : --> Str:D) {
+ "{r.numerator}/{r.denominator}"
+}