From 615f7aa7e2613c9daea36b8456c4771a98399b90 Mon Sep 17 00:00:00 2001 From: Flavio Poletti Date: Tue, 5 Oct 2021 19:23:05 +0200 Subject: Add polettix's solution to challenge-133 --- challenge-133/polettix/blog.txt | 1 + challenge-133/polettix/blog1.txt | 1 + challenge-133/polettix/perl/ch-1.pl | 13 +++++++++++++ challenge-133/polettix/perl/ch-2.pl | 33 +++++++++++++++++++++++++++++++++ challenge-133/polettix/raku/ch-1.raku | 10 ++++++++++ challenge-133/polettix/raku/ch-2.raku | 28 ++++++++++++++++++++++++++++ 6 files changed, 86 insertions(+) create mode 100644 challenge-133/polettix/blog.txt create mode 100644 challenge-133/polettix/blog1.txt create mode 100644 challenge-133/polettix/perl/ch-1.pl create mode 100644 challenge-133/polettix/perl/ch-2.pl create mode 100644 challenge-133/polettix/raku/ch-1.raku create mode 100644 challenge-133/polettix/raku/ch-2.raku diff --git a/challenge-133/polettix/blog.txt b/challenge-133/polettix/blog.txt new file mode 100644 index 0000000000..7c61e5cf32 --- /dev/null +++ b/challenge-133/polettix/blog.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2021/10/06/pwc133-integer-square-root/ diff --git a/challenge-133/polettix/blog1.txt b/challenge-133/polettix/blog1.txt new file mode 100644 index 0000000000..2df1e12cfe --- /dev/null +++ b/challenge-133/polettix/blog1.txt @@ -0,0 +1 @@ +https://github.polettix.it/ETOOBUSY/2021/10/07/pwc133-smith-numbers/ diff --git a/challenge-133/polettix/perl/ch-1.pl b/challenge-133/polettix/perl/ch-1.pl new file mode 100644 index 0000000000..8f20ddef96 --- /dev/null +++ b/challenge-133/polettix/perl/ch-1.pl @@ -0,0 +1,13 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; +sub integer_square_root ($n) { + return $n if $n < 2; + my $x = $n >> 1; # first estimate + my $y = $x + 1; # just to get started with $x < $y + ($x, $y) = (($x + int($n / $x)) >> 1, $x) while $x < $y; + return $y; +} +say integer_square_root(shift // die "$0 \n"); diff --git a/challenge-133/polettix/perl/ch-2.pl b/challenge-133/polettix/perl/ch-2.pl new file mode 100644 index 0000000000..23327d1aa6 --- /dev/null +++ b/challenge-133/polettix/perl/ch-2.pl @@ -0,0 +1,33 @@ +#!/usr/bin/env perl +use v5.24; +use warnings; +use experimental 'signatures'; +no warnings 'experimental::signatures'; +use List::Util 'sum'; +sub is_smith ($x) { + my $sum = sum split m{}mxs, $x; + my $div = 2; + my $ndiv = 0; + while ($x > 1 && $sum > -1) { + if ($x % $div == 0) { + my $subsum = sum split m{}mxs, $div; + while ($x % $div == 0) { + $sum -= $subsum; + $x /= $div; + ++$ndiv; + } + } + $div = $div % 2 ? $div + 2 : 3; + } + return $sum == 0 && $ndiv > 1; +} +sub smith_first ($n) { + my @retval; + my $candidate = 3; # one less of first composite number + while ($n > @retval) { + next unless is_smith(++$candidate); + push @retval, $candidate; + } + return @retval; +} +say for smith_first(shift // 10); diff --git a/challenge-133/polettix/raku/ch-1.raku b/challenge-133/polettix/raku/ch-1.raku new file mode 100644 index 0000000000..0db13b24d8 --- /dev/null +++ b/challenge-133/polettix/raku/ch-1.raku @@ -0,0 +1,10 @@ +#!/usr/bin/env raku +use v6; +sub integer-square-root (Int:D $n where * >= 0) { + return $n if $n < 2; + my $x = $n +> 1; # first estimate + my $y = $x + 1; # just to get started with $x < $y + ($x, $y) = (($x + ($n / $x).Int) +> 1, $x) while $x < $y; + return $y; +} +sub MAIN (Int:D $n where * >= 0) { put integer-square-root($n) } diff --git a/challenge-133/polettix/raku/ch-2.raku b/challenge-133/polettix/raku/ch-2.raku new file mode 100644 index 0000000000..bc0639034d --- /dev/null +++ b/challenge-133/polettix/raku/ch-2.raku @@ -0,0 +1,28 @@ +#!/usr/bin/env raku +use v6; +sub is-smith (Int:D() $x is copy where * > 0) { + my $sum = $x.comb(/\d/).sum; + my $div = 2; + my $ndiv = 0; + while $x > 1 && $sum > -1 { + if $x %% $div { + my $subsum = $div.comb(/\d/).sum; + while $x %% $div { + $sum -= $subsum; + $x /= $div; + ++$ndiv; + } + } + $div += $div == 2 ?? 1 !! 2; + } + return $sum == 0 && $ndiv > 1; +} +sub smith-first (Int:D $n is copy where * > 0) { + my $candidate = 3; # one less of first composite number + gather while $n > 0 { + next unless is-smith(++$candidate); + take $candidate; + --$n; + } +} +sub MAIN ($n = 10) { .put for smith-first($n) } -- cgit