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.

63 lines
1.7 KiB

  1. #!/usr/bin/python
  2. import re
  3. import itertools
  4. from spellchecker import SpellChecker
  5. from concurrent.futures import ThreadPoolExecutor
  6. POOL = ThreadPoolExecutor()
  7. SPELL = None
  8. def init_spell_checker():
  9. global SPELL
  10. SPELL = SpellChecker()
  11. SPELL.word_frequency.load_text_file('extra_words.txt')
  12. future = POOL.submit(init_spell_checker)
  13. def canidates(letters, min=2):
  14. pos = []
  15. for length in range(min, len(letters)+1):
  16. for comb in itertools.combinations(letters, length):
  17. for perm in itertools.permutations(comb):
  18. word = ''.join(perm)
  19. pos.append(word)
  20. return set(SPELL.known(pos))
  21. def filter_pos(pos, regex):
  22. pat = re.compile(regex + '$')
  23. return set(filter(pat.match, pos))
  24. if __name__ == "__main__":
  25. while True:
  26. letters = input('Enter letters: ')
  27. if letters == ":quit:":
  28. break
  29. if SPELL is None:
  30. future.result()
  31. pos = canidates(letters)
  32. inp = None
  33. guessed = set()
  34. while inp not in (":quit:", ":new:"):
  35. if inp == ":enter:":
  36. inp = None
  37. while inp != ":done:":
  38. if inp is not None:
  39. guessed.add(inp)
  40. inp = input("Enter guessed word, :done: to exit: ")
  41. elif inp is not None:
  42. fpos = filter_pos(pos, inp)
  43. for word in fpos-guessed:
  44. print('>>>', word)
  45. print('Letters: ', ','.join(letters))
  46. prompt = """\
  47. Enter pattern,
  48. ':new:' for new letters,
  49. ':enter:' to fill in guessed words, or
  50. ':quit:' to exit: """
  51. inp = input(prompt)
  52. if inp == ":quit:":
  53. break