tilde-projects/Code/irc/puzzle.py

186 lines
5.7 KiB
Python
Raw Normal View History

2016-01-06 19:08:25 +00:00
#!/usr/bin/python
import random
import hashlib
2016-01-06 19:08:25 +00:00
import inflect
2017-03-30 21:39:44 +00:00
import quote_puzzle
2018-02-28 21:08:22 +00:00
import dict_puzzle
import textcaptcha
2016-01-06 19:08:25 +00:00
p = inflect.engine()
2016-01-11 21:26:15 +00:00
primes = [11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71]
2018-01-24 20:51:54 +00:00
fuzz_amount = 3
2016-01-06 19:08:25 +00:00
2018-10-05 20:02:38 +00:00
def make_puzzle(obfuscate=True, roll=None):
2018-10-05 20:02:38 +00:00
answer = 0
bonus = 0
puzzle = random.choice(
[
"Prove you're not a robot: ",
"Are you a robot?: ",
"Anti-bot check: ",
"Counter-cnd0rphant measures: ",
"Cosn0k countermeasures: ",
"Anti-tilde7hief precautions: ",
"Pro-l0gin challenge: ",
"Riddle me this: ",
"Would you like to play a game? ",
"How about this? "
2018-10-05 20:02:38 +00:00
]
)
puzzle += random.choice(
[
"What is",
"What do you get from",
"What do you get with",
"What is the value of",
"Can you answer",
"Can you tell me",
"Ask wiz3bot what is",
"Does anybody know",
"Who knows",
"Guess what",
"Calculate",
"Find out"
2018-10-05 20:02:38 +00:00
]
)
puzzle += " "
roll = roll or random.randrange(0, 21)
2018-10-05 20:02:38 +00:00
var1 = random.randrange(1, 10)
var2 = random.randrange(1, 10)
var3 = random.randrange(1, 20)
var4 = random.randrange(1, 20)
let1_ord = random.randrange(ord("a"), ord("z") + 1)
if roll == 0:
answer = var1 + var2
2018-10-09 06:43:19 +00:00
puzzle += "{} {} {}".format(
p.number_to_words(var1),
random.choice(["and", "plus", "sum", "add"]),
p.number_to_words(var2),
2018-10-05 20:02:38 +00:00
)
elif roll == 1:
answer = var1 * var2
2018-10-09 06:43:19 +00:00
puzzle += "{} {} {}".format(
p.number_to_words(var1),
random.choice(["times", "multiply", "multiplied by", "product"]),
p.number_to_words(var2),
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 2:
if var2 > var1:
var1, var2 = var2, var1
answer = var1 - var2
2018-10-09 06:43:19 +00:00
puzzle += "{} {} {}".format(
p.number_to_words(var1),
random.choice(["minus", "subtract", "take away", "less"]),
p.number_to_words(var2),
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 3:
if var2 > var1:
var1, var2 = var2, var1
answer = var1 * 2 / var2
2018-10-09 06:43:19 +00:00
puzzle += "{} {} {} (no remainder)".format(
p.number_to_words(var1 * 2),
random.choice(["divided by", "over"]),
p.number_to_words(var2),
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 4:
answer = var1 ** var2
2018-10-09 06:43:19 +00:00
puzzle += "{} to the {} power".format(
p.number_to_words(var1), p.ordinal(p.number_to_words(var2))
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 5:
p1 = random.choice(primes)
p2 = random.choice(primes)
2016-01-06 19:08:25 +00:00
2018-10-05 20:02:38 +00:00
def answer(guess):
# Check the the numbers entered are correct, regardless of order
# or surrounding whitespace.
attempt = sorted(word.strip() for word in guess.split(","))
correct = sorted([str(p1), str(p2)])
return attempt == correct
2016-01-06 19:08:25 +00:00
2018-10-05 20:02:38 +00:00
bonus = 1
2018-10-09 06:43:19 +00:00
puzzle += "{} when factored into its two primes (answer in the form of the two primes with a comma between)".format(
2018-10-05 20:02:38 +00:00
p.number_to_words(p1 * p2)
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 6:
prime = random.choice(primes)
answer = prime % var1
puzzle += p.number_to_words(prime) + " modulus " + p.number_to_words(var1)
elif roll == 7:
if let1_ord + var1 > ord("z"):
let1_ord -= var1
answer = chr(let1_ord + var1)
puzzle += "letter comes {} letters after '{}'".format(
2018-10-09 06:43:19 +00:00
p.number_to_words(var1), chr(let1_ord)
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
obfuscate = False
elif roll == 8:
if let1_ord - var1 < ord("a"):
let1_ord += var1
answer = chr(let1_ord - var1)
puzzle += "letter comes {} letters before '{}'".format(
2018-10-09 06:43:19 +00:00
p.number_to_words(var1), chr(let1_ord)
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
obfuscate = False
elif roll == 9:
answer, puzzle = quote_puzzle.get_quote()
obfuscate = False
elif roll == 10:
answer = str(min(var1, var2, var3, var4))
puzzle += "the {} of {}, {}, {}, and {}".format(
2018-10-09 06:43:19 +00:00
random.choice(["smallest", "lowest"]),
p.number_to_words(var1),
p.number_to_words(var2),
p.number_to_words(var3),
p.number_to_words(var4),
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll == 11:
answer = str(max(var1, var2, var3, var4))
puzzle += "the {} of {}, {}, {}, and {}".format(
2018-10-09 06:43:19 +00:00
random.choice(["biggest", "largest"]),
p.number_to_words(var1),
p.number_to_words(var2),
p.number_to_words(var3),
p.number_to_words(var4),
2018-10-05 20:02:38 +00:00
)
2018-10-09 06:43:19 +00:00
2018-10-05 20:02:38 +00:00
elif roll <= 14: # 12-14
answer, puzzle = dict_puzzle.get_puzzle()
obfuscate = False
elif roll <= 17: # 15-17
answer, puzzle = dict_puzzle.get_anagram()
obfuscate = False
elif roll == 18:
answer, puzzle = quote_puzzle.get_chuck()
obfuscate = False
elif roll <= 20: #19-20
captcha = textcaptcha.get_captcha()
puzzle = captcha['q'] # the question part of the captcha
print(captcha)
answer = lambda a : hashlib.md5(a.encode()).hexdigest() in captcha['a'] # check if the answer is correct
obfuscate = False
bonus = 1
2016-01-11 21:26:15 +00:00
# Add a question mark on the end of the question
if puzzle[-1] != "?":
puzzle += "?"
2018-10-05 20:02:38 +00:00
if obfuscate == True:
for _ in range(fuzz_amount):
idx = random.randrange(len(puzzle) - 2) # get between 0 and string length (except the ? mark)
2018-10-05 20:02:38 +00:00
puzzle = "".join(
[puzzle[0:idx], chr(random.randint(33, 126)), puzzle[idx + 1 :]]
)
return [puzzle, answer, bonus]