You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
1.2 KiB

  1. from collections import Counter
  2. from dictionary import Dictionary, DICTS
  3. def make_key(dictionary_name, letters):
  4. return (dictionary_name, frozenset(Counter(letters).items()))
  5. def candidates(letters, dictionary: Dictionary, min=2, permutations=None):
  6. letters = "".join(letters)
  7. possibilities = []
  8. for word in filter(lambda word: len(word) > min, dictionary.word_frequency.keys()):
  9. letter_set = set(word)
  10. if all(word.count(letter) < letters.count(letter) for letter in letter_set):
  11. possibilities.append(word)
  12. return possibilities
  13. class CandidateCache:
  14. def __init__(self, maxsize=5):
  15. self.maxsize = maxsize
  16. self.cache = {}
  17. self.keys = []
  18. def get(self, dictionary_name, letters):
  19. key = make_key(dictionary_name, letters)
  20. try:
  21. return self.cache[key]
  22. except KeyError:
  23. data = candidates(letters, DICTS[dictionary_name])
  24. self.create(key, data)
  25. return data
  26. def create(self, key, data):
  27. if len(self.keys) > self.maxsize:
  28. key = self.keys.pop()
  29. del self.cache[key]
  30. self.keys.insert(0, key)
  31. self.cache[key] = data