tilde-projects/Code/irc/dict_puzzle.py

54 lines
1.7 KiB
Python
Raw Normal View History

2018-02-28 21:11:39 +00:00
#!/usr/bin/python
import random
import inflect
p = inflect.engine()
dictionary = "/usr/share/dict/american-english-small"
BAD_WORDS_FILE = "badwords.txt"
2018-10-05 20:02:38 +00:00
2018-10-09 06:43:19 +00:00
def gen_wordlist():
# I feel weird calling this "get_wordlist" when it's a generator without calling out that I do in fact realise it's weird - ~deltawitch
2018-10-09 06:43:19 +00:00
# how about gen_wordlist
with open(BAD_WORDS_FILE, "r") as fp:
bad_words = set(fp)
for word in open(dictionary).readlines():
if "'" not in word and word not in bad_words:
yield word.rstrip()
2018-02-28 21:11:39 +00:00
2018-10-05 20:02:38 +00:00
2018-02-28 21:11:39 +00:00
def get_puzzle():
2018-10-09 06:43:19 +00:00
dict_words = list(gen_wordlist())
2018-02-28 21:11:39 +00:00
words = random.sample(dict_words, 3)
2018-10-05 20:02:38 +00:00
key = random.randrange(0, 3) # get values 1-3
2018-10-09 06:43:19 +00:00
puzzle = "When alphebetized, what is the {} in {}?".format(
p.ordinal(p.number_to_words(key + 1)), ", ".join(words)
2018-10-05 20:02:38 +00:00
)
2018-02-28 21:11:39 +00:00
words.sort()
answer = words[key]
return [answer, puzzle]
2018-10-05 20:02:38 +00:00
def get_anagram(maxlen=6):
dict_words = [
2018-10-09 06:43:19 +00:00
word for word in gen_wordlist() if len(word) > 2 and len(word) < maxlen + 1
2018-10-05 20:02:38 +00:00
]
word = random.choice(dict_words)
2018-10-09 06:43:19 +00:00
anagram = list(word)
random.shuffle(anagram)
anagram = "".join(anagram)
# Anagrams can have multiple answers, so we provide a check function that accepts all possibilities
def answer_checker(guess):
# Check for exact match
if guess == word:
return True
# Bail out early if they didn't even use all the same letters
if sorted(guess) != sorted(word):
return False
# Ok, gotta actually check if it's a word now
2018-10-09 06:43:19 +00:00
return any(guess == item for item in gen_wordlist())
2018-10-05 20:02:38 +00:00
return [answer_checker, "Unscramble the following word: '{}'".format(anagram)]