sviddo commited on
Commit
790a22c
1 Parent(s): 6fa6b83

provide quiz modules

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