aboutsummaryrefslogtreecommitdiff
path: root/challenge-149
diff options
context:
space:
mode:
authorFlavio Poletti <flavio@polettix.it>2022-01-26 22:12:15 +0100
committerFlavio Poletti <flavio@polettix.it>2022-01-26 22:12:15 +0100
commit2dda07b762745d3f2d4651ba43c17cec75a7899b (patch)
treea10e268e0994a9541b9d60ba0aaefdf6f610ec37 /challenge-149
parentffcaad38e457633d0c8a4a229a3125a6306038ff (diff)
downloadperlweeklychallenge-club-2dda07b762745d3f2d4651ba43c17cec75a7899b.tar.gz
perlweeklychallenge-club-2dda07b762745d3f2d4651ba43c17cec75a7899b.tar.bz2
perlweeklychallenge-club-2dda07b762745d3f2d4651ba43c17cec75a7899b.zip
Add polettix's solution to challenge-149
Diffstat (limited to 'challenge-149')
-rw-r--r--challenge-149/polettix/blog.txt1
-rw-r--r--challenge-149/polettix/blog1.txt1
-rw-r--r--challenge-149/polettix/perl/ch-1.pl25
-rw-r--r--challenge-149/polettix/perl/ch-2.pl42
-rw-r--r--challenge-149/polettix/perl/cpanfile1
-rw-r--r--challenge-149/polettix/perl/cpanfile.snapshot13
-rw-r--r--challenge-149/polettix/raku/ch-1.raku24
-rw-r--r--challenge-149/polettix/raku/ch-2.raku38
8 files changed, 131 insertions, 14 deletions
diff --git a/challenge-149/polettix/blog.txt b/challenge-149/polettix/blog.txt
new file mode 100644
index 0000000000..68d9a3f0d3
--- /dev/null
+++ b/challenge-149/polettix/blog.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/01/26/pwc149-fibonacci-digit-sum/
diff --git a/challenge-149/polettix/blog1.txt b/challenge-149/polettix/blog1.txt
new file mode 100644
index 0000000000..07aff05bec
--- /dev/null
+++ b/challenge-149/polettix/blog1.txt
@@ -0,0 +1 @@
+https://github.polettix.it/ETOOBUSY/2022/01/27/pwc149-largest-square/
diff --git a/challenge-149/polettix/perl/ch-1.pl b/challenge-149/polettix/perl/ch-1.pl
new file mode 100644
index 0000000000..1fa7a77858
--- /dev/null
+++ b/challenge-149/polettix/perl/ch-1.pl
@@ -0,0 +1,25 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+use List::Util 'sum';
+
+my $it = fibonacci_summing();
+say $it->() for 1 .. (shift || 20);
+
+sub fibonacci_summing {
+ my %fibo = (0 => 1);
+ my $f = 0;
+ my $s = -1;
+ return sub {
+ while ('necessary') {
+ ++$s;
+ my $sum = sum split m{}mxs, $s;
+ ($f, $fibo{$fibo{$f}}) = ($fibo{$f}, $f + $fibo{$f})
+ while $f < $sum;
+ return $s if exists $fibo{$sum};
+ }
+ };
+}
diff --git a/challenge-149/polettix/perl/ch-2.pl b/challenge-149/polettix/perl/ch-2.pl
new file mode 100644
index 0000000000..d36a823d39
--- /dev/null
+++ b/challenge-149/polettix/perl/ch-2.pl
@@ -0,0 +1,42 @@
+#!/usr/bin/env perl
+use 5.024;
+use warnings;
+use English qw< -no_match_vars >;
+use experimental qw< postderef signatures >;
+no warnings qw< experimental::postderef experimental::signatures >;
+use Math::BigInt;
+
+my $base = shift || 10;
+my @ls = largest_square($base);
+if ($base <= 36) {
+ say join '', turn_to_letters(@ls);
+}
+else {
+ say join ' ', @ls;
+}
+
+sub turn_to_letters (@sequence) {
+ state $alphabet = ['0' .. '9', 'A' .. 'Z'];
+ state $digit_for = {map { $_ => $alphabet->[$_]} 0 .. $alphabet->$#*};
+ return map {$digit_for->{$_}} @sequence;
+}
+
+sub largest_square ($base = 10) {
+ my $max = Math::BigInt->new(0);
+ for my $n (reverse 0 .. $base - 1) {
+ $max = $max * $base + $n;
+ }
+ my $candidate = 1 + $max->bsqrt;
+ CANDIDATE:
+ while ('necessary') {
+ --$candidate;
+ my $square = $candidate * $candidate;
+ my (%flag, @retval);
+ while ($square > 0) {
+ unshift @retval, my $v = $square % $base;
+ next CANDIDATE if $flag{$v}++;
+ $square /= $base;
+ }
+ return @retval;
+ }
+}
diff --git a/challenge-149/polettix/perl/cpanfile b/challenge-149/polettix/perl/cpanfile
deleted file mode 100644
index 5df11a75da..0000000000
--- a/challenge-149/polettix/perl/cpanfile
+++ /dev/null
@@ -1 +0,0 @@
-requires 'Lingua::EN::Numbers';
diff --git a/challenge-149/polettix/perl/cpanfile.snapshot b/challenge-149/polettix/perl/cpanfile.snapshot
deleted file mode 100644
index e73d22a84f..0000000000
--- a/challenge-149/polettix/perl/cpanfile.snapshot
+++ /dev/null
@@ -1,13 +0,0 @@
-# carton snapshot format: version 1.0
-DISTRIBUTIONS
- Lingua-EN-Numbers-2.03
- pathname: N/NE/NEILB/Lingua-EN-Numbers-2.03.tar.gz
- provides:
- Lingua::EN::Numbers 2.03
- requirements:
- Exporter 0
- ExtUtils::MakeMaker 6.3
- perl 5.006
- strict 0
- vars 0
- warnings 0
diff --git a/challenge-149/polettix/raku/ch-1.raku b/challenge-149/polettix/raku/ch-1.raku
new file mode 100644
index 0000000000..a5a69f3a1f
--- /dev/null
+++ b/challenge-149/polettix/raku/ch-1.raku
@@ -0,0 +1,24 @@
+#!/usr/bin/env raku
+use v6;
+
+class FibonacciSumming { ... }
+
+sub MAIN ($N = 20) {
+ my $fs = FibonacciSumming.new;
+ $fs.next.put for ^$N;
+}
+
+class FibonacciSumming {
+ has %!fibo = 0 => 1;
+ has $!f = 0;
+ has $!s = -1;
+ method next () {
+ while True {
+ ++$!s;
+ my $sum = $!s.comb(/\d/).sum;
+ ($!f, %!fibo{%!fibo{$!f}}) = %!fibo{$!f}, $!f + %!fibo{$!f}
+ while $!f < $sum;
+ return $!s if %!fibo{$sum}:exists;
+ }
+ }
+}
diff --git a/challenge-149/polettix/raku/ch-2.raku b/challenge-149/polettix/raku/ch-2.raku
new file mode 100644
index 0000000000..bb2902749f
--- /dev/null
+++ b/challenge-149/polettix/raku/ch-2.raku
@@ -0,0 +1,38 @@
+#!/usr/bin/env raku
+use v6;
+sub MAIN (Int:D $base = 10) {
+ my @ls = largest-square($base);
+ if $base <= 36 {
+ turn-to-letters(@ls).join('').put;
+ }
+ else {
+ @ls.join(' ').put;
+ }
+}
+
+sub turn-to-letters (@sequence) {
+ state @alphabet = ('0' .. '9', 'A' .. 'Z').flat;
+ state %digit-for = (^@alphabet).map: { ($_, @alphabet[$_]).Slip };
+ return @sequence.map: {%digit-for{~$_}};
+}
+
+sub largest-square ($base) {
+ my $max = 0;
+ $max = $max * $base + $_ for (^$base).reverse;
+ my $candidate = 1 + $max.sqrt.Int;
+ CANDIDATE:
+ while True {
+ --$candidate;
+ my $square = $candidate * $candidate;
+ my $present = SetHash.new;
+ my @retval;
+ while $square > 0 {
+ my $v = $square % $base;
+ next CANDIDATE if $present.EXISTS-KEY($v);
+ $present.set($v);
+ @retval.unshift: $v;
+ $square = ($square / $base).Int;
+ }
+ return @retval;
+ }
+}