view python/anagram.py @ 911:6fbbe5f0bc6b default tip

add silvermirror/unison alternative
author Jeff Hammel <k0scist@gmail.com>
date Sun, 14 Apr 2024 15:00:41 -0700
parents 83618049c2ff
children
line wrap: on
line source

#!/usr/bin/env python

import os

dictionary = []

def read_dictionary(f):
    for name in f.readlines():
        name = name.strip('\n')
        word = ''.join(name.split()).lower()
        dictionary.append(word)

def is_in(string1, string2):

    string2 = list(string2)

    try:
        for i in string1:
            string2.remove(i)
    except ValueError:
        return None

    return ''.join(string2)

def anagramize(theword, wordlist, level=0):

    if 0:
        print('%s%s : %s' % ('-' * level, theword, wordlist))

    anagrams = []

    # start the search with a new word
    for index in range(len(wordlist)):
        word = wordlist[index]
        subword = is_in(word, theword)
        if subword == '':
            anagrams.append(word)
            continue

        if subword is None:
            continue


        sublist = [ i for i in wordlist[index:]
                    if is_in(i, subword) is not None ]
        subgram = anagramize(subword, sublist, level+1)

        if subgram is not None:
            anagrams += [ ' '.join((word, i)) for i in subgram ]

    if 0:
        print('%s%s returning %s' % ('-' * level, theword, anagrams))

    if anagrams:
        return anagrams
    return None

if __name__ == '__main__':
    import sys
    from optparse import OptionParser

    parser = OptionParser()
    parser.add_option("-f", dest="filename", help="dictionary to read",
                      default='')
    (options, args) = parser.parse_args()

    if not os.path.exists(options.filename):

        dicts = [ '/home/jhammel/docs/dict.txt',
                  '/usr/share/dict/cracklib-small',
                  '/usr/share/dict/american-english' ]

        for i in dicts:
            if os.path.exists(i):
                options.filename = i
                break
        else:
            print('Dictionary not found')
            parser.print_help()
            sys.exit(1)

    if not args:
        print('please provide an anagram')
        sys.exit(0)

    with open(options.filename, 'r') as f:
        read_dictionary(f)

    # XXX could cleanup
    anagram = ' '.join(args)
    anagram = ''.join(anagram.split()).lower()

    # don't use letter names
    dictionary = [ i for i in dictionary if (len(i) > 1) or i in 'ai' ]

    wordlist = [ i for i in dictionary
                 if i and is_in(i, anagram) is not None ]

    anagrams = anagramize(anagram, wordlist)

    if anagrams:
        print('\n'.join(anagrams))