From 30fe8d57573b0d423c3aa25ca830f1e0381c00a2 Mon Sep 17 00:00:00 2001 From: Yozen Hernandez Date: Fri, 5 Jul 2019 00:34:27 -0400 Subject: Added solutions by Yozen Hernandez for challenges 1 and 2 for week 15 --- challenge-015/yozen-hernandez/blog.txt | 2 ++ challenge-015/yozen-hernandez/perl5/ch-1.pl | 49 +++++++++++++++++++++++++++ challenge-015/yozen-hernandez/perl5/ch-2.pl | 51 +++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 challenge-015/yozen-hernandez/blog.txt create mode 100755 challenge-015/yozen-hernandez/perl5/ch-1.pl create mode 100755 challenge-015/yozen-hernandez/perl5/ch-2.pl 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"; -- cgit