From 3261dc2b0aacfbddc11fe31d9fe85d4ebd7c04f7 Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Tue, 11 Jan 2022 12:20:06 +0800 Subject: challenge 147, raku solutions --- challenge-147/feng-chang/raku/ch-1.raku | 24 ++++++++++++++++++++++++ challenge-147/feng-chang/raku/ch-2.raku | 30 ++++++++++++++++++++++++++++++ 2 files changed, 54 insertions(+) create mode 100755 challenge-147/feng-chang/raku/ch-1.raku create mode 100755 challenge-147/feng-chang/raku/ch-2.raku 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 +} -- cgit From d6546fb6c2bbdfa0f14c0e42ad5e86acd0aa0cc5 Mon Sep 17 00:00:00 2001 From: 冯昶 Date: Thu, 10 Feb 2022 18:08:35 +0800 Subject: challenge 151 raku solutions --- challenge-147/feng-chang/raku/ch-1.raku | 2 +- challenge-147/feng-chang/raku/ch-2a.raku | 22 ++++++++++++++++++++++ challenge-150/feng-chang/raku/ch-1.raku | 6 ++++++ challenge-150/feng-chang/raku/ch-2.raku | 8 ++++++++ challenge-151/feng-chang/raku/ch-2.raku | 9 +++++++++ 5 files changed, 46 insertions(+), 1 deletion(-) create mode 100755 challenge-147/feng-chang/raku/ch-2a.raku create mode 100755 challenge-150/feng-chang/raku/ch-1.raku create mode 100755 challenge-150/feng-chang/raku/ch-2.raku create mode 100755 challenge-151/feng-chang/raku/ch-2.raku diff --git a/challenge-147/feng-chang/raku/ch-1.raku b/challenge-147/feng-chang/raku/ch-1.raku index d3dab98fae..41da33cad4 100755 --- a/challenge-147/feng-chang/raku/ch-1.raku +++ b/challenge-147/feng-chang/raku/ch-1.raku @@ -5,7 +5,7 @@ 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; +my UInt $sz = @lefty-primes.elems; while $sz < num { for 1..9 -> \d { diff --git a/challenge-147/feng-chang/raku/ch-2a.raku b/challenge-147/feng-chang/raku/ch-2a.raku new file mode 100755 index 0000000000..bf937bd660 --- /dev/null +++ b/challenge-147/feng-chang/raku/ch-2a.raku @@ -0,0 +1,22 @@ +#!/bin/env raku + +# reference https://gfldex.wordpress.com/2022/01/15/manual-hypering/ + +sub needle(int \b) { + sub is-pentagon(\n is raw) { (1 + sqrt(1 + 24 * n)) %% 6 } + sub P(\n is raw) { n * (3 * n - 1) div 2 } + + loop (my int $s = 1; $s < b; ++$s) { + my \bp = P(b); + my \sp = P($s); + if is-pentagon(bp + sp) && is-pentagon(bp - sp) { + return |(b, $s); + } + } +} + +sub infix:(\maybenil, \alternative) { + maybenil =:= Nil ?? alternative !! maybenil +} + +say (^∞).hyper(:batch(8), :degree(16)).map({ $_ with .&needle }).head; diff --git a/challenge-150/feng-chang/raku/ch-1.raku b/challenge-150/feng-chang/raku/ch-1.raku new file mode 100755 index 0000000000..817a93aaaf --- /dev/null +++ b/challenge-150/feng-chang/raku/ch-1.raku @@ -0,0 +1,6 @@ +#!/bin/env raku + +unit sub MAIN(Str:D $a, Str:D $b); + +my @fibo-words = $a, $b, * ~ * ... *.chars ≥ 51; +put @fibo-words[*-1].substr(50,1); diff --git a/challenge-150/feng-chang/raku/ch-2.raku b/challenge-150/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..b992d1867b --- /dev/null +++ b/challenge-150/feng-chang/raku/ch-2.raku @@ -0,0 +1,8 @@ +#!/bin/env raku + +unit sub MAIN(UInt:D \N = 500); + +my @nums = 1..N; +@nums .= grep(* !%% $_²) for (2 .. N.sqrt).grep(*.is-prime); + +put @nums; diff --git a/challenge-151/feng-chang/raku/ch-2.raku b/challenge-151/feng-chang/raku/ch-2.raku new file mode 100755 index 0000000000..4fa124eac5 --- /dev/null +++ b/challenge-151/feng-chang/raku/ch-2.raku @@ -0,0 +1,9 @@ +#!/bin/env raku + +unit sub MAIN(*@V); + +put max-gain(@V); + +multi max-gain() { 0 } +multi max-gain(@V where *.elems == 1|2) { @V.max } +multi max-gain(@V --> UInt:D) { max(@V[0] + max-gain(@V.tail(*-2)), max-gain(@V.tail(*-1))) } -- cgit