aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2021-10-08 20:21:14 +0200
committerarnesom <arne@bbop.org>2021-10-08 20:21:14 +0200
commit9476da1cb27c61bb1fced4acae8900942b19e43f (patch)
treeacc0db3117e38f8f86af0ca67d80ed33cd5e0a59
parent026d1606d4e5ec63e0acf66c6392a7af2a2c0585 (diff)
downloadperlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.tar.gz
perlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.tar.bz2
perlweeklychallenge-club-9476da1cb27c61bb1fced4acae8900942b19e43f.zip
Arne Sommer
-rw-r--r--challenge-133/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-133/arne-sommer/perl/ch-1.pl35
-rwxr-xr-xchallenge-133/arne-sommer/perl/ch-2.pl62
-rwxr-xr-xchallenge-133/arne-sommer/perl/integer-square-root-perl35
-rwxr-xr-xchallenge-133/arne-sommer/perl/smith-numbers-perl62
-rwxr-xr-xchallenge-133/arne-sommer/raku/ch-1.raku33
-rwxr-xr-xchallenge-133/arne-sommer/raku/ch-2.raku3
-rwxr-xr-xchallenge-133/arne-sommer/raku/integer-square-root11
-rwxr-xr-xchallenge-133/arne-sommer/raku/integer-square-root-bitwise33
-rwxr-xr-xchallenge-133/arne-sommer/raku/smith-numbers35
-rwxr-xr-xchallenge-133/arne-sommer/raku/smith-numbers-base45
-rwxr-xr-xchallenge-133/arne-sommer/raku/smith-numbers-simple3
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";