На обратной стороне блочного календаря я нашел следующую загадку:
Как много общих английских слов, состоящих из 4 и более букв, можно составить из букв слова "учебник" (каждая буква может использоваться только один раз).
Моим первым решением, которое я придумал, было:
from itertools import permutations
with open('/usr/share/dict/words') as f:
words = f.readlines()
words = map(lambda x: x.strip(), words)
given_word = 'textbook'
found_words = []
ps = (permutations(given_word, i) for i in range(4, len(given_word)+1))
for p in ps:
for word in map(''.join, p):
if word in words and word != given_word:
found_words.append(word)
print set(found_words)
Это дает результат set (['tote', 'oboe', 'text', 'boot', 'take', 'toot', 'book', 'toke', 'betook'])
, но на моей машине это заняло более 7 минут.
Моя следующая итерация была:
with open('/usr/share/dict/words') as f:
words = f.readlines()
words = map(lambda x: x.strip(), words)
given_word = 'textbook'
print [word for word in words if len(word) >= 4 and sorted(filter(lambda letter: letter in word, given_word)) == sorted(word) and word != given_word]
Которые возвращали ответ почти сразу, но давали в качестве ответа: ['book', 'oboe', 'text', 'toot']
Какой самый быстрый, правильное и наиболее питоническое решение этой проблемы?
( edit : добавлено мое предыдущее решение по перестановкам и его другой результат).