aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author冯昶 <seaker@qq.com>2022-01-11 12:20:06 +0800
committer冯昶 <seaker@qq.com>2022-01-11 12:20:06 +0800
commit3261dc2b0aacfbddc11fe31d9fe85d4ebd7c04f7 (patch)
tree4119588ca9b38a3fad9e6ab6c163cd578a15f44c
parente9411bdc7658179af3f23d3ada7970323547a7d7 (diff)
downloadperlweeklychallenge-club-3261dc2b0aacfbddc11fe31d9fe85d4ebd7c04f7.tar.gz
perlweeklychallenge-club-3261dc2b0aacfbddc11fe31d9fe85d4ebd7c04f7.tar.bz2
perlweeklychallenge-club-3261dc2b0aacfbddc11fe31d9fe85d4ebd7c04f7.zip
challenge 147, raku solutions
-rwxr-xr-xchallenge-147/feng-chang/raku/ch-1.raku24
-rwxr-xr-xchallenge-147/feng-chang/raku/ch-2.raku30
2 files changed, 54 insertions, 0 deletions
diff --git a/challenge-147/feng-chang/raku/ch-1.raku b/challenge-147/feng-chang/raku/ch-1.raku
new file mode 100755
index 0000000000..d3dab98fae
--- /dev/null
+++ b/challenge-147/feng-chang/raku/ch-1.raku
@@ -0,0 +1,24 @@
+#!/bin/env raku
+
+unit sub MAIN(UInt:D \num = 20);
+
+my @lefty-primes = 2, 3, 5, 7;
+my ($start, $end) = 0, 3;
+
+my UInt $sz = @lefty-primes.elems;
+
+while $sz < num {
+ for 1..9 -> \d {
+ for @lefty-primes[$start..$end] -> \n {
+ my \m = (d ~ n).UInt;
+ if m.is-prime {
+ @lefty-primes.push(m);
+ ++$sz;
+ }
+ }
+ }
+ ($start, $end) = $end + 1, $sz - 1;
+ last if $end < $start;
+}
+
+put @lefty-primes[^((num,$sz).min)];
diff --git a/challenge-147/feng-chang/raku/ch-2.raku b/challenge-147/feng-chang/raku/ch-2.raku
new file mode 100755
index 0000000000..b2ac1fdad3
--- /dev/null
+++ b/challenge-147/feng-chang/raku/ch-2.raku
@@ -0,0 +1,30 @@
+#!/bin/env raku
+
+# https://www.mathblog.dk/project-euler-44-smallest-pair-pentagonal-numbers/
+# is-pentagonal() is key to speed it up
+
+my UInt $i = 1;
+
+outer-loop:
+loop {
+ ++$i;
+ my UInt \n = pentagon($i);
+
+ loop (my UInt $j = $i - 1; $j > 0; --$j) {
+ my UInt \m = pentagon($j);
+ if is-pentagonal(n - m) && is-pentagonal(n + m) {
+ put "\n", n, ' ', m;
+ last outer-loop;
+ }
+ }
+ print "{$i}\r";
+}
+
+sub pentagon(UInt:D \n --> UInt:D) {
+ n * (3 * n - 1) div 2
+}
+
+sub is-pentagonal(UInt:D \n --> Bool:D) {
+ my \p = (sqrt(1.0 + 24 * n) + 1.0) / 6.0;
+ p == p.UInt
+}