Last active
March 7, 2022 10:39
-
-
Save ijkilchenko/c24d6ff8f926cff1924618d9e22395e2 to your computer and use it in GitHub Desktop.
bananagrams_completer
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
from itertools import combinations | |
from collections import defaultdict, Counter | |
def to_multiset(word): | |
return frozenset(Counter(word).items()) | |
def find_longer_words(dictionary, words): | |
for num_words in range(2, min(len(words), 10)): | |
print() | |
print('Checking combinations of length %i' % num_words) | |
for combination in combinations(enumerate(words), num_words): | |
old_words = [value for key, value in combination] | |
joined = ''.join(old_words) | |
if to_multiset(joined) in dictionary: | |
new_words = dictionary[to_multiset(joined)] | |
move = '%s from %s' % (new_words, old_words) | |
print(move) | |
print() | |
if __name__ == '__main__': | |
# Dictionary file: | |
# Other possible dictionary file: | |
# http://www.gwicks.net/dictionaries.htm | |
# https://raw.githubusercontent.com/dwyl/english-words/master/words_alpha.txt | |
# /usr/share/dict/words | |
# Filter dictionary file by word length and put all words into a set | |
with open('/usr/share/dict/words') as file: | |
lines = file.read().splitlines() | |
lines = filter(lambda word: len(word) >= 3, lines) | |
dictionary = {word: frozenset(to_multiset(word)) for word in lines} # Values are a set of the word with multiplicity | |
# Create a backwards mapping, from the set of letters back to all words you can make from those letters. | |
inv_dictionary = defaultdict(lambda : []) | |
for word, multiset_from_word in dictionary.items(): | |
inv_dictionary[multiset_from_word].append(word) | |
words = 'truth,reek,kite,wade,main,zap,strays,honey,blimp,feet,grabs,devote,jinx,gravy,induct,fog,lion,cruel,amuse,pointe,fade,ozone,woe,avoid,wax,trialed,sluice,hoarse,baring,q,j,i,o,u,q'.split(',') | |
find_longer_words(inv_dictionary, words) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment