in reply to cryptquote solver

Gee, it seems as if everyone has done this at one time or another... :-)

My approach avoided regular expressions. I just attempted to build a one-to-one mapping between two words. If I could do it, they "matched" in the sense that one could be transformed to the other. When successful, the following function returns a reference to a hash that shows the mapping required to get from the first word to the second. It returns undef on failure.

sub possible_match { my ($word1, $word2) = @_; return undef unless length( $word1 ) == length( $word2 ); my ( %one, %two ); for ( 0 .. length( $word1 ) - 1) { my $c1 = substr($word1, $_, 1); my $c2 = substr($word2, $_, 1); return undef if exists $one{ $c1 } and $one{ $c1 } ne $c2; return undef if exists $two{ $c2 } and $two{ $c2 } ne $c1; $one{ $c1 } = $c2; $two{ $c2 } = $c1; } return \%one; }
For example, possible_match('too', 'see') would return { t => 's', o => 'e' }.

-sauoq
"My two cents aren't worth a dime.";