#!perl -w
# Find words which become the same if all occurrences of one letter
# are change to a different letter
#
# Copyright 2017 Ken Takusagawa
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see .
#open FI,'/usr/share/dict/american-english-huge' or die;
while(){
chomp;
die if /_/; #our placeholder
die if /\^/; #our placeholder for uppercase letters
push@words,$_;
}
#flush so tee can see progress
#$|=1;
#no more need to flush because huge output
for$coll('aa'..'zz'){
die unless ($x,$y)=($coll=~/(.)(.)/);
next unless $x lt $y;
$Xx=uc$x;
$Yy=uc$y;
#print$coll;
undef %c;
for$orig(@words){
#because $_ is a reference and modifies the array
$_=$orig;
s/$x/_/g;
s/$y/_/g;
s/$Xx/\^/g;
s/$Yy/\^/g;
push @{$c{$_}},$orig;
}
$bad=0;
for(keys %c){
$n=scalar@{$c{$_}};
#penalty function = number of diagonals of N points.
$bad+=$n*($n-1)/2;
#$bad+=$c{$_}-1;
#$bad++ if $c{$_}>1;
}
print "score $bad $coll\n";
for(sort keys%c){
$n=scalar@{$c{$_}};
next unless $n>1;
print "item $_ ";
print scalar@{$c{$_}};
for(@{$c{$_}}){
print " $_";
}
print "\n";
}
}
# 14 minutes huge with full list