aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author冯昶 <seaker@qq.com>2021-10-09 18:27:06 +0800
committer冯昶 <seaker@qq.com>2021-10-09 18:27:06 +0800
commita9b3cf3285adb7126b920a6fdc4315ac3ba6ddec (patch)
treea9b2b06846cc57c82ca67b3ee9f462f33c3ee9b6
parent2bd4f4d95ef7c33d45b5a80e69fce40287039986 (diff)
downloadperlweeklychallenge-club-a9b3cf3285adb7126b920a6fdc4315ac3ba6ddec.tar.gz
perlweeklychallenge-club-a9b3cf3285adb7126b920a6fdc4315ac3ba6ddec.tar.bz2
perlweeklychallenge-club-a9b3cf3285adb7126b920a6fdc4315ac3ba6ddec.zip
challenge 133, raku solutions
-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];