From 7cd908d231c1130a6e1bb25f5732043b9e35fb24 Mon Sep 17 00:00:00 2001 From: Joelle Maslak Date: Sat, 6 Jul 2019 12:21:28 -0600 Subject: Add solutions for 15.2.1 --- challenge-015/joelle-maslak/perl5/ch-2.pl | 45 +++++++++++++++++++++++++++++++ challenge-015/joelle-maslak/perl6/ch-2.p6 | 28 +++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100755 challenge-015/joelle-maslak/perl5/ch-2.pl create mode 100755 challenge-015/joelle-maslak/perl6/ch-2.p6 diff --git a/challenge-015/joelle-maslak/perl5/ch-2.pl b/challenge-015/joelle-maslak/perl5/ch-2.pl new file mode 100755 index 0000000000..076e7d7255 --- /dev/null +++ b/challenge-015/joelle-maslak/perl5/ch-2.pl @@ -0,0 +1,45 @@ +#!/usr/bin/env perl +use v5.26; +use strict; +use warnings; + +# Turn on method signatures +use feature 'signatures'; +no warnings 'experimental::signatures'; + +use autodie; + +die("Usage: $0 [--decrypt] ") unless @ARGV == 1 or @ARGV == 2; +die("Usage: $0 [--decrypt] ") unless @ARGV == 1 or $ARGV[0] eq '--decrypt'; +die("Usage: $0 [--decrypt] ") unless $ARGV[-1] =~ m/^ [a-z]+ $/isx; + +my $key = $ARGV[-1]; +my $decrypt = @ARGV == 2; + +my (@keys) = map { ord($_) - ord('a') } + split //, fc $key; + +# Do we decrypt? +@keys = map { 26 - $_ } @keys if $decrypt; + +my @input; +while ( my $line = ) { push @input, split( //, $line ) } + +foreach my $c (@input) { + my $offset = $keys[0]; + + if ( $c =~ m/ [a-z] /x ) { + push @keys, shift @keys; # Circular buffer + my $new = ord($c) + $offset; + $new -= 26 if $new > ord('z'); + print chr($new); + } elsif ( $c =~ m/ [A-Z] /x ) { + push @keys, shift @keys; # Circular buffer + my $new = ord($c) + $offset; + $new -= 26 if $new > ord('Z'); + print chr($new); + } else { + print $c; + } +} + diff --git a/challenge-015/joelle-maslak/perl6/ch-2.p6 b/challenge-015/joelle-maslak/perl6/ch-2.p6 new file mode 100755 index 0000000000..087f79ed6d --- /dev/null +++ b/challenge-015/joelle-maslak/perl6/ch-2.p6 @@ -0,0 +1,28 @@ +#!/usr/bin/env perl6 +use v6; + +sub MAIN(Str:D $key where { $_ ~~ m:i/^ <[a..z]>+ $/ }, Bool :$decrypt? ) { + my @key-chars = $key.fc.comb; + + my @input = $*IN.slurp.comb; + + for @input -> $c { + my $offset = @key-chars[0].ord - 'a'.ord; + $offset = 26 - $offset if $decrypt; + + if $c ~~ m/ <[a..z]> / { + @key-chars.append: @key-chars.shift; # Circular buffer + my $new = $c.ord + $offset; + $new -= 26 if $new > 'z'.ord; + print $new.chr; + } elsif $c ~~ m/ <[A..Z]> / { + @key-chars.append: @key-chars.shift; # Circular buffer + my $new = $c.ord + $offset; + $new -= 26 if $new > 'Z'.ord; + print $new.chr; + } else { + print $c; + } + } +} + -- cgit