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.

50 lines
1.4 KiB

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