From 2c57b47bd8eae004c8696e750959b33341072a95 Mon Sep 17 00:00:00 2001 From: arnesom Date: Sun, 16 Jan 2022 21:24:50 +0100 Subject: Arne Sommer --- challenge-147/arne-sommer/blog.txt | 1 + challenge-147/arne-sommer/perl/ch-1.pl | 36 +++++++++++++++++++ challenge-147/arne-sommer/perl/ch-2.pl | 40 ++++++++++++++++++++++ .../arne-sommer/perl/pentagon-numbers-loop-perl | 40 ++++++++++++++++++++++ .../arne-sommer/perl/truncatable-prime-perl | 36 +++++++++++++++++++ challenge-147/arne-sommer/raku/ch-1.raku | 20 +++++++++++ challenge-147/arne-sommer/raku/ch-2.raku | 31 +++++++++++++++++ challenge-147/arne-sommer/raku/pentagon-numbers | 35 +++++++++++++++++++ .../arne-sommer/raku/pentagon-numbers-loop | 31 +++++++++++++++++ .../arne-sommer/raku/pentagon-numbers-loop-cached | 40 ++++++++++++++++++++++ .../arne-sommer/raku/pentagon-numbers-seq | 16 +++++++++ .../arne-sommer/raku/pentagon-numbers-seq-grep | 13 +++++++ challenge-147/arne-sommer/raku/truncatable-prime | 20 +++++++++++ 13 files changed, 359 insertions(+) create mode 100644 challenge-147/arne-sommer/blog.txt create mode 100755 challenge-147/arne-sommer/perl/ch-1.pl create mode 100755 challenge-147/arne-sommer/perl/ch-2.pl create mode 100755 challenge-147/arne-sommer/perl/pentagon-numbers-loop-perl create mode 100755 challenge-147/arne-sommer/perl/truncatable-prime-perl create mode 100755 challenge-147/arne-sommer/raku/ch-1.raku create mode 100755 challenge-147/arne-sommer/raku/ch-2.raku create mode 100755 challenge-147/arne-sommer/raku/pentagon-numbers create mode 100755 challenge-147/arne-sommer/raku/pentagon-numbers-loop create mode 100755 challenge-147/arne-sommer/raku/pentagon-numbers-loop-cached create mode 100755 challenge-147/arne-sommer/raku/pentagon-numbers-seq create mode 100755 challenge-147/arne-sommer/raku/pentagon-numbers-seq-grep create mode 100755 challenge-147/arne-sommer/raku/truncatable-prime 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; +} -- cgit