aboutsummaryrefslogtreecommitdiff
path: root/challenge-168
diff options
context:
space:
mode:
authorarnesom <arne@bbop.org>2022-06-12 20:42:18 +0200
committerarnesom <arne@bbop.org>2022-06-12 20:42:18 +0200
commitbb8c71f8839ade9eac84123d51df1920b0e87a0a (patch)
treee5e1480eadeb2d019b7de07d42524a95a68a7bc0 /challenge-168
parent4da5332e944d8b759384eff494a6045a53401bbd (diff)
downloadperlweeklychallenge-club-bb8c71f8839ade9eac84123d51df1920b0e87a0a.tar.gz
perlweeklychallenge-club-bb8c71f8839ade9eac84123d51df1920b0e87a0a.tar.bz2
perlweeklychallenge-club-bb8c71f8839ade9eac84123d51df1920b0e87a0a.zip
Arne Sommer
Diffstat (limited to 'challenge-168')
-rw-r--r--challenge-168/arne-sommer/blog.txt1
-rwxr-xr-xchallenge-168/arne-sommer/perl/ch-1.pl43
-rwxr-xr-xchallenge-168/arne-sommer/perl/ch-2.pl36
-rwxr-xr-xchallenge-168/arne-sommer/perl/home-prime-perl36
-rwxr-xr-xchallenge-168/arne-sommer/perl/perrin-prime-perl43
-rwxr-xr-xchallenge-168/arne-sommer/perl/perrin-seq-perl28
-rwxr-xr-xchallenge-168/arne-sommer/raku/ch-1.raku7
-rwxr-xr-xchallenge-168/arne-sommer/raku/ch-2.raku26
-rwxr-xr-xchallenge-168/arne-sommer/raku/home-prime26
-rwxr-xr-xchallenge-168/arne-sommer/raku/perrin-prime7
-rwxr-xr-xchallenge-168/arne-sommer/raku/perrin-prime-sorted7
-rwxr-xr-xchallenge-168/arne-sommer/raku/perrin-seq7
12 files changed, 267 insertions, 0 deletions
diff --git a/challenge-168/arne-sommer/blog.txt b/challenge-168/arne-sommer/blog.txt
new file mode 100644
index 0000000000..1f1d514436
--- /dev/null
+++ b/challenge-168/arne-sommer/blog.txt
@@ -0,0 +1 @@
+https://raku-musings.com/primarily-prime.html
diff --git a/challenge-168/arne-sommer/perl/ch-1.pl b/challenge-168/arne-sommer/perl/ch-1.pl
new file mode 100755
index 0000000000..71a9c75c3b
--- /dev/null
+++ b/challenge-168/arne-sommer/perl/ch-1.pl
@@ -0,0 +1,43 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use feature 'state';
+use bigint;
+use Math::Prime::Util 'is_prime';
+
+no warnings qw(experimental::signatures);
+
+my $count = $ARGV[0] || 13;
+
+sub next_perrin
+{
+ state @perrin;
+
+ if (! @perrin)
+ {
+ @perrin = (3,0,2);
+ }
+ else
+ {
+ push(@perrin, $perrin[-2] + $perrin[-3]);
+ }
+
+ shift @perrin if @perrin == 4;
+
+ return $perrin[-1];
+}
+
+my @pp;
+
+while (@pp < $count)
+{
+ my $next = next_perrin;
+ next if @pp && $next <= $pp[-1];
+ next unless is_prime($next);
+ push(@pp, $next);
+}
+
+say join(", ", @pp);
diff --git a/challenge-168/arne-sommer/perl/ch-2.pl b/challenge-168/arne-sommer/perl/ch-2.pl
new file mode 100755
index 0000000000..f27b48617d
--- /dev/null
+++ b/challenge-168/arne-sommer/perl/ch-2.pl
@@ -0,0 +1,36 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+no warnings 'experimental::signatures';
+
+use Math::Prime::Util 'is_prime';
+
+my $number = int($ARGV[0]) || 0;
+
+die "Please specify an integer >= 2" unless $number =~ /^[1-9]\d*$/ && $number > 1;
+
+$number = join("", factors($number)) until is_prime($number);
+
+say $number;
+
+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-168/arne-sommer/perl/home-prime-perl b/challenge-168/arne-sommer/perl/home-prime-perl
new file mode 100755
index 0000000000..f27b48617d
--- /dev/null
+++ b/challenge-168/arne-sommer/perl/home-prime-perl
@@ -0,0 +1,36 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+no warnings 'experimental::signatures';
+
+use Math::Prime::Util 'is_prime';
+
+my $number = int($ARGV[0]) || 0;
+
+die "Please specify an integer >= 2" unless $number =~ /^[1-9]\d*$/ && $number > 1;
+
+$number = join("", factors($number)) until is_prime($number);
+
+say $number;
+
+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-168/arne-sommer/perl/perrin-prime-perl b/challenge-168/arne-sommer/perl/perrin-prime-perl
new file mode 100755
index 0000000000..71a9c75c3b
--- /dev/null
+++ b/challenge-168/arne-sommer/perl/perrin-prime-perl
@@ -0,0 +1,43 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use feature 'state';
+use bigint;
+use Math::Prime::Util 'is_prime';
+
+no warnings qw(experimental::signatures);
+
+my $count = $ARGV[0] || 13;
+
+sub next_perrin
+{
+ state @perrin;
+
+ if (! @perrin)
+ {
+ @perrin = (3,0,2);
+ }
+ else
+ {
+ push(@perrin, $perrin[-2] + $perrin[-3]);
+ }
+
+ shift @perrin if @perrin == 4;
+
+ return $perrin[-1];
+}
+
+my @pp;
+
+while (@pp < $count)
+{
+ my $next = next_perrin;
+ next if @pp && $next <= $pp[-1];
+ next unless is_prime($next);
+ push(@pp, $next);
+}
+
+say join(", ", @pp);
diff --git a/challenge-168/arne-sommer/perl/perrin-seq-perl b/challenge-168/arne-sommer/perl/perrin-seq-perl
new file mode 100755
index 0000000000..58c81a5222
--- /dev/null
+++ b/challenge-168/arne-sommer/perl/perrin-seq-perl
@@ -0,0 +1,28 @@
+#! /usr/bin/env perl
+
+use strict;
+use warnings;
+use feature 'say';
+use feature 'signatures';
+use feature 'state';
+
+no warnings qw(experimental::signatures);
+
+my $count = $ARGV[0] || 10;
+
+sub next_perrin
+{
+ state @perrin = (3, 0, 2);
+ state $index = 0;
+
+ while (@perrin <= $index)
+ {
+ push(@perrin, $perrin[-2] + $perrin[-3]);
+ }
+
+ return $perrin[$index++];
+}
+
+my @ps; push(@ps, next_perrin($_)) for 1..$count;
+
+say join(", ", @ps);
diff --git a/challenge-168/arne-sommer/raku/ch-1.raku b/challenge-168/arne-sommer/raku/ch-1.raku
new file mode 100755
index 0000000000..17984ce714
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/ch-1.raku
@@ -0,0 +1,7 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int :c(:$count) where $count > 1 = 13);
+
+my $pp := ( 3, 0, 2, ( * + * + * * 0 ) ... Inf).unique.grep( *.is-prime );
+
+say $pp[^$count].sort.join(", ");
diff --git a/challenge-168/arne-sommer/raku/ch-2.raku b/challenge-168/arne-sommer/raku/ch-2.raku
new file mode 100755
index 0000000000..3f0e3120ed
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/ch-2.raku
@@ -0,0 +1,26 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $number is copy where $number > 1);
+
+$number = factors($number).join.Int until $number.is-prime;
+
+say $number;
+
+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-168/arne-sommer/raku/home-prime b/challenge-168/arne-sommer/raku/home-prime
new file mode 100755
index 0000000000..3f0e3120ed
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/home-prime
@@ -0,0 +1,26 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int $number is copy where $number > 1);
+
+$number = factors($number).join.Int until $number.is-prime;
+
+say $number;
+
+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-168/arne-sommer/raku/perrin-prime b/challenge-168/arne-sommer/raku/perrin-prime
new file mode 100755
index 0000000000..3aafa09e31
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/perrin-prime
@@ -0,0 +1,7 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (:c(:$count) = 13);
+
+my $pp := ( 3, 0, 2, ( * + * + * * 0 ) ... Inf).unique.grep( *.is-prime );
+
+say $pp[^$count].join(", ");
diff --git a/challenge-168/arne-sommer/raku/perrin-prime-sorted b/challenge-168/arne-sommer/raku/perrin-prime-sorted
new file mode 100755
index 0000000000..17984ce714
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/perrin-prime-sorted
@@ -0,0 +1,7 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int :c(:$count) where $count > 1 = 13);
+
+my $pp := ( 3, 0, 2, ( * + * + * * 0 ) ... Inf).unique.grep( *.is-prime );
+
+say $pp[^$count].sort.join(", ");
diff --git a/challenge-168/arne-sommer/raku/perrin-seq b/challenge-168/arne-sommer/raku/perrin-seq
new file mode 100755
index 0000000000..74ea791e06
--- /dev/null
+++ b/challenge-168/arne-sommer/raku/perrin-seq
@@ -0,0 +1,7 @@
+#! /usr/bin/env raku
+
+unit sub MAIN (Int :c(:$count) where $count > 1 = 10);
+
+my $perrin := ( 3, 0, 2, ( * + * + * * 0 ) ... Inf);
+
+say $perrin[^$count].join(", ");