diff options
| -rw-r--r-- | challenge-025/adam-russell/perl5/ch-1.pl | 181 | ||||
| -rw-r--r-- | challenge-025/adam-russell/perl5/ch-2.pl | 83 |
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 |
