aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2022-01-16 21:24:50 +0100
committerarnesom <arne@bbop.org>2022-01-16 21:24:50 +0100
commit2c57b47bd8eae004c8696e750959b33341072a95 (patch)
treeb4de0c60e8aeacc852a5fa75e29aede884d178e9
parentf7832b2609a11f774422c28ab6f110651b7ede69 (diff)
downloadperlweeklychallenge-club-2c57b47bd8eae004c8696e750959b33341072a95.tar.gz
perlweeklychallenge-club-2c57b47bd8eae004c8696e750959b33341072a95.tar.bz2
perlweeklychallenge-club-2c57b47bd8eae004c8696e750959b33341072a95.zip
Arne Sommer
-rw-r--r--challenge-147/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-147/arne-sommer/perl/ch-1.pl36
-rwxr-xr-xchallenge-147/arne-sommer/perl/ch-2.pl40
-rwxr-xr-xchallenge-147/arne-sommer/perl/pentagon-numbers-loop-perl40
-rwxr-xr-xchallenge-147/arne-sommer/perl/truncatable-prime-perl36
-rwxr-xr-xchallenge-147/arne-sommer/raku/ch-1.raku20
-rwxr-xr-xchallenge-147/arne-sommer/raku/ch-2.raku31
-rwxr-xr-xchallenge-147/arne-sommer/raku/pentagon-numbers35
-rwxr-xr-xchallenge-147/arne-sommer/raku/pentagon-numbers-loop31
-rwxr-xr-xchallenge-147/arne-sommer/raku/pentagon-numbers-loop-cached40
-rwxr-xr-xchallenge-147/arne-sommer/raku/pentagon-numbers-seq16
-rwxr-xr-xchallenge-147/arne-sommer/raku/pentagon-numbers-seq-grep13
-rwxr-xr-xchallenge-147/arne-sommer/raku/truncatable-prime20
13 files changed, 359 insertions, 0 deletions
diff --git a/challenge-147/arne-sommer/blog.txt b/challenge-147/arne-sommer/blog.txt
new file mode 100644
index 0000000000..91b6c7d761
--- /dev/null
+++ b/challenge-147/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/pentagon-prime.html
diff --git a/challenge-147/arne-sommer/perl/ch-1.pl b/challenge-147/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..6cdb8e2900
--- /dev/null
+++ b/challenge-147/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,36 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use Math::Prime::Util 'is_prime';
+
+no warnings qw(experimental::signatures);
+
+my $limit = int($ARGV[0] || 20);
+
+my @seq;
+
+my $candidate = 1;
+
+while (@seq < $limit)
+{
+ $candidate++;
+
+ push(@seq, $candidate) if is_left_trunc($candidate);
+}
+
+say join(", ", @seq);
+
+sub is_left_trunc ($prime)
+{
+ return 0 if $prime =~ /0/;
+
+ for my $start (0 .. length($prime) -1)
+ {
+ return 0 unless is_prime(substr($prime, $start));
+ }
+
+ return 1;
+}
diff --git a/challenge-147/arne-sommer/perl/ch-2.pl b/challenge-147/arne-sommer/perl/ch-2.pl
new file mode 100755
index 0000000000..2b230a6a2a
--- /dev/null
+++ b/challenge-147/arne-sommer/perl/ch-2.pl
@@ -0,0 +1,40 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+
+no warnings qw(experimental::signatures);
+
+my $a = 1;
+
+while ($a++)
+{
+ my $b = $a;
+
+ while ($b-- > 1)
+ {
+ my $penta_a = pentagonial($a);
+ my $penta_b = pentagonial($b);
+
+ if (is_pentagonial($penta_a + $penta_b) && is_pentagonial($penta_a - $penta_b))
+ {
+ say "$penta_b $penta_a";
+ exit;
+ }
+ }
+}
+
+sub is_pentagonial($candidate)
+{
+ my $check = (1 + sqrt(1 + 24 * $candidate)) / 6;
+ return int($check) == $check;
+}
+
+sub pentagonial($number)
+{
+ return $number * ( 3 * $number -1) / 2;
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/perl/pentagon-numbers-loop-perl b/challenge-147/arne-sommer/perl/pentagon-numbers-loop-perl
new file mode 100755
index 0000000000..2b230a6a2a
--- /dev/null
+++ b/challenge-147/arne-sommer/perl/pentagon-numbers-loop-perl
@@ -0,0 +1,40 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+
+no warnings qw(experimental::signatures);
+
+my $a = 1;
+
+while ($a++)
+{
+ my $b = $a;
+
+ while ($b-- > 1)
+ {
+ my $penta_a = pentagonial($a);
+ my $penta_b = pentagonial($b);
+
+ if (is_pentagonial($penta_a + $penta_b) && is_pentagonial($penta_a - $penta_b))
+ {
+ say "$penta_b $penta_a";
+ exit;
+ }
+ }
+}
+
+sub is_pentagonial($candidate)
+{
+ my $check = (1 + sqrt(1 + 24 * $candidate)) / 6;
+ return int($check) == $check;
+}
+
+sub pentagonial($number)
+{
+ return $number * ( 3 * $number -1) / 2;
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/perl/truncatable-prime-perl b/challenge-147/arne-sommer/perl/truncatable-prime-perl
new file mode 100755
index 0000000000..6cdb8e2900
--- /dev/null
+++ b/challenge-147/arne-sommer/perl/truncatable-prime-perl
@@ -0,0 +1,36 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use Math::Prime::Util 'is_prime';
+
+no warnings qw(experimental::signatures);
+
+my $limit = int($ARGV[0] || 20);
+
+my @seq;
+
+my $candidate = 1;
+
+while (@seq < $limit)
+{
+ $candidate++;
+
+ push(@seq, $candidate) if is_left_trunc($candidate);
+}
+
+say join(", ", @seq);
+
+sub is_left_trunc ($prime)
+{
+ return 0 if $prime =~ /0/;
+
+ for my $start (0 .. length($prime) -1)
+ {
+ return 0 unless is_prime(substr($prime, $start));
+ }
+
+ return 1;
+}
diff --git a/challenge-147/arne-sommer/raku/ch-1.raku b/challenge-147/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..9612aeb142
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,20 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($limit = 20, :v(:$verbose));
+
+my $seq = (2 .. Inf).grep(*.&is-left-trunc);
+
+say $seq[^$limit].join(", ");
+
+sub is-left-trunc ($prime)
+{
+ return False if $prime.contains: '0';
+
+ for ^$prime.chars -> $start
+ {
+ say ": Checking $prime -> { $prime.substr($start) } - { $prime.substr($start).is-prime ?? "prime" !! "not prime" }" if $verbose;
+ return False unless $prime.substr($start).is-prime;
+ }
+
+ return True;
+}
diff --git a/challenge-147/arne-sommer/raku/ch-2.raku b/challenge-147/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..cf3b4226e8
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,31 @@
+#! /usr/bin/env raku
+
+unit sub MAIN;
+
+for 2 .. Inf -> $a
+{
+ for $a -1 ... 1 -> $b
+ {
+ my $penta-a = pentagonial($a);
+ my $penta-b = pentagonial($b);
+
+ if is-pentagonial($penta-a + $penta-b) && is-pentagonial($penta-a - $penta-b)
+ {
+ say "$penta-b $penta-a";
+ exit;
+ }
+ }
+}
+
+sub is-pentagonial ($candidate)
+{
+ my $check = (1 + (1 + 24 * $candidate).sqrt) / 6;
+ return $check.Int == $check;
+}
+
+sub pentagonial ($number)
+{
+ return $number * ( 3 * $number -1) / 2;
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/raku/pentagon-numbers b/challenge-147/arne-sommer/raku/pentagon-numbers
new file mode 100755
index 0000000000..e27232f4cd
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/pentagon-numbers
@@ -0,0 +1,35 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($limit = 10, :v(:$verbose));
+
+my $penta-seq = gather
+{
+ state $index = 0;
+
+ loop
+ {
+ $index++;
+ take $index * ( 3 * $index -1) / 2;
+ }
+}
+
+my @a = $penta-seq[^$limit];
+
+my %is-penta = @a.Set;
+
+for @a -> $a
+{
+ for @a -> $b
+ {
+ next if $b <= $a;
+ say ": Considering $a, $b" if $verbose;
+
+ if %is-penta{$a + $b} && %is-penta{$b - $a}
+ {
+ say "$a, $b";
+ exit;
+ }
+ }
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/raku/pentagon-numbers-loop b/challenge-147/arne-sommer/raku/pentagon-numbers-loop
new file mode 100755
index 0000000000..cf3b4226e8
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/pentagon-numbers-loop
@@ -0,0 +1,31 @@
+#! /usr/bin/env raku
+
+unit sub MAIN;
+
+for 2 .. Inf -> $a
+{
+ for $a -1 ... 1 -> $b
+ {
+ my $penta-a = pentagonial($a);
+ my $penta-b = pentagonial($b);
+
+ if is-pentagonial($penta-a + $penta-b) && is-pentagonial($penta-a - $penta-b)
+ {
+ say "$penta-b $penta-a";
+ exit;
+ }
+ }
+}
+
+sub is-pentagonial ($candidate)
+{
+ my $check = (1 + (1 + 24 * $candidate).sqrt) / 6;
+ return $check.Int == $check;
+}
+
+sub pentagonial ($number)
+{
+ return $number * ( 3 * $number -1) / 2;
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/raku/pentagon-numbers-loop-cached b/challenge-147/arne-sommer/raku/pentagon-numbers-loop-cached
new file mode 100755
index 0000000000..b5212b9862
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/pentagon-numbers-loop-cached
@@ -0,0 +1,40 @@
+#! /usr/bin/env raku
+
+unit sub MAIN;
+
+for 2 .. Inf -> $a
+{
+ for $a -1 ... 1 -> $b
+ {
+ my $penta-a = pentagonial($a);
+ my $penta-b = pentagonial($b);
+
+ if is-pentagonial($penta-a + $penta-b) && is-pentagonial($penta-a - $penta-b)
+ {
+ say "$penta-b $penta-a";
+ exit;
+ }
+ }
+}
+
+sub is-pentagonial ($candidate)
+{
+ state @cache;
+ return @cache[$candidate] if @cache[$candidate];
+
+ my $value = (1 + (1 + 24 * $candidate).sqrt) / 6;
+
+ @cache[$candidate] = ( $value.Int == $value );
+
+ return @cache[$candidate];
+}
+
+sub pentagonial ($number)
+{
+ state @cache;
+ return @cache[$number] if @cache[$number];
+
+ return @cache[$number] = $number * ( 3 * $number -1) / 2;
+}
+
+say "(no match)";
diff --git a/challenge-147/arne-sommer/raku/pentagon-numbers-seq b/challenge-147/arne-sommer/raku/pentagon-numbers-seq
new file mode 100755
index 0000000000..a6074f1a5b
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/pentagon-numbers-seq
@@ -0,0 +1,16 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($limit = 10);
+
+my $penta-seq = gather
+{
+ state $index = 0;
+
+ loop
+ {
+ $index++;
+ take $index * ( 3 * $index -1) / 2;
+ }
+}
+
+say $penta-seq[^$limit].join(", ");
diff --git a/challenge-147/arne-sommer/raku/pentagon-numbers-seq-grep b/challenge-147/arne-sommer/raku/pentagon-numbers-seq-grep
new file mode 100755
index 0000000000..e553813c16
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/pentagon-numbers-seq-grep
@@ -0,0 +1,13 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($limit = 10);
+
+my $penta-seq = (1..Inf).grep(*.&is-pentagonial);
+
+say $penta-seq[^$limit].join(", ");
+
+sub is-pentagonial ($candidate)
+{
+ my $is = (1 + (1 + 24 * $candidate).sqrt) / 6;
+ return $is.Int == $is;
+}
diff --git a/challenge-147/arne-sommer/raku/truncatable-prime b/challenge-147/arne-sommer/raku/truncatable-prime
new file mode 100755
index 0000000000..9612aeb142
--- /dev/null
+++ b/challenge-147/arne-sommer/raku/truncatable-prime
@@ -0,0 +1,20 @@
+#! /usr/bin/env raku
+
+unit sub MAIN ($limit = 20, :v(:$verbose));
+
+my $seq = (2 .. Inf).grep(*.&is-left-trunc);
+
+say $seq[^$limit].join(", ");
+
+sub is-left-trunc ($prime)
+{
+ return False if $prime.contains: '0';
+
+ for ^$prime.chars -> $start
+ {
+ say ": Checking $prime -> { $prime.substr($start) } - { $prime.substr($start).is-prime ?? "prime" !! "not prime" }" if $verbose;
+ return False unless $prime.substr($start).is-prime;
+ }
+
+ return True;
+}