aboutsummaryrefslogtreecommitdiff
path: root/challenge-012
diff options
context:
space:
mode:
authorMohammad S Anwar <Mohammad.Anwar@yahoo.com>2019-06-15 23:21:07 +0100
committerGitHub <noreply@github.com>2019-06-15 23:21:07 +0100
commit2686058c3714ebeeafb1fb8b3e203a372e9aae91 (patch)
treedb6f158d1abbeca6a0ea5b9f8dc63c511be2f78e /challenge-012
parent19ce5b889816253b49a2544947f5386a19953a7e (diff)
parent3108eb9b454aa145f154dea0060c99097b1efe67 (diff)
downloadperlweeklychallenge-club-2686058c3714ebeeafb1fb8b3e203a372e9aae91.tar.gz
perlweeklychallenge-club-2686058c3714ebeeafb1fb8b3e203a372e9aae91.tar.bz2
perlweeklychallenge-club-2686058c3714ebeeafb1fb8b3e203a372e9aae91.zip
Merge pull request #253 from seaker/master
changllege #12 answers from feng chang
Diffstat (limited to 'challenge-012')
-rwxr-xr-xchallenge-012/feng-chang/perl5/ch-1.pl72
-rwxr-xr-xchallenge-012/feng-chang/perl5/ch-2.pl27
-rw-r--r--challenge-012/feng-chang/perl5/paths.txt4
-rwxr-xr-xchallenge-012/feng-chang/perl6/ch-1.p612
-rwxr-xr-xchallenge-012/feng-chang/perl6/ch-2.p617
-rw-r--r--challenge-012/feng-chang/perl6/paths.txt4
6 files changed, 136 insertions, 0 deletions
diff --git a/challenge-012/feng-chang/perl5/ch-1.pl b/challenge-012/feng-chang/perl5/ch-1.pl
new file mode 100755
index 0000000000..21129a546b
--- /dev/null
+++ b/challenge-012/feng-chang/perl5/ch-1.pl
@@ -0,0 +1,72 @@
+#!/bin/env perl
+
+use Modern::Perl;
+use List::Util qw(min max);
+use POSIX;
+
+my @primes = (2, 3);
+
+sub more_primes {
+ my $to = shift;
+ my $from = $primes[-1] + 1;
+ my $P;
+
+ do {
+ $P = $primes[-1];
+ my @a = ($P + 1) .. min($to, $P * $P);
+
+ for my $p (@primes) {
+ for (my $i = ceil($from / $p) * $p - $from; $i <= $to; $i += $p) {
+ $a[$i] = 0;
+ }
+ }
+
+ for my $i (@a) {
+ push(@primes, $i) if $i;
+ }
+ } while ($P * $P < $to);
+}
+
+sub is_prime {
+ my $n = shift;
+
+ my $e = int(sqrt($n));
+ more_primes($e) if $e > $primes[-1];
+
+ for my $p (@primes) {
+ last if $p > $e;
+ return 0 if $n % $p == 0;
+ }
+
+ return 1;
+}
+
+sub get_prime {
+ my $idx = shift;
+ return $primes[$idx] if $idx + 1 <= @primes;
+
+ do {
+ my $n = $primes[-1];
+ more_primes($n * $n);
+ } while ($idx + 1 > @primes);
+
+ return $primes[$idx];
+}
+
+if (@ARGV) {
+ my $n = $ARGV[0];
+ say "$n is ", is_prime($n) ? '' : 'not ', 'prime';
+ exit 0;
+}
+
+my $prod = 1;
+my $i = 0;
+while (1) {
+ $prod *= get_prime($i);
+ print $primes[$i], ' ';
+ last unless is_prime($prod + 1);
+
+ ++$i;
+}
+
+say $prod + 1;
diff --git a/challenge-012/feng-chang/perl5/ch-2.pl b/challenge-012/feng-chang/perl5/ch-2.pl
new file mode 100755
index 0000000000..c3c26e5f79
--- /dev/null
+++ b/challenge-012/feng-chang/perl5/ch-2.pl
@@ -0,0 +1,27 @@
+#!/bin/env perl
+
+use Modern::Perl;
+use List::Util qw(reduce);
+
+sub common_prefix {
+ my ($a, $b) = @_;
+ my @a = split //, $a;
+ my @b = split //, $b;
+
+ my $r = '';
+ my $i = 0;
+ while ($a[$i] && $b[$i] && $a[$i] eq $b[$i]) {
+ $r .= $a[$i++];
+ }
+
+ return $r;
+}
+
+chomp(my @paths = <>);
+my $common_path = reduce { common_prefix($a, $b) } @paths;
+
+my @c = split //, $common_path;
+pop @c while $c[-1] ne '/';
+pop @c if @c > 1;
+
+say 'common directory path: ', join('', @c);
diff --git a/challenge-012/feng-chang/perl5/paths.txt b/challenge-012/feng-chang/perl5/paths.txt
new file mode 100644
index 0000000000..1427e2dbc8
--- /dev/null
+++ b/challenge-012/feng-chang/perl5/paths.txt
@@ -0,0 +1,4 @@
+/a/b/c/d
+/a/b/cd
+/a/b/cc
+/a/b/c/d/e
diff --git a/challenge-012/feng-chang/perl6/ch-1.p6 b/challenge-012/feng-chang/perl6/ch-1.p6
new file mode 100755
index 0000000000..5e58b20b50
--- /dev/null
+++ b/challenge-012/feng-chang/perl6/ch-1.p6
@@ -0,0 +1,12 @@
+#!/bin/env perl6
+
+my $euc = (^∞).grep: *.is-prime;
+
+my $prod = 1;
+for 0 .. ∞ -> Int $i {
+ $prod *= $euc[$i];
+ print $euc[$i], ' ';
+ last unless ($prod + 1).is-prime;
+
+ LAST { say $prod + 1 }
+}
diff --git a/challenge-012/feng-chang/perl6/ch-2.p6 b/challenge-012/feng-chang/perl6/ch-2.p6
new file mode 100755
index 0000000000..1ea095468d
--- /dev/null
+++ b/challenge-012/feng-chang/perl6/ch-2.p6
@@ -0,0 +1,17 @@
+#!/bin/env perl6
+
+sub common_prefix(Str $a, Str $b) {
+ my @a = $a.comb;
+ my @b = $b.comb;
+
+ for 0..∞ -> $i {
+ last unless @a[$i].defined && @b[$i].defined && @a[$i] eq @b[$i];
+ LAST { return @a[0 .. $i - 1].join }
+ }
+}
+
+my @c = ([[&common_prefix]] 'paths.txt'.IO.lines).comb;
+@c.pop while @c[* - 1] ne '/';
+@c.pop if @c.elems > 1;
+
+say 'common directory path: ', @c.join;
diff --git a/challenge-012/feng-chang/perl6/paths.txt b/challenge-012/feng-chang/perl6/paths.txt
new file mode 100644
index 0000000000..1427e2dbc8
--- /dev/null
+++ b/challenge-012/feng-chang/perl6/paths.txt
@@ -0,0 +1,4 @@
+/a/b/c/d
+/a/b/cd
+/a/b/cc
+/a/b/c/d/e