diff options
author | jluehrs2 <jluehrs2@uiuc.edu> | 2008-02-01 19:32:16 -0500 |
---|---|---|
committer | jluehrs2 <jluehrs2@uiuc.edu> | 2008-02-01 19:32:16 -0500 |
commit | a9192e616b43c223f2f6fc0d39a243fad515a030 (patch) | |
tree | cdb3741fe00e8861d73c941d99786a2d2e765081 | |
parent | 0fbcee116b0221c3985561b5cc91b4e782705b20 (diff) | |
download | games-word-a9192e616b43c223f2f6fc0d39a243fad515a030.tar.gz games-word-a9192e616b43c223f2f6fc0d39a243fad515a030.zip |
add shared_letters and shared_letters_by_position for mastermind style string comparisons
-rw-r--r-- | lib/Games/Word.pm | 42 |
1 files changed, 41 insertions, 1 deletions
diff --git a/lib/Games/Word.pm b/lib/Games/Word.pm index de51ad0..948828e 100644 --- a/lib/Games/Word.pm +++ b/lib/Games/Word.pm @@ -2,7 +2,8 @@ package Games::Word; require Exporter; @ISA = qw/Exporter/; -@EXPORT_OK = qw/random_permutation is_permutation all_permutations/; +@EXPORT_OK = qw/random_permutation is_permutation all_permutations + shared_letters shared_letters_by_position/; use strict; use warnings; @@ -48,6 +49,45 @@ sub all_permutations { return @ret; } +sub shared_letters { + my @a = sort split //, shift; + my @b = sort split //, shift; + + my @letters = (); + my ($a, $b) = (pop @a, pop @b); + while (defined $a && defined $b) { + if ($a eq $b) { + push @letters, $a; + ($a, $b) = (pop @a, pop @b); + } + elsif ($a lt $b) { + $a = pop @a; + } + else { + $b = pop @b; + } + } + + return @letters; +} + +sub shared_letters_by_position { + my @a = split //, shift; + my @b = split //, shift; + + my @letters = (); + while (my ($a, $b) = (pop @a, pop @b)) { + if ($a eq $b) { + push @letters, $a; + } + else { + push @letters, undef; + } + } + + return wantarray ? @letters : grep { defined } @letters; +} + =head1 NAME Games::Word - ??? |