aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Russell <ac.russell@live.com>2019-09-15 03:01:47 -0400
committerAdam Russell <ac.russell@live.com>2019-09-15 03:01:47 -0400
commita0c0a4c3a91729afb51851645c22aee6c336e652 (patch)
tree243f3f0ceeac41f240c7cd677efce8b8ecc2c890
parente4e13916c4d132bd6f64695ad7794c1051427704 (diff)
downloadperlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.tar.gz
perlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.tar.bz2
perlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.zip
initial commit
-rw-r--r--challenge-025/adam-russell/blog.txt0
-rw-r--r--challenge-025/adam-russell/perl5/CypherCard.pm15
-rw-r--r--challenge-025/adam-russell/perl5/Deck.pm150
-rw-r--r--challenge-025/adam-russell/perl5/Rank.pm4
-rw-r--r--challenge-025/adam-russell/perl5/Suit.pm9
-rw-r--r--challenge-025/adam-russell/perl5/ch-1.pl83
-rw-r--r--challenge-025/adam-russell/perl5/ch-2.pl0
7 files changed, 261 insertions, 0 deletions
diff --git a/challenge-025/adam-russell/blog.txt b/challenge-025/adam-russell/blog.txt
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-025/adam-russell/blog.txt
diff --git a/challenge-025/adam-russell/perl5/CypherCard.pm b/challenge-025/adam-russell/perl5/CypherCard.pm
new file mode 100644
index 0000000000..1fcd898cd0
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/CypherCard.pm
@@ -0,0 +1,15 @@
+package CypherCard;
+
+use boolean;
+
+sub new{
+ my ($pkg, $attr) = @_;
+ my $self = {};
+ if(defined($attr->{suit}) && defined($attr->{rank}) && defined($attr->{letter})){
+ $self = $attr;
+ }
+ bless($self, $pkg);
+ return $self;
+}
+
+true;
diff --git a/challenge-025/adam-russell/perl5/Deck.pm b/challenge-025/adam-russell/perl5/Deck.pm
new file mode 100644
index 0000000000..35bc550e6f
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/Deck.pm
@@ -0,0 +1,150 @@
+package Deck;
+
+use boolean;
+
+use CypherCard;
+use Suit qw/DIAMOND HEART SPADE CLUB/;
+use Rank qw/A TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN J Q K/;
+
+use constant ZENITH => 0;
+use constant NADIR => 13;
+
+our $index = 0;
+
+sub new{
+ my ($pkg, $pile) = @_;
+ my $self = $pile || create();
+ bless($self, $pkg);
+ $index = 0;
+ return $self;
+}
+
+##
+# Fisher-Yates shuffle
+##
+sub shuffle{
+ my ($self) = @_;
+ my $i = @{$self};
+ while(--$i){
+ my $j = int(rand($i + 1));
+ @{$self}[$i, $j] = @{$self}[$j, $i];
+ }
+ $index = 0;
+}
+
+sub print{
+ my ($self) = @_;
+ for my $card (@{$self}){
+ print $card->{suit}." ".$card->{rank}."\n";
+ }
+}
+
+sub deal_one{
+ my ($self) = @_;
+ return $self->[$index++];
+}
+
+sub card_at{
+ my ($self, $i) = @_;
+ return $self->[$i];
+}
+
+sub left_permute{
+ my($self, $i) = @_;
+ my $permutated = [];
+ for(my $j = ($i - 1); $j >= 0; $j--){
+ push @{$permutated}, $self->card_at($j);
+ }
+ for(my $j = 51; $j > $i; $j--){
+ push @{$permutated}, $self->card_at($j);
+ }
+ unshift @{$permutated}, $self->card_at($i);
+ my $zenith_plus_1 = $permutated->[ZENITH + 1];
+ splice @{$permutated}, ZENITH + 1, 1;
+ splice @{$permutated}, NADIR, 0, $zenith_plus_1;
+ $self = new Deck($permutated);
+}
+
+sub right_permute{
+ my($self, $i) = @_;
+ my $permutated = [];
+ for(my $j = ($i - 1); $j >= 0; $j--){
+ push @{$permutated}, $self->card_at($j);
+ }
+ for(my $j = 51; $j > $i; $j--){
+ push @{$permutated}, $self->card_at($j);
+ }
+ unshift @{$permutated}, $self->card_at($i);
+ my $bottom = $permutated->[ZENITH];
+ splice @{$permutated}, ZENITH, 1;
+ push @{$permutated}, $bottom;
+ my $zenith_plus_2 = $permutated->[ZENITH + 2];
+ splice @{$permutated}, ZENITH + 2, 1;
+ splice @{$permutated}, NADIR, 0, $zenith_plus_2;
+ $self = new Deck($permutated);
+}
+
+sub create{
+ my @deck=();
+ while(<DATA>){
+ chomp;
+ push(@deck, new CypherCard(eval($_)));
+ }
+ return \@deck;
+}
+
+true;
+
+__DATA__
+{suit => DIAMOND, rank => A, letter => q/N/}
+{suit => DIAMOND, rank => TWO, letter => q/O/}
+{suit => DIAMOND, rank => THREE, letter => q/P/}
+{suit => DIAMOND, rank => FOUR, letter => q/Q/}
+{suit => DIAMOND, rank => FIVE, letter => q/R/}
+{suit => DIAMOND, rank => SIX, letter => q/S/}
+{suit => DIAMOND, rank => SEVEN, letter => q/T/}
+{suit => DIAMOND, rank => EIGHT, letter => q/U/}
+{suit => DIAMOND, rank => NINE, letter => q/V/}
+{suit => DIAMOND, rank => TEN, letter => q/W/}
+{suit => DIAMOND, rank => J, letter => q/X/}
+{suit => DIAMOND, rank => Q, letter => q/Y/}
+{suit => DIAMOND, rank => K, letter => q/Z/}
+{suit => HEART, rank => A, letter => q/A/}
+{suit => HEART, rank => TWO, letter => q/B/}
+{suit => HEART, rank => THREE, letter => q/C/}
+{suit => HEART, rank => FOUR, letter => q/D/}
+{suit => HEART, rank => FIVE, letter => q/E/}
+{suit => HEART, rank => SIX, letter => q/F/}
+{suit => HEART, rank => SEVEN, letter => q/G/}
+{suit => HEART, rank => EIGHT, letter => q/H/}
+{suit => HEART, rank => NINE, letter => q/I/}
+{suit => HEART, rank => TEN, letter => q/J/}
+{suit => HEART, rank => J, letter => q/K/}
+{suit => HEART, rank => Q, letter => q/L/}
+{suit => HEART, rank => K, letter => q/M/}
+{suit => SPADE, rank => A, letter => q/A/}
+{suit => SPADE, rank => TWO, letter => q/B/}
+{suit => SPADE, rank => THREE, letter => q/C/}
+{suit => SPADE, rank => FOUR, letter => q/D/}
+{suit => SPADE, rank => FIVE, letter => q/E/}
+{suit => SPADE, rank => SIX, letter => q/F/}
+{suit => SPADE, rank => SEVEN, letter => q/G/}
+{suit => SPADE, rank => EIGHT, letter => q/H/}
+{suit => SPADE, rank => NINE, letter => q/I/}
+{suit => SPADE, rank => TEN, letter => q/J/}
+{suit => SPADE, rank => J, letter => q/K/}
+{suit => SPADE, rank => Q, letter => q/L/}
+{suit => SPADE, rank => K, letter => q/M/}
+{suit => CLUB, rank => A, letter => q/N/}
+{suit => CLUB, rank => TWO, letter => q/O/}
+{suit => CLUB, rank => THREE, letter => q/P/}
+{suit => CLUB, rank => FOUR, letter => q/Q/}
+{suit => CLUB, rank => FIVE, letter => q/R/}
+{suit => CLUB, rank => SIX, letter => q/S/}
+{suit => CLUB, rank => SEVEN, letter => q/T/}
+{suit => CLUB, rank => EIGHT, letter => q/U/}
+{suit => CLUB, rank => NINE, letter => q/V/}
+{suit => CLUB, rank => TEN, letter => q/W/}
+{suit => CLUB, rank => J, letter => q/X/}
+{suit => CLUB, rank => Q, letter => q/Y/}
+{suit => CLUB, rank => K, letter => q/Z/}
diff --git a/challenge-025/adam-russell/perl5/Rank.pm b/challenge-025/adam-russell/perl5/Rank.pm
new file mode 100644
index 0000000000..82bcb9a7df
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/Rank.pm
@@ -0,0 +1,4 @@
+package Rank;
+use boolean;
+use Class::Enum qw/A TWO THREE FOUR FIVE SIX SEVEN EIGHT NINE TEN J Q K/;
+true;
diff --git a/challenge-025/adam-russell/perl5/Suit.pm b/challenge-025/adam-russell/perl5/Suit.pm
new file mode 100644
index 0000000000..aacd140c9f
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/Suit.pm
@@ -0,0 +1,9 @@
+package Suit;
+use boolean;
+use Class::Enum(
+ DIAMOND => {ordinal => 0},
+ HEART => {ordinal => 0},
+ SPADE => {ordinal => 1},
+ CLUB => {ordinal => 1},
+);
+true;
diff --git a/challenge-025/adam-russell/perl5/ch-1.pl b/challenge-025/adam-russell/perl5/ch-1.pl
new file mode 100644
index 0000000000..0c0a85b371
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/ch-1.pl
@@ -0,0 +1,83 @@
+use strict;
+use warnings;
+##
+# Create script to implement Chaocipher.
+##
+use Deck;
+
+sub split_deck{
+ my($deck) = @_;
+ my(@red, @black);
+ my $card = $deck->deal_one();
+ while($card){
+ if($card->{suit}){
+ push @black, $card;
+ }
+ else{
+ push @red, $card;
+ }
+ $card = $deck->deal_one();
+ }
+ return(new Deck(\@red), new Deck(\@black));
+}
+
+sub encrypt_letter{
+ my($letter, $left, $right) = @_;
+ my $index = 0;
+ my $plaintext_index;
+ my $card = $right->deal_one();
+ while($card){
+ if($card->{letter} eq $letter){
+ $plaintext_index = $index;
+ last;
+ }
+ $card = $right->deal_one();
+ $index++;
+ }
+ my $cyphertext = $left->card_at($plaintext_index)->{letter};
+ $left->left_permute();
+ $right->right_permute();
+ return $cyphertext;
+}
+
+sub decrypt_letter{
+ my($letter, $left, $right) = @_;
+ my $index = 0;
+ my $plaintext_index;
+ my $card = $left->deal_one();
+ while($card){
+ if($card->{letter} eq $letter){
+ $plaintext_index = $index;
+ last;
+ }
+ $card = $left->deal_one();
+ $index++;
+ }
+ my $plaintext = $right->card_at($plaintext_index)->{letter};
+ $left->left_permute();
+ $right->right_permute();
+ return $plaintext;
+}
+
+
+MAIN:{
+ my $message = <DATA>;
+ chomp($message);
+ my $deck = new Deck();
+ $deck->shuffle();
+ my ($left, $right) = split_deck($deck);
+ my @letters = split(//, $message);
+ my @cyphertext;
+ for my $c (@letters){
+ push @cyphertext, encrypt_letter($c, $left, $right);
+ }
+ print join("", @cyphertext) . "\n";
+ my @plaintext;
+ for my $c (@cyphertext){
+ push @plaintext, decrypt_letter($c, $left, $right);
+ }
+ print join("", @plaintext) . "\n";
+}
+
+__DATA__
+ATTACKATDAWN
diff --git a/challenge-025/adam-russell/perl5/ch-2.pl b/challenge-025/adam-russell/perl5/ch-2.pl
new file mode 100644
index 0000000000..e69de29bb2
--- /dev/null
+++ b/challenge-025/adam-russell/perl5/ch-2.pl