aboutsummaryrefslogtreecommitdiff
path: root/challenge-015
diff options
context:
space:
mode:
authorYozen Hernandez <yzhernand@gmail.com>2019-07-05 00:34:27 -0400
committerYozen Hernandez <yzhernand@gmail.com>2019-07-05 00:34:27 -0400
commit30fe8d57573b0d423c3aa25ca830f1e0381c00a2 (patch)
treeaa511eee6248cf88b654ec3f64b073a12b4ef29d /challenge-015
parente3433997137a13f8304a8888d92cd9ece46d1e8f (diff)
downloadperlweeklychallenge-club-30fe8d57573b0d423c3aa25ca830f1e0381c00a2.tar.gz
perlweeklychallenge-club-30fe8d57573b0d423c3aa25ca830f1e0381c00a2.tar.bz2
perlweeklychallenge-club-30fe8d57573b0d423c3aa25ca830f1e0381c00a2.zip
Added solutions by Yozen Hernandez for challenges 1 and 2 for week 15
Diffstat (limited to 'challenge-015')
-rw-r--r--challenge-015/yozen-hernandez/blog.txt2
-rwxr-xr-xchallenge-015/yozen-hernandez/perl5/ch-1.pl49
-rwxr-xr-xchallenge-015/yozen-hernandez/perl5/ch-2.pl51
3 files changed, 102 insertions, 0 deletions
diff --git a/challenge-015/yozen-hernandez/blog.txt b/challenge-015/yozen-hernandez/blog.txt
new file mode 100644
index 0000000000..b917c195f1
--- /dev/null
+++ b/challenge-015/yozen-hernandez/blog.txt
@@ -0,0 +1,2 @@
+https://yzhernand.github.io/posts/perl-weekly-challenge-15/
+https://yzhernand.github.io/posts/perl-weekly-challenge-15-part2/
diff --git a/challenge-015/yozen-hernandez/perl5/ch-1.pl b/challenge-015/yozen-hernandez/perl5/ch-1.pl
new file mode 100755
index 0000000000..6769bc633d
--- /dev/null
+++ b/challenge-015/yozen-hernandez/perl5/ch-1.pl
@@ -0,0 +1,49 @@
+#!/usr/bin/env perl
+
+use v5.24;
+use strict;
+use warnings;
+use feature qw(say state signatures);
+no warnings "experimental::signatures";
+
+# Write a script to generate first 10 strong and weak prime numbers.
+# For example, the nth prime number is represented by p(n).
+#
+# p(1) = 2
+# p(2) = 3
+# p(3) = 5
+# p(4) = 7
+# p(5) = 11
+#
+# Strong Prime number p(n) when p(n) > [ p(n-1) + p(n+1) ] / 2
+# Weak Prime number p(n) when p(n) < [ p(n-1) + p(n+1) ] / 2
+
+sub is_prime ($n) {
+ return 0 if grep { $n % $_ == 0 } ( 2 .. sqrt($n) );
+
+ return 1;
+}
+
+sub prime_iterator {
+ my $n = 1;
+ return sub {
+ 1 until is_prime ++$n;
+ return $n;
+ }
+}
+
+my ( @primes, @strong_primes, @weak_primes, @bal_primes );
+my @which_arr = ( \@bal_primes, \@strong_primes, \@weak_primes );
+my $iter = prime_iterator();
+my $n = 10;
+
+while ( ( @strong_primes < $n ) || ( @weak_primes < $n ) ) {
+ push @primes, $iter->();
+ if ( @primes > 2 ) {
+ push $which_arr[ ( $primes[-2] <=> ( $primes[-3] + $primes[-1] ) / 2 )
+ ]->@*, $primes[-2];
+ }
+}
+
+say "First 10 strong primes: " . join( ", ", @strong_primes );
+say "First 10 weak primes: " . join( ", ", @weak_primes );
diff --git a/challenge-015/yozen-hernandez/perl5/ch-2.pl b/challenge-015/yozen-hernandez/perl5/ch-2.pl
new file mode 100755
index 0000000000..4f66bbb443
--- /dev/null
+++ b/challenge-015/yozen-hernandez/perl5/ch-2.pl
@@ -0,0 +1,51 @@
+#!/usr/bin/env perl
+
+use v5.24;
+use strict;
+use warnings;
+use feature qw(say state signatures);
+no warnings "experimental::signatures";
+use Carp;
+
+# Write a script to implement Vigenère cipher. The script should be able encode
+# and decode. Checkout wiki page for more information.
+
+my %tabula;
+@tabula{ "A" .. "Z" } = ( 0 .. 25 );
+
+sub vigenere (%args) {
+ croak "Must supply the 'message' and 'key' arguments to this function.\n"
+ unless ( exists $args{message} && exists $args{key} );
+
+ my @message = split //, uc($args{message});
+ my @key = split //, uc($args{key});
+ my $decode = ( exists $args{decode} && $args{decode} != 0 ) || -1;
+ return join "", map {
+ ( "A" .. "Z" )[
+ ( $tabula{ $message[$_] }
+ + ( ( -1 * $decode ) * $tabula{ $key[ $_ % @key ] } ) ) %
+ keys %tabula
+ ]
+ } ( 0 .. @message - 1 );
+}
+
+sub encode_vigenere {
+ my %args = @_;
+ vigenere(%args, decode => 0);
+}
+
+sub decode_vigenere {
+ my %args = @_;
+ vigenere(%args, decode => 1);
+}
+
+my $message = $ARGV[0] // "ATTACKATDAWN";
+my $key = $ARGV[1] // "LEMON";
+
+# Encrypt
+my $encrypted = encode_vigenere( message => $message, key => $key );
+say "Encrypted: $encrypted";
+
+# Decrypt
+my $decoded = decode_vigenere( message => $encrypted, key => $key, decode => 0 );
+say "Decrypted: $decoded";