aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xchallenge-133/feng-chang/raku/ch-1.raku17
-rwxr-xr-xchallenge-133/feng-chang/raku/ch-2.raku28
2 files changed, 45 insertions, 0 deletions
diff --git a/challenge-133/feng-chang/raku/ch-1.raku b/challenge-133/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..1322a40a06
--- /dev/null
+++ b/challenge-133/feng-chang/raku/ch-1.raku
@@ -0,0 +1,17 @@
+#!/bin/env raku
+
+my method sqrt(UInt:D \N: --> UInt:D) {
+ my UInt $m;
+ my UInt $n = N;
+
+ repeat {
+ $m = $n;
+ $n = ($m + N div $m) div 2;
+ } while $n < $m;
+
+ $m
+}
+
+sub MAIN(UInt:D \N where * > 0) {
+ put N.&sqrt;
+}
diff --git a/challenge-133/feng-chang/raku/ch-2.raku b/challenge-133/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..0f63b31841
--- /dev/null
+++ b/challenge-133/feng-chang/raku/ch-2.raku
@@ -0,0 +1,28 @@
+#!/bin/env raku
+
+sub facts(UInt:D \N where * > 1 --> Hash:D) {
+ my Int $m = N;
+ my Hash $F;
+
+ for (^∞).grep: *.is-prime -> $p {
+ while ($m %% $p) {
+ ++$F{$p};
+ $m div= $p;
+ }
+
+ last if $m < $p * $p;
+
+ LAST { ++$F{$m} if $m > 1 }
+ }
+
+ $F
+}
+
+sub is-smith-number(UInt:D \N --> Bool:D) {
+ return False if N.is-prime;
+
+ my Hash $F = facts(N);
+ N.comb.sum == $F.keys.map({ $_.comb.sum * $F{$_} }).sum
+}
+
+put (2..∞).grep({ is-smith-number($_) })[^10];