diff options
| author | Flavio Poletti <flavio@polettix.it> | 2022-01-26 22:12:15 +0100 |
|---|---|---|
| committer | Flavio Poletti <flavio@polettix.it> | 2022-01-26 22:12:15 +0100 |
| commit | 2dda07b762745d3f2d4651ba43c17cec75a7899b (patch) | |
| tree | a10e268e0994a9541b9d60ba0aaefdf6f610ec37 /challenge-149 | |
| parent | ffcaad38e457633d0c8a4a229a3125a6306038ff (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rw-r--r-- | challenge-149/polettix/blog1.txt | 1 | ||||
| -rw-r--r-- | challenge-149/polettix/perl/ch-1.pl | 25 | ||||
| -rw-r--r-- | challenge-149/polettix/perl/ch-2.pl | 42 | ||||
| -rw-r--r-- | challenge-149/polettix/perl/cpanfile | 1 | ||||
| -rw-r--r-- | challenge-149/polettix/perl/cpanfile.snapshot | 13 | ||||
| -rw-r--r-- | challenge-149/polettix/raku/ch-1.raku | 24 | ||||
| -rw-r--r-- | challenge-149/polettix/raku/ch-2.raku | 38 |
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; + } +} |
