diff options
| author | Adam Russell <ac.russell@live.com> | 2019-09-15 03:01:47 -0400 |
|---|---|---|
| committer | Adam Russell <ac.russell@live.com> | 2019-09-15 03:01:47 -0400 |
| commit | a0c0a4c3a91729afb51851645c22aee6c336e652 (patch) | |
| tree | 243f3f0ceeac41f240c7cd677efce8b8ecc2c890 | |
| parent | e4e13916c4d132bd6f64695ad7794c1051427704 (diff) | |
| download | perlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.tar.gz perlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.tar.bz2 perlweeklychallenge-club-a0c0a4c3a91729afb51851645c22aee6c336e652.zip | |
initial commit
| -rw-r--r-- | challenge-025/adam-russell/blog.txt | 0 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/CypherCard.pm | 15 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/Deck.pm | 150 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/Rank.pm | 4 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/Suit.pm | 9 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/ch-1.pl | 83 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/ch-2.pl | 0 |
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 |
