Сколько обычных английских слов, состоящих из 4 или более букв, можно составить из букв данного слова (каждая буква может использоваться только один раз)

На обратной стороне блочного календаря я нашел следующую загадку:

Как много общих английских слов, состоящих из 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 : добавлено мое предыдущее решение по перестановкам и его другой результат).

7
задан BioGeek 15 January 2012 в 22:06
поделиться