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.

60 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. def canidates(letters, min=2):
  13. pos = []
  14. for length in range(min, len(letters)+1):
  15. for comb in itertools.combinations(letters, length):
  16. for perm in itertools.permutations(comb):
  17. word = ''.join(perm)
  18. pos.append(word)
  19. return set(SPELL.known(pos))
  20. def filter_pos(pos, regex):
  21. pat = re.compile(regex + '$')
  22. return set(filter(pat.match, pos))
  23. if __name__ == "__main__":
  24. while True:
  25. letters = input('Enter letters: ')
  26. if letters == ":quit:":
  27. break
  28. if SPELL is None:
  29. POOL.submit(init_spell_checker)
  30. pos = canidates(letters)
  31. inp = None
  32. guessed = set()
  33. while inp not in (":quit:", ":new:"):
  34. if inp == ":enter:":
  35. inp = None
  36. while inp != ":done:":
  37. if inp is not None:
  38. guessed.add(inp)
  39. inp = input("Enter guessed word, :done: to exit: ")
  40. elif inp is not None:
  41. fpos = filter_pos(pos, inp)
  42. for word in fpos-guessed:
  43. print('>>>', word)
  44. print('Letters: ', ','.join(letters))
  45. prompt = """\
  46. Enter pattern,
  47. ':new:' for new letters,
  48. ':enter:' to fill in guessed words, or
  49. ':quit:' to exit: """
  50. inp = input(prompt)
  51. if inp == ":quit:":
  52. break