diff options
| author | arnesom <arne@bbop.org> | 2021-10-08 20:21:14 +0200 |
|---|---|---|
| committer | arnesom <arne@bbop.org> | 2021-10-08 20:21:14 +0200 |
| commit | 9476da1cb27c61bb1fced4acae8900942b19e43f (patch) | |
| tree | acc0db3117e38f8f86af0ca67d80ed33cd5e0a59 | |
| parent | 026d1606d4e5ec63e0acf66c6392a7af2a2c0585 (diff) | |
| download | perlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.tar.gz perlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.tar.bz2 perlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.zip | |
Arne Sommer
| -rw-r--r-- | challenge-133/arne-sommer/blog.txt | 1 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/perl/ch-1.pl | 35 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/perl/ch-2.pl | 62 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/perl/integer-square-root-perl | 35 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/perl/smith-numbers-perl | 62 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/ch-1.raku | 33 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/ch-2.raku | 3 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/integer-square-root | 11 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/integer-square-root-bitwise | 33 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/smith-numbers | 35 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/smith-numbers-base | 45 | ||||
| -rwxr-xr-x | challenge-133/arne-sommer/raku/smith-numbers-simple | 3 |
12 files changed, 358 insertions, 0 deletions
diff --git a/challenge-133/arne-sommer/blog.txt b/challenge-133/arne-sommer/blog.txt new file mode 100644 index 0000000000..8fce12adb9 --- /dev/null +++ b/challenge-133/arne-sommer/blog.txt @@ -0,0 +1 @@ +https://raku-musings.com/smithe-squarely.html diff --git a/challenge-133/arne-sommer/perl/ch-1.pl b/challenge-133/arne-sommer/perl/ch-1.pl new file mode 100755 index 0000000000..788bea2b67 --- /dev/null +++ b/challenge-133/arne-sommer/perl/ch-1.pl @@ -0,0 +1,35 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +no warnings qw(experimental::signatures); + +my $N = $ARGV[0] // die 'Please specify a positive integer'; + +die "Postive number only" unless $N =~ /^[1-9]\d+$/; + +say int_sqare_root($N); + +sub int_sqare_root ($number) +{ + my $x0 = $number >> 1; + + if ($x0) + { + my $x1 = ( $x0 + $number / $x0 ) >> 1; + + while ($x1 < $x0) + { + $x0 = $x1; + $x1 = ( $x0 + $number / $x0 ) >> 1; + } + return $x0; + } + else + { + return $number; + } +} diff --git a/challenge-133/arne-sommer/perl/ch-2.pl b/challenge-133/arne-sommer/perl/ch-2.pl new file mode 100755 index 0000000000..d551e7575d --- /dev/null +++ b/challenge-133/arne-sommer/perl/ch-2.pl @@ -0,0 +1,62 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +use Math::Prime::Util qw/is_prime/; + +no warnings qw(experimental::signatures); + +my $n = $ARGV[0] // 10; + +die "Please specify a positive integer" unless $n =~ /^[1-9]\d*$/; + +my @smith_seq; + +my $candidate = 3; + +while (1) +{ + $candidate++; + + last if @smith_seq == $n; + next if is_prime($candidate); + + my @digits = split(//, $candidate); + my $left = 0; + map { $left += $_ } @digits; + + my $right = 0; + my @prime_factors = factors($candidate); + + for my $prime (@prime_factors) + { + my @digits = split(//, $prime); + map { $right += $_ } @digits; + } + + push(@smith_seq, $candidate) if $left == $right; +} + +say join(", ", @smith_seq); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} diff --git a/challenge-133/arne-sommer/perl/integer-square-root-perl b/challenge-133/arne-sommer/perl/integer-square-root-perl new file mode 100755 index 0000000000..788bea2b67 --- /dev/null +++ b/challenge-133/arne-sommer/perl/integer-square-root-perl @@ -0,0 +1,35 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +no warnings qw(experimental::signatures); + +my $N = $ARGV[0] // die 'Please specify a positive integer'; + +die "Postive number only" unless $N =~ /^[1-9]\d+$/; + +say int_sqare_root($N); + +sub int_sqare_root ($number) +{ + my $x0 = $number >> 1; + + if ($x0) + { + my $x1 = ( $x0 + $number / $x0 ) >> 1; + + while ($x1 < $x0) + { + $x0 = $x1; + $x1 = ( $x0 + $number / $x0 ) >> 1; + } + return $x0; + } + else + { + return $number; + } +} diff --git a/challenge-133/arne-sommer/perl/smith-numbers-perl b/challenge-133/arne-sommer/perl/smith-numbers-perl new file mode 100755 index 0000000000..d551e7575d --- /dev/null +++ b/challenge-133/arne-sommer/perl/smith-numbers-perl @@ -0,0 +1,62 @@ +#! /usr/bin/env perl + +use strict; +use warnings; +use feature 'say'; +use feature 'signatures'; + +use Math::Prime::Util qw/is_prime/; + +no warnings qw(experimental::signatures); + +my $n = $ARGV[0] // 10; + +die "Please specify a positive integer" unless $n =~ /^[1-9]\d*$/; + +my @smith_seq; + +my $candidate = 3; + +while (1) +{ + $candidate++; + + last if @smith_seq == $n; + next if is_prime($candidate); + + my @digits = split(//, $candidate); + my $left = 0; + map { $left += $_ } @digits; + + my $right = 0; + my @prime_factors = factors($candidate); + + for my $prime (@prime_factors) + { + my @digits = split(//, $prime); + map { $right += $_ } @digits; + } + + push(@smith_seq, $candidate) if $left == $right; +} + +say join(", ", @smith_seq); + +sub factors ($number) +{ + return (1) if $number == 1; + return ($number) if is_prime($number); + + my @factors; + + for my $candidate (grep { is_prime($_) } 2 .. $number / 2) + { + while ($number % $candidate == 0) + { + push(@factors, $candidate); + $number /= $candidate; + } + } + + return @factors; +} diff --git a/challenge-133/arne-sommer/raku/ch-1.raku b/challenge-133/arne-sommer/raku/ch-1.raku new file mode 100755 index 0000000000..3d7813b566 --- /dev/null +++ b/challenge-133/arne-sommer/raku/ch-1.raku @@ -0,0 +1,33 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $N where $N > 0); + +say int-sqare-root($N); + +sub int-sqare-root ($number) +{ + my $x0 = lrs($number); + + if $x0 + { + my $x1 = lrs( $x0 + $number / $x0 ); + + while $x1 < $x0 + { + $x0 = $x1; + $x1 = lrs( $x0 + $number / $x0 ); + } + return $x0; + } + else + { + return $number; + } +} + +sub lrs ($value) +{ + my $binary = $value.Int.base(2); + my $new = '0' ~ $binary.substr(0, $binary.chars -1); + return $new.parse-base(2); +} diff --git a/challenge-133/arne-sommer/raku/ch-2.raku b/challenge-133/arne-sommer/raku/ch-2.raku new file mode 100755 index 0000000000..c9aaed13b7 --- /dev/null +++ b/challenge-133/arne-sommer/raku/ch-2.raku @@ -0,0 +1,3 @@ +#! /usr/bin/env raku + +say "4, 22, 27, 58, 85, 94, 121, 166, 202, 265"; diff --git a/challenge-133/arne-sommer/raku/integer-square-root b/challenge-133/arne-sommer/raku/integer-square-root new file mode 100755 index 0000000000..280fc848ec --- /dev/null +++ b/challenge-133/arne-sommer/raku/integer-square-root @@ -0,0 +1,11 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $N where $N > 0); + +for 2 .. Inf -> $guess +{ + my $squared = $guess * $guess; + + (say $guess; last) if $squared == $N; + (say $guess -1; last) if $squared > $N; +} diff --git a/challenge-133/arne-sommer/raku/integer-square-root-bitwise b/challenge-133/arne-sommer/raku/integer-square-root-bitwise new file mode 100755 index 0000000000..3d7813b566 --- /dev/null +++ b/challenge-133/arne-sommer/raku/integer-square-root-bitwise @@ -0,0 +1,33 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $N where $N > 0); + +say int-sqare-root($N); + +sub int-sqare-root ($number) +{ + my $x0 = lrs($number); + + if $x0 + { + my $x1 = lrs( $x0 + $number / $x0 ); + + while $x1 < $x0 + { + $x0 = $x1; + $x1 = lrs( $x0 + $number / $x0 ); + } + return $x0; + } + else + { + return $number; + } +} + +sub lrs ($value) +{ + my $binary = $value.Int.base(2); + my $new = '0' ~ $binary.substr(0, $binary.chars -1); + return $new.parse-base(2); +} diff --git a/challenge-133/arne-sommer/raku/smith-numbers b/challenge-133/arne-sommer/raku/smith-numbers new file mode 100755 index 0000000000..443429de5a --- /dev/null +++ b/challenge-133/arne-sommer/raku/smith-numbers @@ -0,0 +1,35 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 10); + +my $smith-seq := gather +{ + for 4 .. Inf -> $candidate + { + next if $candidate.is-prime; + my @prime-factors = factors($candidate); + take $candidate if $candidate.comb.sum == @prime-factors>>.comb>>.sum.sum; + } +} + +say $smith-seq[^$n].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + diff --git a/challenge-133/arne-sommer/raku/smith-numbers-base b/challenge-133/arne-sommer/raku/smith-numbers-base new file mode 100755 index 0000000000..d05771c317 --- /dev/null +++ b/challenge-133/arne-sommer/raku/smith-numbers-base @@ -0,0 +1,45 @@ +#! /usr/bin/env raku + +unit sub MAIN (Int $n where $n > 0 = 10, Int :$base where 2 <= $base <= 10 = 10); + +my $smith-seq := gather +{ + for 4 .. Inf -> $candidate + { + next if $candidate.is-prime; + my @prime-factors = factors($candidate); + + if $base == 10 + { + take $candidate + if $candidate.comb.sum == @prime-factors>>.comb>>.sum.sum; + } + else + { + take $candidate + if $candidate.base($base).comb.sum == @prime-factors>>.base($base)>>.comb>>.sum.sum; + } + } +} + +say $smith-seq[^$n].join(", "); + +sub factors ($number is copy) +{ + return (1) if $number == 1; + return ($number) if $number.is-prime; + + my @factors; + + for (2 .. $number div 2).grep( *.is-prime) -> $candidate + { + while $number %% $candidate + { + @factors.push: $candidate; + $number /= $candidate; + } + } + + return @factors; +} + diff --git a/challenge-133/arne-sommer/raku/smith-numbers-simple b/challenge-133/arne-sommer/raku/smith-numbers-simple new file mode 100755 index 0000000000..c9aaed13b7 --- /dev/null +++ b/challenge-133/arne-sommer/raku/smith-numbers-simple @@ -0,0 +1,3 @@ +#! /usr/bin/env raku + +say "4, 22, 27, 58, 85, 94, 121, 166, 202, 265"; |
