Skip to content

Commit e287740

Browse files
authored
Merge pull request #12 from gon7187/fix/prereq-lessons-4-6
fix: prereq-safe задачи в уроках 4-6 + синтаксис if-result (P0.2)
2 parents cdeeb06 + e0234ff commit e287740

3 files changed

Lines changed: 49 additions & 24 deletions

File tree

app/content.py

Lines changed: 15 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -286,20 +286,17 @@ def lesson(
286286
),
287287
text(
288288
"if-result",
289-
"Что выведет `if 3 > 5: print('да') else: print('нет')`?",
289+
"Что выведет этот код?\n\nif 3 > 5:\n print('да')\nelse:\n print('нет')",
290290
["нет"],
291291
"3 не больше 5, поэтому выполняется ветка else.",
292292
),
293293
code(
294294
"if-code",
295-
"Напиши `is_adult(age)`, возвращающую True при возрасте 18 и больше.",
296-
"def is_adult(age):\n # твой код\n pass\n",
297-
[
298-
{"kind": "call", "call": "is_adult(18)", "expected": True},
299-
{"kind": "call", "call": "is_adult(17)", "expected": False},
300-
],
301-
"Условие внутри функции помогает вернуть нужный логический результат.",
302-
"Сравни age с 18 и верни результат сравнения либо используй if/else.",
295+
"Дано `temperature = 22`. Если температура >= 25, выведи `Надень шорты`, иначе — `Возьми куртку`.",
296+
"temperature = 22\n# твой код\n",
297+
[{"kind": "stdout", "expected": "Возьми куртку"}],
298+
"Условие выбирает одежду по температуре.",
299+
"Проверь temperature >= 25: в одной ветке выведи про шорты, в другой — про куртку.",
303300
),
304301
],
305302
),
@@ -339,14 +336,11 @@ def lesson(
339336
text("for-sum", "Чему равна сумма чисел в `range(1, 4)`?", ["6"], "Это 1 + 2 + 3 = 6."),
340337
code(
341338
"for-code",
342-
"Напиши `sum_to(number)`, возвращающую сумму от 1 до number включительно.",
343-
"def sum_to(number):\n # твой код\n pass\n",
344-
[
345-
{"kind": "call", "call": "sum_to(1)", "expected": 1},
346-
{"kind": "call", "call": "sum_to(5)", "expected": 15},
347-
],
348-
"Цикл избавляет от ручного сложения каждого числа.",
349-
"Создай total = 0 и пройди range(1, number + 1).",
339+
"Выведи числа от 1 до 5, каждое с новой строки.",
340+
"# Напиши цикл\n",
341+
[{"kind": "stdout", "expected": "1\n2\n3\n4\n5"}],
342+
"Цикл for и range позволяют вывести числа без повторения print().",
343+
"Пройди по range(1, 6) и выведи каждое число через print().",
350344
),
351345
],
352346
),
@@ -392,14 +386,11 @@ def lesson(
392386
),
393387
code(
394388
"while-code",
395-
"Напиши `countdown(start)`, возвращающую список от start до 1 через while.",
396-
"def countdown(start):\n # твой код\n pass\n",
397-
[
398-
{"kind": "call", "call": "countdown(1)", "expected": [1]},
399-
{"kind": "call", "call": "countdown(4)", "expected": [4, 3, 2, 1]},
400-
],
389+
"Дано `start = 5`. Выведи обратный отсчёт до 1, каждое число с новой строки, затем `Пуск!`.",
390+
"start = 5\n# твой код\n",
391+
[{"kind": "stdout", "expected": "5\n4\n3\n2\n1\nПуск!"}],
401392
"while хорош, когда счётчик меняется до достижения границы.",
402-
"Начни с result = [] и уменьшай start после добавления в список.",
393+
"Пока start больше 0, выводи его и уменьшай на 1. После цикла выведи «Пуск!».",
403394
),
404395
],
405396
),

app/static/styles.css

Lines changed: 2 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tests/test_curriculum.py

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import re
2+
from pathlib import Path
3+
14
from app.content import EXAMS, LESSONS, MODULES, QUESTION_BY_ID
25
from app.evaluator import evaluate
36
from app.extended_curriculum import EXTRA_LESSONS
@@ -78,3 +81,32 @@ def test_reference_solutions_for_lessons_13_25_pass_the_runner() -> None:
7881
code_question = lesson["questions"][2]
7982
result = evaluate(code_question, code_question["reference"])
8083
assert result["correct"] is True, (lesson["order"], result)
84+
85+
86+
def test_lessons_four_to_six_do_not_require_future_topics() -> None:
87+
if_result = QUESTION_BY_ID["if-result"]
88+
assert "\n" in if_result["prompt"]
89+
assert (
90+
if_result["prompt"]
91+
== "Что выведет этот код?\n\nif 3 > 5:\n print('да')\nelse:\n print('нет')"
92+
)
93+
94+
starters = {
95+
"if-code": "temperature = 22\n# твой код\n",
96+
"for-code": "# Напиши цикл\n",
97+
"while-code": "start = 5\n# твой код\n",
98+
}
99+
for question_id, starter in starters.items():
100+
question = QUESTION_BY_ID[question_id]
101+
assert "def " not in question["prompt"]
102+
assert "def " not in question["starter"]
103+
assert question["starter"] == starter
104+
105+
styles = Path("app/static/styles.css").read_text(encoding="utf-8")
106+
assert re.search(r"\.question-prompt\s*\{[^}]*white-space:\s*pre-wrap", styles)
107+
108+
assert QUESTION_BY_ID["if-code"]["tests"] == [{"kind": "stdout", "expected": "Возьми куртку"}]
109+
assert QUESTION_BY_ID["for-code"]["tests"] == [{"kind": "stdout", "expected": "1\n2\n3\n4\n5"}]
110+
assert QUESTION_BY_ID["while-code"]["tests"] == [
111+
{"kind": "stdout", "expected": "5\n4\n3\n2\n1\nПуск!"}
112+
]

0 commit comments

Comments
 (0)