aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--challenge-025/adam-russell/perl5/ch-1.pl181
-rw-r--r--challenge-025/adam-russell/perl5/ch-2.pl83
2 files changed, 194 insertions, 70 deletions
diff --git a/challenge-025/adam-russell/perl5/ch-1.pl b/challenge-025/adam-russell/perl5/ch-1.pl
index 0c0a85b371..fa6c1ac217 100644
--- a/challenge-025/adam-russell/perl5/ch-1.pl
+++ b/challenge-025/adam-russell/perl5/ch-1.pl
@@ -1,83 +1,124 @@
use strict;
use warnings;
##
-# Create script to implement Chaocipher.
+# Generate a longest sequence of "English Pokemon" names.
##
-use Deck;
+use Graph;
-sub split_deck{
- my($deck) = @_;
- my(@red, @black);
- my $card = $deck->deal_one();
- while($card){
- if($card->{suit}){
- push @black, $card;
- }
+sub build_pokegraph{
+ my @pokemon;
+ my %first_letter_name;
+ my $graph = new Graph();
+ while(my $pokemon = <DATA>){
+ $pokemon = lc($pokemon);
+ chomp($pokemon);
+ my $first_letter = substr($pokemon, 0, 1);
+ if($first_letter_name{$first_letter}){
+ push @{$first_letter_name{$first_letter}}, $pokemon;
+ }
else{
- push @red, $card;
- }
- $card = $deck->deal_one();
+ $first_letter_name{$first_letter} = [$pokemon];
+ }
+ push @pokemon, $pokemon;
}
- return(new Deck(\@red), new Deck(\@black));
+ for my $pokemon (@pokemon){
+ $graph->add_vertex($pokemon) if !$graph->has_vertex($pokemon);
+ my $child_nodes = $first_letter_name{substr($pokemon, -1)};
+ for my $n (@{$child_nodes}){
+ $graph->add_vertex($n) if !$graph->has_vertex($n);
+ $graph->add_weighted_edge($pokemon, $n, (-1 * length($n))) if !$graph->has_edge($pokemon, $n);
+ $graph->delete_edge($pokemon, $n) if $graph->has_a_cycle();
+ }
+ }
+ return (\@pokemon, $graph);
}
-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";
+ my ($pokemon, $graph) = build_pokegraph();
+ my $apsp = $graph->APSP_Floyd_Warshall();
+ my $max_path;
+ my $max_path_length = -1;
+ for my $p0 (@{$pokemon}){
+ for my $p1 (@{$pokemon}){
+ my @vertices = $apsp->path_vertices($p0, $p1);
+ my $l = join("", @vertices);
+ if(length($l) > $max_path_length){
+ $max_path_length = length($l);
+ $max_path = join("-", @vertices);
+ }
+ }
+ }
+ print "$max_path $max_path_length\n";
}
__DATA__
-ATTACKATDAWN
+audino
+bagon
+baltoy
+banette
+bidoof
+braviary
+bronzor
+carracosta
+charmeleon
+cresselia
+croagunk
+darmanitan
+deino
+emboar
+emolga
+exeggcute
+gabite
+girafarig
+gulpin
+haxorus
+heatmor
+heatran
+ivysaur
+jellicent
+jumpluff
+kangaskhan
+kricketune
+landorus
+ledyba
+loudred
+lumineon
+lunatone
+machamp
+magnezone
+mamoswine
+nosepass
+petilil
+pidgeotto
+pikachu
+pinsir
+poliwrath
+poochyena
+porygon2
+porygonz
+registeel
+relicanth
+remoraid
+rufflet
+sableye
+scolipede
+scrafty
+seaking
+sealeo
+silcoon
+simisear
+snivy
+snorlax
+spoink
+starly
+tirtouga
+trapinch
+treecko
+tyrogue
+vigoroth
+vulpix
+wailord
+wartortle
+whismur
+wingull
+yamask
diff --git a/challenge-025/adam-russell/perl5/ch-2.pl b/challenge-025/adam-russell/perl5/ch-2.pl
index e69de29bb2..0c0a85b371 100644
--- a/challenge-025/adam-russell/perl5/ch-2.pl
+++ b/challenge-025/adam-russell/perl5/ch-2.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