#!/usr/bin/env python """ Word arithmetic Script helps to generate combinations of words on which arithmetic can be applied assuming the characters represent digits AEIBCDFGHI (A=0, E=1, I=2, B=3, C=4, D=5, F=6, G=7, H=8, I=9) Some word combinations for the set of chars above are: AID + ICED = IDEA (024 + 2415 = 2510) DADA + ADD = DEAD (5050 + 055 = 5105) """ import sys import string import random import optparse DEFAULT_LETTERS = 'AEIOUBCDFG' def load_words(words_fname): return [word.strip() for word in file(words_fname).readlines()] def choose_words(letters, words): letters = set(letters) chosen_words = [word for word in words if letters.issuperset(set(word))] return chosen_words def compute_word_values(words, letters): value_map = {} lmap = dict([ (letter, str(index).strip()) for index, letter in enumerate(letters)]) for word in words: value = int(''.join([lmap[l] for l in word])) value_map[word] = value; return value_map def find_combinations(value_map): combinations = [] for word1, value1 in value_map.iteritems(): for word2, value2 in value_map.iteritems(): for word3, value3 in value_map.iteritems(): if value1 + value2 == value3: combinations.append((word1, word2, word3)) return combinations def remove_duplicate_combinations(combinations): combos = {} for c in combinations: word1, word2, word3 = c l = [word1, word2] l.sort() key = '.'.join(l) combos[key] = c combos = combos.values() return combos def show_combinations(combinations): for w1, w2, w3 in combinations: print "%s + %s = %s" % (w1, w2, w3) def main(options): letters = list(options.letters)[:10] print "letters = %s" % (', '.join(["%s=%d" % (l,index) for index, l in enumerate(letters)])) words_fname = options.words_file words = load_words(words_fname) words = choose_words(letters, words) value_map = compute_word_values(words, letters) combinations = find_combinations(value_map) combinations = remove_duplicate_combinations(combinations) show_combinations(combinations) if __name__ == "__main__": parser = optparse.OptionParser() parser.add_option('-w', '--words-file', help='word list') parser.add_option('-l', '--letters', help='ten letter sequence', default=DEFAULT_LETTERS) (options, args) = parser.parse_args() if options.words_file is None: print '--words-file is needed' sys.exit(-1) main(options)