aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2022-02-24 08:35:40 +0100
committerFlavio Poletti <flavio@polettix.it>2022-02-24 08:35:40 +0100
commitca06d1b01f2da4461239aeacc43d2610da628802 (patch)
tree2c1fda5112efd85be85ba74582163bf462c3ce1c
parente5f746f7287eafbea87a8f545c2266e01c378323 (diff)
downloadperlweeklychallenge-club-ca06d1b01f2da4461239aeacc43d2610da628802.tar.gz
perlweeklychallenge-club-ca06d1b01f2da4461239aeacc43d2610da628802.tar.bz2
perlweeklychallenge-club-ca06d1b01f2da4461239aeacc43d2610da628802.zip
Add polettix's solution to challenge-153
-rw-r--r--challenge-153/polettix/blog.txt1
-rw-r--r--challenge-153/polettix/blog1.txt1
-rw-r--r--challenge-153/polettix/perl/ch-1.pl22
-rw-r--r--challenge-153/polettix/perl/ch-2.pl31
-rw-r--r--challenge-153/polettix/raku/ch-1.raku23
-rw-r--r--challenge-153/polettix/raku/ch-2.raku8
6 files changed, 86 insertions, 0 deletions
diff --git a/challenge-153/polettix/blog.txt b/challenge-153/polettix/blog.txt
new file mode 100644
index 0000000000..17c965beba
--- /dev/null
+++ b/challenge-153/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/02/23/pwc153-left-factorials/
diff --git a/challenge-153/polettix/blog1.txt b/challenge-153/polettix/blog1.txt
new file mode 100644
index 0000000000..4c6eecf03d
--- /dev/null
+++ b/challenge-153/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/02/24/pwc153-factorions/
diff --git a/challenge-153/polettix/perl/ch-1.pl b/challenge-153/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..33023add4e
--- /dev/null
+++ b/challenge-153/polettix/perl/ch-1.pl
@@ -0,0 +1,22 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+use Memoize;
+
+my $min = shift // 1;
+my $max = shift // 10;
+say join ', ', map { left_factorial($_) } $min .. $max;
+
+memoize('left_factorial');
+sub left_factorial ($n) {
+ return $n if $n <= 2;
+ return factorial($n - 1) + left_factorial($n - 1);
+}
+
+memoize('factorial');
+sub factorial ($n) {
+ return 1 if $n < 2;
+ return $n * factorial($n - 1);
+}
diff --git a/challenge-153/polettix/perl/ch-2.pl b/challenge-153/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..ccb4269116
--- /dev/null
+++ b/challenge-153/polettix/perl/ch-2.pl
@@ -0,0 +1,31 @@
+#!/usr/bin/env perl
+use v5.24;
+use warnings;
+use experimental 'signatures';
+no warnings 'experimental::signatures';
+use List::Util 'sum';
+
+say is_factorion(shift // 145) ? 1 : 0;
+
+sub is_factorion ($n) {
+ state $f = [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 ];
+ $n == sum map { $f->[$_] } split m{}mxs, $n;
+}
+
+
+my $s = '';
+while ('necessary') {
+ $s .= '9';
+ last if $s > sumfact($s);
+}
+my $max = sumfact($s);
+say $s, ' ', $max;
+
+for my $n (0 .. $max) {
+ say $n if is_factorion($n);
+}
+
+sub sumfact ($n) {
+ state $f = [ 1, 1, 2, 6, 24, 120, 720, 5040, 40320, 362880 ];
+ sum map { $f->[$_] } split m{}mxs, $n;
+}
diff --git a/challenge-153/polettix/raku/ch-1.raku b/challenge-153/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..d216784869
--- /dev/null
+++ b/challenge-153/polettix/raku/ch-1.raku
@@ -0,0 +1,23 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (Int:D $min = 1, Int:D $max = 10) {
+ ($min .. $max).map({left-factorial($_)}).join(', ').put;
+ ($min .. $max).map({left-factorial-cached($_)}).join(', ').put;
+}
+
+multi sub left-factorial (Int:D $n where 0 <= * <= 2) { $n }
+multi sub left-factorial (Int:D $n where * > 2) {
+ my $f = 1;
+ 1 + (1 ..^ $n).map({$f *= $^x}).sum;
+}
+
+sub left-factorial-cached (Int:D $n where * >= 0) {
+ state $factorial = 1;
+ state $k = 1;
+ state @left-factorials = 0, 1, 2;
+ while $n > @left-factorials.end {
+ $factorial *= ++$k;
+ @left-factorials.push: @left-factorials[*-1] + $factorial;
+ }
+ return @left-factorials[$n];
+}
diff --git a/challenge-153/polettix/raku/ch-2.raku b/challenge-153/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..79791344b6
--- /dev/null
+++ b/challenge-153/polettix/raku/ch-2.raku
@@ -0,0 +1,8 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (Int:D $n = 145) { put is-factorion($n) ?? 1 !! 0 }
+
+sub is-factorion (Int:D $n where $n >= 0) {
+ state %factorions = set(1, 2, 145, 40585);
+ return $n ∈ %factorions;
+}