aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJaldhar H. Vyas <jaldhar@braincells.com>2019-07-07 18:29:39 -0400
committerJaldhar H. Vyas <jaldhar@braincells.com>2019-07-07 18:29:39 -0400
commitb41cb33ca5ee3a1b8be383dee072c81fc5f7621c (patch)
tree93038766d69a44452d8a774f75c962963253f38a
parentd058cc897094733ded2988aa03af754c92e7ab92 (diff)
downloadperlweeklychallenge-club-b41cb33ca5ee3a1b8be383dee072c81fc5f7621c.tar.gz
perlweeklychallenge-club-b41cb33ca5ee3a1b8be383dee072c81fc5f7621c.tar.bz2
perlweeklychallenge-club-b41cb33ca5ee3a1b8be383dee072c81fc5f7621c.zip
Challenge 15 by Jaldhar H. Vyas
-rw-r--r--challenge-015/jaldhar-h-vyas/blog.txt1
-rwxr-xr-xchallenge-015/jaldhar-h-vyas/perl5/ch-1.pl54
-rwxr-xr-xchallenge-015/jaldhar-h-vyas/perl5/ch-2.pl81
-rwxr-xr-xchallenge-015/jaldhar-h-vyas/perl6/ch-1.p616
-rwxr-xr-xchallenge-015/jaldhar-h-vyas/perl6/ch-2.p656
5 files changed, 208 insertions, 0 deletions
diff --git a/challenge-015/jaldhar-h-vyas/blog.txt b/challenge-015/jaldhar-h-vyas/blog.txt
new file mode 100644
index 0000000000..9764a21e3a
--- /dev/null
+++ b/challenge-015/jaldhar-h-vyas/blog.txt
@@ -0,0 +1 @@
+https://www.braincells.com/perl/2019/07/perl_weekly_challenge_week_15.html \ No newline at end of file
diff --git a/challenge-015/jaldhar-h-vyas/perl5/ch-1.pl b/challenge-015/jaldhar-h-vyas/perl5/ch-1.pl
new file mode 100755
index 0000000000..7541772f6d
--- /dev/null
+++ b/challenge-015/jaldhar-h-vyas/perl5/ch-1.pl
@@ -0,0 +1,54 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use 5.010;
+
+sub isPrime {
+ my ($n) = @_;
+
+ if ($n < 2) {
+ return undef;
+ }
+
+ if ($n == 2) {
+ return 1;
+ }
+
+ for my $i (2 .. sqrt($n)) {
+ if ($n % $i == 0) {
+ return undef;
+ }
+ }
+
+ return 1;
+}
+
+sub nextPrime {
+ state $i = 1;
+
+ while ($i++) {
+ if (isPrime($i)) {
+ return $i;
+ }
+ }
+}
+
+my @primes = (nextPrime(), nextPrime());
+my @strongPrimes;
+my @weakPrimes;
+
+for (my $i = 1; scalar @strongPrimes < 10 || scalar @weakPrimes < 10; $i++) {
+ push @primes, nextPrime();
+
+ my $meanOfNeighboringPrimes = ($primes[$i - 1] + $primes[$i + 1]) / 2;
+ if ($primes[$i] > $meanOfNeighboringPrimes) {
+ push @strongPrimes, $primes[$i];
+ } elsif ($primes[$i] < $meanOfNeighboringPrimes) {
+ push @weakPrimes, $primes[$i];
+ }
+}
+
+say 'The 1st 10 strong Primes: ', join q{, }, @strongPrimes;
+# By the time we get 10 strong primes, we will have more than 10 weak primes
+# so slice off the first 10.
+say 'The 1st 10 weak Primes: ',join q{, }, @weakPrimes[0 .. 9];
diff --git a/challenge-015/jaldhar-h-vyas/perl5/ch-2.pl b/challenge-015/jaldhar-h-vyas/perl5/ch-2.pl
new file mode 100755
index 0000000000..1b10a04216
--- /dev/null
+++ b/challenge-015/jaldhar-h-vyas/perl5/ch-2.pl
@@ -0,0 +1,81 @@
+#!/usr/bin/perl
+use warnings;
+use strict;
+use 5.010;
+use English qw/ -no_match_vars /;
+use Getopt::Std;
+
+sub decrypt {
+ my ($key, $keylength, $tabulaRecta, $c) = @_;
+ state $i = 0;
+
+ return
+ chr(ord('A') + index($tabulaRecta->{$key->[$i++ % $keylength]}, $c));
+}
+
+sub encrypt {
+ my ($key, $keylength, $tabulaRecta, $c) = @_;
+ state $i = 0;
+
+ return
+ substr($tabulaRecta->{$key->[$i++ % $keylength]}, ord($c) - ord('A'), 1);
+}
+
+
+sub makeSquare {
+ my @shifted = ('Z', 'A' .. 'Y');
+
+ return map {
+ push @shifted, shift @shifted;
+ $_ => join q{}, @shifted;
+ } 'A' .. 'Z';
+}
+
+sub prep {
+ my ($string) = @_;
+
+ $string = uc $string;
+ $string =~ s/[^A-Z]//g;
+
+ return $string;
+}
+
+sub usage {
+ print<<"-USAGE-";
+ $PROGRAM_NAME -d -k <Str> -m <Str>
+ $PROGRAM_NAME -e -k <Str> -m <Str>
+
+ -d decrypt a message
+ -e encrypt a message
+ -k <Str> key for encryption/decryption
+ -m <Str> message to encrypt/decrypt
+-USAGE-
+ exit 0;
+}
+
+sub vigenere {
+ my @message = split //, $_[0];
+ my @key = split //, $_[1];
+ my $op = $_[2];
+
+ my %tabulaRecta = makeSquare();
+ my $keylength = scalar @key;
+ my $i = 0;
+
+ return
+ join q{}, map { $op->(\@key, $keylength, \%tabulaRecta, $_); } @message;
+}
+
+my %opts;
+getopts('dek:m:', \%opts);
+
+my $message = prep($opts{m} // usage());
+my $key = prep($opts{k} // usage());
+
+if (defined $opts{'d'}) {
+ say vigenere($message, $key, \&decrypt);
+} elsif (defined $opts{'e'}) {
+ say vigenere($message, $key, \&encrypt);
+} else {
+ usage();
+}
diff --git a/challenge-015/jaldhar-h-vyas/perl6/ch-1.p6 b/challenge-015/jaldhar-h-vyas/perl6/ch-1.p6
new file mode 100755
index 0000000000..ce8c751909
--- /dev/null
+++ b/challenge-015/jaldhar-h-vyas/perl6/ch-1.p6
@@ -0,0 +1,16 @@
+#!/usr/bin/perl6
+
+multi sub MAIN() {
+ my @primes = (1 .. ∞).grep({ .is-prime });
+
+ my @strongPrimes = (1 .. ∞)
+ .grep({ @primes[$_] > (@primes[$_ - 1] + @primes[$_ + 1]) / 2 })
+ .map({ @primes[$_] });
+
+ my @weakPrimes = (1 .. ∞)
+ .grep({ @primes[$_] < (@primes[$_ - 1] + @primes[$_ + 1]) / 2 })
+ .map({ @primes[$_] });
+
+ say 'The 1st 10 strong Primes: ', join q{, }, @strongPrimes[^10];
+ say 'The 1st 10 weak Primes: ',join q{, }, @weakPrimes[^10];
+} \ No newline at end of file
diff --git a/challenge-015/jaldhar-h-vyas/perl6/ch-2.p6 b/challenge-015/jaldhar-h-vyas/perl6/ch-2.p6
new file mode 100755
index 0000000000..6bd068804b
--- /dev/null
+++ b/challenge-015/jaldhar-h-vyas/perl6/ch-2.p6
@@ -0,0 +1,56 @@
+#!/usr/bin/perl6
+
+sub decrypt(@key, $keylength, %tabulaRecta, $c) {
+ state $i = 0;
+
+ return chr(ord('A') + index(%tabulaRecta{@key[$i++ % $keylength]}, $c));
+}
+
+sub encrypt(@key, $keylength, %tabulaRecta, $c) {
+ state $i = 0;
+
+ return substr(%tabulaRecta{@key[$i++ % $keylength]}, ord($c) - ord('A'), 1);
+}
+
+sub makeSquare {
+ return (0 .. 25)
+ .map({ ['A' .. 'Z'].rotate($_).join; })
+ .map({ $_.substr(0, 1) => $_});
+}
+
+sub prep {
+ my ($string) = @_;
+
+ $string = uc $string;
+ $string ~~ s:g/<-[A .. Z]>//;
+
+ return $string;
+}
+
+sub vigenère($k, $m, &op) {
+ my %tabulaRecta = makeSquare();
+ my @key = prep($k).comb;
+ my $keylength = @key.elems;
+ my @message = prep($m).comb;
+
+ @message
+ .map({ op(@key, $keylength, %tabulaRecta, $_) })
+ .join
+ .say;
+}
+
+multi sub MAIN (
+ Bool :$d!, #= decrypt a message
+ Str :$k!,
+ Str :$m!
+) {
+ vigenère($k, $m, &decrypt);
+}
+
+multi sub MAIN (
+ Bool :$e!, #= encrypt a message
+ Str :$k!, #= key for encryption/decryption
+ Str :$m! #= message to encrypt/decrypt
+) {
+ vigenère($k, $m, &encrypt);
+}