Как устроена олимпиадная задача. Первая программа
Чему научитесь
- Понимать, чего от вас хочет проверяющая система и почему она не читает пояснений
- Читать условие по частям и не терять формат вывода
- Писать программу, которая читает данные, считает и печатает ответ
- Отличать строку от числа — и не получать 34 вместо 7
Как устроено занятие
Сначала разбор с примерами и короткими проверками понимания — они нужны, чтобы поймать непонятое сразу, а не через три темы.
Дальше 15 задач лестницей: разминка, основа, со звёздочкой. Занятие засчитывается, когда решено 10 — остальные не пропадают и учитываются отдельно.
После занятия — вторая часть, ещё 15 задач на те же приёмы в новых сюжетах.
Сколько это займёт
Примерно час-полтора вместе с задачами. Сроков нет: можно закрыть вкладку и вернуться когда удобно — прогресс сохранится.
Чем олимпиадная задача отличается от школьной
Школьная задача заканчивается ответом в тетради: «12 километров». Олимпиадная заканчивается программой, которая даст верный ответ на любых данных — в том числе на тех, которых вы не видели.
Это принципиально другая работа. Вас просят не посчитать, а описать способ подсчёта. Проверять его будет не человек, а робот, и делать он это будет так:
- запустит вашу программу и подсунет ей заранее заготовленные данные;
- прочитает то, что программа напечатала;
- сравнит с правильным ответом — символ за символом;
- повторит это на десятке разных наборов данных, которые называют тестами.
Если хотя бы на одном тесте вывод отличается — задача не зачтена. Робот не догадывается, что вы «почти правы», и не читает ваших пояснений: он сравнивает текст.
Отсюда правило, которое стоит принять сразу: программа не разговаривает с человеком. Никаких «Введите число», «Ответ:», «Спасибо за использование». Только то, что просят в разделе «Формат вывода».
Как читать условие
Условие любой задачи состоит из одних и тех же частей, и читать их надо в определённом порядке.
| часть | что там | зачем читать |
|---|---|---|
| Условие | сюжет и что найти | понять, какой ответ требуется |
| Формат ввода | сколько чисел, в каком порядке, в каких строках | написать чтение данных |
| Формат вывода | что и как печатать | не потерять баллы на оформлении |
| Ограничения | границы значений | выбрать подход и типы |
| Пример | один набор данных и ответ на него | проверить себя руками |
Пример в условии — не проверка правильности. Это образец формата. Тестов у робота десяток, и они специально устроены сложнее примера: там будут ноль, единица, максимальные значения и прочие крайние случаи.
Полезная привычка: прочитав условие, ответьте себе на три вопроса вслух — что дано, что найти, что напечатать. Если на любой из трёх ответа нет, вы ещё не поняли задачу, и писать код рано.
Проверка: пример из условия
Ваша программа даёт верный ответ на примере из условия. Что это значит?
Первая программа: три действия
Любая программа этого занятия делает три вещи по порядку: читает, считает, печатает.
s = input() # прочитали строку
print(s) # напечатали её обратно
Разберём построчно.
input() читает одну строку из входных данных и возвращает её. Никаких приглашений и подсказок он не печатает — и не должен.
s — переменная: имя, за которым лежит значение. Знак = здесь не равенство из математики, а действие: «вычисли справа, положи в то, что слева». Поэтому запись x = x + 1 вполне осмысленна — она увеличивает x на единицу.
print(s) печатает значение и переводит строку. Если передать несколько значений через запятую, они напечатаются через пробел:
print(4, 7) # 4 7
Это ровно то, что просят, когда в условии написано «выведите два числа через пробел».
Почему приходится писать int()
input() всегда возвращает строку, даже если во входных данных было число. Строка «3» и число 3 — разные вещи, и складываются они по-разному.
Со строками + означает склеивание:
a = input() # "3"
b = input() # "4"
print(a + b) # 34, а не 7
Чтобы получить число, строку превращают функцией int():
a = int(input())
b = int(input())
print(a + b) # 7
Если чисел несколько в одной строке, её сначала режут на части, а потом каждую превращают в число:
a, b, c = map(int, input().split())
Здесь split() делит строку по пробелам, а map(int, ...) применяет int к каждой части. Если чисел окажется не три, программа остановится с ошибкой — это признак, что формат ввода прочитан невнимательно.
Заодно запомните обратное превращение: str(5) даёт строку «5». Оно понадобится, когда ответ придётся собирать из текста и чисел.
Проверка: что напечатает программа
Ввели две строки: 5 и 2. Что напечатает a = input(), b = input(), print(a + b)?
Вычисления по формуле
Дальше в задачах будет одно и то же: прочитать числа, применить формулу, напечатать результат. Арифметика привычная, но два места требуют внимания.
Порядок действий. Python считает как математика: сначала умножение и деление, потом сложение и вычитание. Скобки меняют порядок.
Без скобок 2 * a + b получилась бы другая формула — и другой ответ.
Что печатать. Если в условии просят два числа, печатайте ровно два и ровно в том порядке, в каком просят. «Сначала площадь, затем периметр» — значит print(s, p), а не наоборот.
Ниже — полное решение задачи про прямоугольник, целиком, как его стоит писать:
a, b = map(int, input().split())
s = a * b
p = 2 * (a + b)
print(s, p)
Четыре строки, и каждая делает одно понятное дело. Такой код проще проверять глазами, чем то же самое в одну строку.
Проверка: порядок действий
Чему равно 2 * (3 + 4)? Введите целое число.
Четыре ошибки, на которых спотыкаются все
Приглашение к вводу. input("Введите число: ") печатает текст, и робот считает его частью ответа. Просто input().
Забытый int(). Программа складывает строки вместо чисел. Признак — в ответе два числа, слепленных подряд: вместо 7 выходит 34.
Лишний вывод «для красоты». print("Ответ:", x) — это другой ответ. Печатайте только то, что просят.
Не тот порядок вывода. Если просят площадь и периметр, а вы печатаете периметр и площадь, ответ неверный, хотя оба числа посчитаны правильно.
Как проверять себя
Перед отправкой сделайте три вещи. Запустите программу у себя, введите данные из примера и сравните вывод с примером посимвольно. Затем подставьте самые маленькие допустимые значения из ограничений — часто это единица или ноль. И наконец самые большие: убедитесь, что программа не сломалась и ответ выглядит разумно.
Эти три проверки отсекают почти все неудачные посылки на первых занятиях.
Проверка: превращение строки в число
Какой функцией строку "42" превращают в число 42? Напишите только имя функции.
Практика: как устроена лестница
Дальше пятнадцать задач тремя ступенями.
- разминка (5 задач по 1 баллу) — приём в чистом виде, без сюжета;
- основа (7 задач по 2 балла) — тот же приём в прикладной обёртке;
- со звёздочкой (3 задачи по 3 балла) — формула не дана, её нужно собрать самому.
Занятие зачтено, когда решено десять задач из пятнадцати. Решённое сверх нормы не пропадает — оно учитывается отдельно.
Сроков нет: курс проходится своим темпом. Но лучше идти по порядку — задачи разминки нужны как кирпичи для остальных.
Объясните, почему решение не зачли
Ученик решал задачу «выведите площадь и периметр прямоугольника» и написал:
a = input()
b = input()
print("Площадь:", a * b)
Программа не работает. Найдите все ошибки — их здесь три — и объясните, к чему приводит каждая.