Na odwrocie kalendarza grupowego znalazłem następującą zagadkę:Jak wiele wspólnych angielskich słów z 4 liter lub więcej można zrobić z liter danego słowa (każda litera może być użyta tylko raz)
Ile często angielskich słów z 4 lub więcej liter można zrobić z liter słowa "podręcznik" (każda litera może być użyta tylko raz).
Moje pierwsze rozwiązanie, które wymyśliłem było:
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)
To daje wynik set(['tote', 'oboe', 'text', 'boot', 'took', 'toot', 'book', 'toke', 'betook'])
ale trwało ponad 7 minut na moim komputerze.
Moja następna iteracja brzmiała:
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]
które zwracają odpowiedź niemal natychmiast, ale dał za odpowiedź: ['book', 'oboe', 'text', 'toot']
Jaki jest najszybszy i najbardziej pythonic poprawne rozwiązanie tego problemu?
(edycja: dodano moje wcześniejsze rozwiązanie permutacji i jego różne wyniki).
usunąłem odpowiedź przed wyświetleniem komentarza, z tego samego powodu, dla którego wskazałeś. dzięki – joaquin
Możesz rozwiązać ten niezwykle skuteczny sposób przy wstępnym przetwarzaniu dyktowania i przypisaniu każdej litery jako głównej reprezentacji. Napiszę jedno rozwiązanie, jeśli będę miał czas później. – Voo
@Voo Poczekaj z wyborem poprawnej odpowiedzi, dopóki nie przesyłasz swojego rozwiązania. Nie mogę się doczekać. – BioGeek