aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGravatar Objectivitix <[email protected]>2021-05-07 14:08:39 -0300
committerGravatar GitHub <[email protected]>2021-05-07 14:08:39 -0300
commitc940d96a9d11ddfaaf4b599f429d559b2da60d1b (patch)
tree1ca961136a85733ac88ab67f5ac99fa4223155e2
parentAdd dynamically generated science questions (diff)
Add dynamic question formatters and its constants
-rw-r--r--bot/exts/evergreen/trivia_quiz.py164
1 files changed, 162 insertions, 2 deletions
diff --git a/bot/exts/evergreen/trivia_quiz.py b/bot/exts/evergreen/trivia_quiz.py
index 2158ac9c..d57ddc09 100644
--- a/bot/exts/evergreen/trivia_quiz.py
+++ b/bot/exts/evergreen/trivia_quiz.py
@@ -15,11 +15,171 @@ from typing import Optional, List, Tuple
logger = logging.getLogger(__name__)
+VARIATION_TOLERANCE = 83
+
WRONG_ANS_RESPONSE = [
"No one answered correctly!",
- "Better luck next time"
+ "Better luck next time...",
+]
+
+N_PREFIX_STARTS_AT = 5
+N_PREFIXES = [
+ "penta", "hexa", "hepta", "octa", "nona",
+ "deca", "hendeca", "dodeca", "trideca", "tetradeca",
+]
+
+PLANETS = [
+ ("1st", "Mercury"),
+ ("2nd", "Venus"),
+ ("3rd", "Earth"),
+ ("4th", "Mars"),
+ ("5th", "Jupiter"),
+ ("6th", "Saturn"),
+ ("7th", "Uranus"),
+ ("8th", "Neptune"),
+]
+
+TAXONOMIC_HIERARCHY = [
+ "species", "genus", "family", "order",
+ "class", "phylum", "kingdom", "domain",
]
+UNITS_TO_BASE_UNITS = {
+ "hertz": ("(unit of frequency)", "s^-1"),
+ "newton": ("(unit of force)", "m*kg*s^-2"),
+ "pascal": ("(unit of pressure & stress)", "m^-1*kg*s^-2"),
+ "joule": ("(unit of energy & quantity of heat)", "m^2*kg*s^-2"),
+ "watt": ("(unit of power)", "m^2*kg*s^-3"),
+ "coulomb": ("(unit of electric charge & quantity of electricity)", "s*A"),
+ "volt": ("(unit of voltage & electromotive force)", "m^2*kg*s^-3*A^-1"),
+ "farad": ("(unit of capacitance)", "m^-2*kg^-1*s^4*A^2"),
+ "ohm": ("(unit of electric resistance)", "m^2*kg*s^-3*A^-2"),
+ "weber": ("(unit of magnetic flux)", "m^2*kg*s^-2*A^-1"),
+ "tesla": ("(unit of magnetic flux density)", "kg*s^-2*A^-1"),
+}
+
+
+def linear_system(q_format: str, a_format: str) -> Tuple[str, str]:
+ x, y = random.randint(2, 5), random.randint(2, 5)
+ answer = a_format.format(x, y)
+
+ nums = [i for i in range(1, 6)]
+ coeffs = [nums.pop(random.randint(0, len(nums) - 1)) for _ in range(4)]
+
+ question = q_format.format(
+ coeffs[0],
+ coeffs[1],
+ (
+ coeffs[0] * x + coeffs[1] * y
+ ),
+ coeffs[2],
+ coeffs[3],
+ (
+ coeffs[2] * x + coeffs[3] * y
+ ),
+ )
+
+ return question, answer
+
+
+def mod_arith(q_format: str, a_format: str) -> Tuple[str, str]:
+ quotient, m, b = random.randint(30, 40), random.randint(10, 20), random.randint(200, 350)
+ ans = random.randint(0, 9) # max 9 because min mod 10
+ a = quotient * m + ans - b
+
+ question = q_format.format(a, b, m)
+ answer = a_format.format(ans)
+
+ return question, answer
+
+
+def ngonal_prism(q_format: str, a_format: str) -> Tuple[str, str]:
+ n = random.randint(0, len(N_PREFIXES) - 1)
+
+ question = q_format.format(N_PREFIXES[n])
+ answer = a_format.format((n + N_PREFIX_STARTS_AT) * 2)
+
+ return question, answer
+
+
+def imag_sqrt(q_format: str, a_format: str) -> Tuple[str, str]:
+ ans_coeff = random.randint(3, 10)
+
+ question = q_format.format(ans_coeff ** 2)
+ answer = a_format.format(ans_coeff)
+
+ return question, answer
+
+
+def binary_calc(q_format: str, a_format: str) -> Tuple[str, str]:
+ a = random.randint(15, 20)
+ b = random.randint(10, a)
+ oper = random.choice(
+ (
+ ("+", lambda x, y: x + y),
+ ("-", lambda x, y: x - y),
+ ("*", lambda x, y: x * y),
+ )
+ )
+
+ if oper[0] == "*":
+ a -= 5
+ b -= 5
+
+ question = q_format.format(
+ bin(a)[2:],
+ oper[0],
+ bin(b)[2:],
+ )
+ answer = a_format.format(
+ bin(oper[1](a, b))[2:]
+ )
+
+ return question, answer
+
+
+def solar_system(q_format: str, a_format: str) -> Tuple[str, str]:
+ planet = random.choice(PLANETS)
+
+ question = q_format.format(planet[0])
+ answer = a_format.format(planet[1])
+
+ return question, answer
+
+
+def taxonomic_rank(q_format: str, a_format: str) -> Tuple[str, str]:
+ level = random.randint(0, len(TAXONOMIC_HIERARCHY) - 2)
+
+ question = q_format.format(TAXONOMIC_HIERARCHY[level])
+ answer = a_format.format(TAXONOMIC_HIERARCHY[level + 1])
+
+ return question, answer
+
+
+def base_units_convert(q_format: str, a_format: str) -> Tuple[str, str]:
+ unit = random.choice(list(UNITS_TO_BASE_UNITS.keys()))
+
+ question = q_format.format(
+ unit + " " + UNITS_TO_BASE_UNITS[unit][0]
+ )
+ answer = a_format.format(
+ UNITS_TO_BASE_UNITS[unit][1]
+ )
+
+ return question, answer
+
+
+DYNAMIC_QUESTIONS_FORMAT_FUNCS = {
+ 201: linear_system,
+ 202: mod_arith,
+ 203: ngonal_prism,
+ 204: imag_sqrt,
+ 205: binary_calc,
+ 301: solar_system,
+ 302: taxonomic_rank,
+ 303: base_units_convert,
+}
+
class TriviaQuiz(commands.Cog):
"""A cog for all quiz commands."""
@@ -412,7 +572,7 @@ class TriviaQuiz(commands.Cog):
embed = discord.Embed(
color=discord.Colour.red(),
- title=f"The correct answer is/are **{', '.join(answers)}**\n",
+ title=f"The correct answer is/are **`{', '.join(answers)}`**\n",
description="",
)