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"
|