Changeable words

var file = File("unixdict.txt")

if (!file.exists) {
    require('LWP::Simple')
    say ":: Retrieving #{file} from internet..."
    %S<LWP::Simple>.mirror(
        'https://web.archive.org/web/20180611003215if_/' +
        'http://www.puzzlers.org:80/pub/wordlists/unixdict.txt',
    'unixdict.txt')
}

var words  = file.read.words
var bucket = Hash()
var count = 0

words.each {|word|

    var len = word.len

    len > 11 || next
    bucket{len} := []

    bucket{len}.each{|prev|
        if (prev ^ word -> count("\0") == len-1) {
            printf("%2d: %20s <-> %s\n", ++count, prev, word)
        }
    }
    bucket{len} << word
}

Output:

 1:         aristotelean <-> aristotelian
 2:       claustrophobia <-> claustrophobic
 3:         committeeman <-> committeemen
 4:       committeewoman <-> committeewomen
 5:        complementary <-> complimentary
 6:         confirmation <-> conformation
 7:        congresswoman <-> congresswomen
 8:         councilwoman <-> councilwomen
 9:         craftsperson <-> draftsperson
10:         eavesdropped <-> eavesdropper
11:         frontiersman <-> frontiersmen
12:       handicraftsman <-> handicraftsmen
13:         incommutable <-> incomputable
14:         installation <-> instillation
15:         kaleidescope <-> kaleidoscope
16:         neuroanatomy <-> neuroanotomy
17:         newspaperman <-> newspapermen
18:         nonagenarian <-> nonogenarian
19:         onomatopoeia <-> onomatopoeic
20:         philanthrope <-> philanthropy
21:         prescription <-> proscription
22:        schizophrenia <-> schizophrenic
23:        shakespearean <-> shakespearian
24:         spectroscope <-> spectroscopy
25:        underclassman <-> underclassmen
26:        upperclassman <-> upperclassmen

Last updated