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.

47 lines
1.3 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. letter_counter = Counter(letters)
  7. possibilities = []
  8. for word in dictionary.word_frequency.keys():
  9. word_counter = Counter(word)
  10. try:
  11. add = all(
  12. word_counter[key] <= letter_counter[key] for key in word_counter.keys()
  13. )
  14. except KeyError:
  15. add = False
  16. if add:
  17. possibilities.append(word)
  18. return possibilities
  19. class CandidateCache:
  20. def __init__(self, maxsize=5):
  21. self.maxsize = maxsize
  22. self.cache = {}
  23. self.keys = []
  24. def get(self, dictionary_name, letters):
  25. key = make_key(dictionary_name, letters)
  26. try:
  27. return self.cache[key]
  28. except KeyError:
  29. data = candidates(letters, DICTS[dictionary_name])
  30. self.create(key, data)
  31. return data
  32. def create(self, key, data):
  33. if len(self.keys) > self.maxsize:
  34. key = self.keys.pop()
  35. del self.cache[key]
  36. self.keys.insert(0, key)
  37. self.cache[key] = data