Spaces:
Runtime error
Runtime error
provide quiz modules
Browse files- scripts/quiz/generators.py +35 -0
- scripts/quiz/hints.py +34 -0
- scripts/quiz/questions.py +81 -0
- scripts/quiz/utils.py +13 -0
scripts/quiz/generators.py
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from .questions import generate_question_answer_pair
|
| 2 |
+
from .utils import get_next_level
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
def start_interactive_math(successful_answers=0, wrong_answers=0, level="easy"):
|
| 6 |
+
if wrong_answers > 2:
|
| 7 |
+
wrong_answers = 0
|
| 8 |
+
successful_answers = 0
|
| 9 |
+
level = get_next_level(level, False)
|
| 10 |
+
elif successful_answers > 2:
|
| 11 |
+
successful_answers = 0
|
| 12 |
+
wrong_answers = 0
|
| 13 |
+
level = get_next_level(level)
|
| 14 |
+
|
| 15 |
+
question_data = generate_question_answer_pair(level)
|
| 16 |
+
question = question_data['question']
|
| 17 |
+
proper_answer = question_data['answer']
|
| 18 |
+
current_number = question_data['current_number']
|
| 19 |
+
ordinal_number = question_data['ordinal_number']
|
| 20 |
+
|
| 21 |
+
numbers_group = [current_number, ordinal_number, proper_answer]
|
| 22 |
+
if "times" in question_data:
|
| 23 |
+
times = question_data['times']
|
| 24 |
+
numbers_group.append(times)
|
| 25 |
+
|
| 26 |
+
data_to_return = {
|
| 27 |
+
"text": question,
|
| 28 |
+
"question_numbers": numbers_group,
|
| 29 |
+
"right_answer": proper_answer,
|
| 30 |
+
'number_correct': successful_answers,
|
| 31 |
+
'number_incorrect': wrong_answers,
|
| 32 |
+
"hints_used": 0
|
| 33 |
+
}
|
| 34 |
+
return data_to_return
|
| 35 |
+
|
scripts/quiz/hints.py
ADDED
|
@@ -0,0 +1,34 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from random import random
|
| 2 |
+
|
| 3 |
+
|
| 4 |
+
import random
|
| 5 |
+
|
| 6 |
+
def generate_hint(question_numbers, number_correct, number_incorrect, hints_used):
|
| 7 |
+
ordinal_number = question_numbers[1]
|
| 8 |
+
right_answer = question_numbers[2]
|
| 9 |
+
equation = right_answer - 2 * ordinal_number - 1
|
| 10 |
+
least_number = equation if equation > 0 else 0
|
| 11 |
+
seq_before_answer = " ".join(
|
| 12 |
+
[str(num) for num in range(right_answer - ordinal_number, least_number, -ordinal_number)][::-1]
|
| 13 |
+
)
|
| 14 |
+
seq_after_answer = " ".join(
|
| 15 |
+
[str(num) for num in range(right_answer + ordinal_number, right_answer + 2 * ordinal_number + 1, ordinal_number)]
|
| 16 |
+
)
|
| 17 |
+
hints = [
|
| 18 |
+
f"What number will fill the gap in a sequence {seq_before_answer} ... {seq_after_answer}?",
|
| 19 |
+
f"What number is {ordinal_number} in the account after {right_answer - ordinal_number}?",
|
| 20 |
+
f"What number is {ordinal_number} in the account before {right_answer + ordinal_number}?",
|
| 21 |
+
f"What number is greater than {right_answer - 1} and less than {right_answer + 1}?"
|
| 22 |
+
]
|
| 23 |
+
random_hint = random.choice(hints)
|
| 24 |
+
hints_used += 1
|
| 25 |
+
|
| 26 |
+
data_to_return = {
|
| 27 |
+
"text": random_hint,
|
| 28 |
+
"question_numbers": question_numbers,
|
| 29 |
+
"right_answer": right_answer,
|
| 30 |
+
'number_correct': number_correct,
|
| 31 |
+
'number_incorrect': number_incorrect,
|
| 32 |
+
"hints_used": hints_used
|
| 33 |
+
}
|
| 34 |
+
return data_to_return
|
scripts/quiz/questions.py
ADDED
|
@@ -0,0 +1,81 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
import random
|
| 2 |
+
from typing import Literal
|
| 3 |
+
|
| 4 |
+
|
| 5 |
+
def generate_question_answer_pair(level: Literal["easy", "medium", "hard"] = "easy"):
|
| 6 |
+
"""generate question and correct answer to it
|
| 7 |
+
|
| 8 |
+
:param mode: number we add to current number to get an outcome
|
| 9 |
+
:param current_number: current number we are counting up from
|
| 10 |
+
:param ordinal_number: the number we count up by"""
|
| 11 |
+
|
| 12 |
+
numbers = generate_numbers_by_level(level)
|
| 13 |
+
current_number = numbers['current_number']
|
| 14 |
+
ordinal_number = numbers['ordinal_number']
|
| 15 |
+
times = numbers['times']
|
| 16 |
+
proper_outcome = current_number + ordinal_number * times
|
| 17 |
+
|
| 18 |
+
question_data = [
|
| 19 |
+
{
|
| 20 |
+
"question": f"Let's practice counting. After {current_number}, what number is next?",
|
| 21 |
+
"current_number": current_number,
|
| 22 |
+
"ordinal_number": ordinal_number,
|
| 23 |
+
"answer": current_number + 1
|
| 24 |
+
},
|
| 25 |
+
{
|
| 26 |
+
"question": f"What number comes {ordinal_number} number after {current_number}?",
|
| 27 |
+
"current_number": current_number,
|
| 28 |
+
"ordinal_number": ordinal_number,
|
| 29 |
+
"answer": current_number + ordinal_number
|
| 30 |
+
},
|
| 31 |
+
{
|
| 32 |
+
"question": f"We're counting up by {times}s. What number is {ordinal_number} after {current_number}?",
|
| 33 |
+
"current_number": current_number,
|
| 34 |
+
"ordinal_number": ordinal_number,
|
| 35 |
+
"times": times,
|
| 36 |
+
"answer": proper_outcome
|
| 37 |
+
},
|
| 38 |
+
{
|
| 39 |
+
"question": f"If we count up {ordinal_number} from {current_number}, what number is next?",
|
| 40 |
+
"current_number": current_number,
|
| 41 |
+
"ordinal_number": ordinal_number,
|
| 42 |
+
"answer": current_number + ordinal_number
|
| 43 |
+
},
|
| 44 |
+
{
|
| 45 |
+
"question": f"Let's count up by {ordinal_number}s. What number is next if we start from {current_number}",
|
| 46 |
+
"current_number": current_number,
|
| 47 |
+
"ordinal_number": ordinal_number,
|
| 48 |
+
"answer": current_number + ordinal_number
|
| 49 |
+
}
|
| 50 |
+
]
|
| 51 |
+
random_choice = random.choice(question_data)
|
| 52 |
+
return random_choice
|
| 53 |
+
|
| 54 |
+
|
| 55 |
+
def generate_numbers_by_level(level: Literal["easy", "medium", "hard"] = "easy"):
|
| 56 |
+
"""generate current number, ordinal number and times parameter
|
| 57 |
+
|
| 58 |
+
returns
|
| 59 |
+
dict with params:
|
| 60 |
+
:param current_number: current number
|
| 61 |
+
:param ordinal numebr: the number we count up by
|
| 62 |
+
:param times: the number of times we count up by ordinal number"""
|
| 63 |
+
|
| 64 |
+
if level == "easy":
|
| 65 |
+
current_number = random.randint(1, 8)
|
| 66 |
+
ordinal_number = random.randint(1, 2)
|
| 67 |
+
times = 1
|
| 68 |
+
elif level == "medium":
|
| 69 |
+
current_number = random.randint(1, 90)
|
| 70 |
+
ordinal_number = random.randint(1, 5)
|
| 71 |
+
times = random.randint(1, 2)
|
| 72 |
+
elif level == "hard":
|
| 73 |
+
current_number = random.randint(1, 425)
|
| 74 |
+
ordinal_number = random.randint(1, 25)
|
| 75 |
+
times = random.randint(1, 3)
|
| 76 |
+
|
| 77 |
+
return {
|
| 78 |
+
"current_number": current_number,
|
| 79 |
+
"ordinal_number": ordinal_number,
|
| 80 |
+
"times": times
|
| 81 |
+
}
|
scripts/quiz/utils.py
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
from typing import Literal
|
| 2 |
+
|
| 3 |
+
def get_next_level(current_level, levep_up: Literal[True, False] = True):
|
| 4 |
+
if levep_up:
|
| 5 |
+
if current_level == "easy":
|
| 6 |
+
return "medium"
|
| 7 |
+
else:
|
| 8 |
+
return "hard"
|
| 9 |
+
else:
|
| 10 |
+
if current_level == "medium":
|
| 11 |
+
return "easy"
|
| 12 |
+
else:
|
| 13 |
+
return "medium"
|