diff options
| author | Jaldhar H. Vyas <jaldhar@braincells.com> | 2019-07-07 18:29:39 -0400 |
|---|---|---|
| committer | Jaldhar H. Vyas <jaldhar@braincells.com> | 2019-07-07 18:29:39 -0400 |
| commit | b41cb33ca5ee3a1b8be383dee072c81fc5f7621c (patch) | |
| tree | 93038766d69a44452d8a774f75c962963253f38a | |
| parent | d058cc897094733ded2988aa03af754c92e7ab92 (diff) | |
| download | perlweeklychallenge-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.txt | 1 | ||||
| -rwxr-xr-x | challenge-015/jaldhar-h-vyas/perl5/ch-1.pl | 54 | ||||
| -rwxr-xr-x | challenge-015/jaldhar-h-vyas/perl5/ch-2.pl | 81 | ||||
| -rwxr-xr-x | challenge-015/jaldhar-h-vyas/perl6/ch-1.p6 | 16 | ||||
| -rwxr-xr-x | challenge-015/jaldhar-h-vyas/perl6/ch-2.p6 | 56 |
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); +} |
