aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorScimon <simon.proctor@gmail.com>2021-10-07 12:57:05 +0100
committerScimon <simon.proctor@gmail.com>2021-10-07 12:57:05 +0100
commit94d1d4fbbcf0dd2d03b201fe5313dac31ff34ac1 (patch)
tree45852d2aaa8e5a5e23350857b41cc647b6b56859
parent20ffd7b7c80e195548325ace22fe92f2a499984c (diff)
downloadperlweeklychallenge-club-94d1d4fbbcf0dd2d03b201fe5313dac31ff34ac1.tar.gz
perlweeklychallenge-club-94d1d4fbbcf0dd2d03b201fe5313dac31ff34ac1.tar.bz2
perlweeklychallenge-club-94d1d4fbbcf0dd2d03b201fe5313dac31ff34ac1.zip
This weeks challenges
-rw-r--r--challenge-133/simon-proctor/raku/ch-1.raku10
-rw-r--r--challenge-133/simon-proctor/raku/ch-2.raku33
2 files changed, 43 insertions, 0 deletions
diff --git a/challenge-133/simon-proctor/raku/ch-1.raku b/challenge-133/simon-proctor/raku/ch-1.raku
new file mode 100644
index 0000000000..c334ede333
--- /dev/null
+++ b/challenge-133/simon-proctor/raku/ch-1.raku
@@ -0,0 +1,10 @@
+#!/usr/bin/env raku
+
+#| For the integer N return the integer sqrt of it
+sub MAIN ( Int \n ) {
+ say isqrt( n );
+}
+
+sub isqrt(UInt \n) {
+ (1..*).first( { $_ * $_ > n } ) - 1;
+};
diff --git a/challenge-133/simon-proctor/raku/ch-2.raku b/challenge-133/simon-proctor/raku/ch-2.raku
new file mode 100644
index 0000000000..38451aed62
--- /dev/null
+++ b/challenge-133/simon-proctor/raku/ch-2.raku
@@ -0,0 +1,33 @@
+#!/usr/bin/env raku
+
+use experimental :cached;
+
+#| Display the first n smith numbers
+sub MAIN ( UInt \n = 10 ) {
+ .say for (2..*).grep( { is-smith-number($_) } )[^n];
+}
+
+multi sub is-smith-number( Int \n where n.is-prime --> False ) {}
+
+multi sub is-smith-number( Int \n --> Bool ) is pure {
+ my @factors = prime-factors( n );
+ ([+] n.comb) == ([+] @factors.map( { [+] $_.comb } ));
+}
+
+sub prime-factors( Int $n is copy --> Array ) is pure {
+ my @factors;
+ while ! $n.is-prime {
+ my \s = smallest-factor( $n );
+ @factors.push(s);
+ $n = $n div s;
+ }
+ @factors.push($n);
+ return @factors;
+}
+
+sub smallest-factor( Int \n --> Int ) is pure is cached {
+ for (2..(n div 2)).grep(*.is-prime) {
+ return $_ if n %% $_;
+ }
+ die "Something went wrong";
+}