И. В. Щуров, НИУ ВШЭ
Источники задач: pythontutor.ru, курс Д. П. Кириенко, informatics.mccme.ru.
За разные задачи можно получить разное число баллов. Если не указано обратное, задача весит 1 балл. Максимум за ДЗ можно набрать 12 баллов. Вы можете решить больше задач, чем требуется, чтобы потренироваться.
Для предварительной проверки задания нужно сделать следующее:
ipynb
-файл на свой компьютер, открыть его в IPython Notebook/Jupyter.# YOUR CODE HERE
. Отступ вашего кода должен составлять 4 пробела. Ничего не менять вокруг!Внимание! Если в какой-то момент забыть ввести входные данные и перейти на следующую ячейку, есть риск, что Notebook перестанет откликаться. В этом случае надо перезапустить ядро: Kernel → Restart. При этом потеряются все значения переменных, но сам код останется.
Чтобы сдать ДЗ, его надо загрузить в python.math-hse.info в виде ipynb
-файла. Получить ipynb
-файл можно, выбрав в Jupyter пункт меню File → Download as... → IPython Notebook (.ipynb).
В задачах вам потребуется написать код, запрашивающий данные с клавиатуры с помощью функции input()
. Обратите внимание: input()
всегда возвращает строку, чтобы преобразовать результат к другому типу, нужно использовать соответствующие функции, см. конспект лекции.
Запустите следующие ячейку, чтобы иметь возможность запускать тесты.
# Фабрика тестов для проверки программ, принимающих данные через input()
from collections import deque
class Tester(object):
def __init__(self, inp):
self.outputs = []
self.inputs = deque(inp)
def print(self, *args, sep = " ", end = "\n"):
text = sep.join(map(str, args)) + end
newlines = text.splitlines(keepends=True)
if self.outputs and self.outputs[-1] and self.outputs[-1][-1] != "\n" and newlines:
self.outputs[-1] += newlines[0]
self.outputs.extend(newlines[1:])
else:
self.outputs.extend(newlines)
def input(self, *args):
assert self.inputs, "Вы пытаетесь считать больше элементов, чем предусмотрено условием"
return self.inputs.popleft()
def __enter__(self):
global print
global input
print = self.print
input = self.input
return self.outputs
def __exit__(self, *args):
global print
global input
del print
del input
Напишите программу, которая последовательно запрашивает три целых числа с помощью input()
(после ввода каждого числа пользователь нажимает «Enter» — иными словами, каждое число вводится на отдельной строке) и выводит их сумму.
Пример.
Входные данные:
1
2
3
Выходные данные:
6
Подсказка: вам придётся вызвать input()
три раза.
def sum3():
"# YOUR CODE HERE"
sum3()
test_data = [
("0 0 0", 0),
("1 2 10", 13),
("-1 -5 100", 100-6),
("0 20 300", 320),
("-5 180 -17", 158)
]
for inp, out in test_data:
with Tester(inp.split()) as t:
sum3()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0].strip() == str(out), "Неверный ответ, были введены числа " + inp
Напишите программу, которая запрашивает имя пользователя, а затем приветствует его.
Входные данные
Пользователь вводит одно слово — имя.
Выходные данные
Программа должна выводить одну строчку:
Hello, имя!
где имя — введенное пользователем имя. Обратите внимание на пробел после запятой. Других пробелов быть не должно!
Примеры
Входные данные
Harry
Выходные данные
Hello, Harry!
Входные данные
Hermione
Выходные данные
Hello, Hermione!
Подсказка. Чтобы напечатать значение нескольких переменных, можно либо передать их через запятую функции print()
(например, print(a, b)
), либо преобразовать в строки и сложить с помощью оператора +
. Избавиться от лишних пробелов в первом случае поможет параметр sep
— посмотрите, например, что будет, если набрать print("one", "two", sep="---")
.
def hello_Harry():
"# YOUR CODE HERE"
hello_Harry()
test_data = [
("Harry", "Hello, Harry!"),
("Hermione", "Hello, Hermione!"),
("Mr. Potter", "Hello, Mr. Potter!"),
("Lord Voldemort", "Hello, Lord Voldemort!")
]
for inp, out in test_data:
with Tester([inp]) as t:
hello_Harry()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, была введена строка " + inp
Напишите программу, которая считывает длины двух катетов в прямоугольном треугольнике и выводит его гипотенузу. Входные числа могут быть целыми или с плавающей точкой. После ввода каждого числа пользователь нажимает «Enter».
def triangle():
"# YOUR CODE HERE"
triangle()
test_data = [
("3 4", 5.),
("5 12", 13.),
("65 72", 97.),
("0.3 0.4", 0.5),
("0.05 0.12", 0.13),
("12.54 9.153", 15.525108985124708)
]
for inp, out in test_data:
with Tester(inp.split()) as t:
triangle()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert abs(float(t[0]) - out) < 1E-6,"Неверный ответ, были введены числа " + inp
Напишите программу, которая считывает целое число и выводит текст, аналогичный приведенному в примере (пробелы важны!).
Пример
Входные данные
179
Выходные данные
The next number for the number 179 is 180.
The previous number for the number 179 is 178.
Подсказка. См. подсказку к задаче 2.
def prevnext():
"# YOUR CODE HERE"
prevnext()
test_data = [
("1534", ["The next number for the number 1534 is 1535.\n",
"The previous number for the number 1534 is 1533.\n"]),
("0", ["The next number for the number 0 is 1.\n",
"The previous number for the number 0 is -1.\n"]),
("2718281828904590", [
"The next number for the number 2718281828904590 is 2718281828904591.\n",
"The previous number for the number 2718281828904590 is 2718281828904589.\n"])
]
for inp, out in test_data:
with Tester([inp]) as t:
prevnext()
assert len(t) == 2, "Вам нужно вывести ровно две строку с ответом"
assert t == out,"Неверный ответ, было введено число " + inp
Дано целое число $n$. Выведите следующее за ним четное число. При решении этой задачи нельзя использовать условный оператор if
и циклы.
Подсказка. Бывает оператор целочисленного деления //
и взятия остатка при делении %
. Например, результат выполнения операции 15 % 7
равен 1
.
Примеры
Входные данные
7
Выходные данные
8
Входные данные
8
Выходные данные
10
def next_even():
"# YOUR CODE HERE"
next_even()
test_data = [
(1, 2),
(2, 4),
(100, 102),
(0, 2),
(11, 12),
(594843, 594844),
(-1, 0),
(-100, -98)
]
for inp, out in test_data:
with Tester([str(inp)]) as t:
next_even()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0].strip() == str(out),"Неверный ответ, было введено число " + str(inp)
Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов (в 24-часовом формате), потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями.
С начала суток прошло n секунд. Выведите, что покажут часы.
Запрещается пользоваться условным оператором, циклами, любыми библиотеками, а также методами форматирования строк. Разрешено использовать только целочисленную арифметику (операции +
, -
, //
, %
), преобразования строк в числа (int
) и чисел в строки (str
), а также конкатенацию строк (+
). Можно создавать дополнительные переменные и пользоваться оператором присваивания =
.
Входные данные
Вводится целое число $n$.
Выходные данные
Выведите ответ на задачу, соблюдая требуемый формат.
Примеры
Входные данные
3602
Выходные данные
1:00:02
Входные данные
129700
Выходные данные
12:01:40
def clock():
"# YOUR CODE HERE"
clock()
test_data = [
(3602, "1:00:02"),
(129700, "12:01:40"),
(12739182731927, "13:58:47"),
(0, "0:00:00"),
(1, "0:00:01"),
(60, "0:01:00"),
(3600, "1:00:00"),
(3599, "0:59:59"),
(43200, "12:00:00"),
(86400, "0:00:00")
]
for inp, out in test_data:
with Tester([str(inp)]) as t:
clock()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0] == out+"\n", "Неверный ответ, было введено число " + str(inp)
Напишите программу, которая считывает два целых числа $a$ и $b$ и выводит наибольшее значение из них. Числа — целые от 1 до 1000.
При решении задачи можно пользоваться только целочисленными арифметическими операциями +, -, *, //, %
, созданием новых переменных и оператором присваивания =
.
Нельзя пользоваться нелинейными конструкциями: ветвлениями, циклами, функциями вычисления модуля, извлечения квадратного корня, возведения в нецелую степень.
Использование функции max
запрещено! И min
тоже. И abs
тоже. И сортировкой пользоваться нельзя.
И вообще всё запрещено, кроме того, что разрешено.
def int_max():
"# YOUR CODE HERE"
int_max()
for a in list(range(1, 100)) + [154, 982, 324]:
for b in list(range(1, 100)) + [991, 124, 183]:
with Tester([str(a), str(b)]) as t:
int_max()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert int(t[0]) == max(a, b), "Ошибка при входных данных " + str(a) + ", " + str(b)
Ввести с клавиатуры строку и вывести на экран список, состоящий из слов в этой строке, кроме первого и последнего. Список необходимо вывести на экран просто функцией print
, так, чтобы слова вывелись через запятую и пробел, в квадратных скобках. Если слов меньше трёх, должен быть выведен пустой список ([]
).
В задаче не нужно использовать циклы.
Примеры
Входные данные
Hello Brave New World
Выходные данные
['Brave', 'New']
Входные данные
This is a very test! Is it okay?
Выходные данные
['is', 'a', 'very', 'test!', 'Is', 'it']
def no_first_last():
"# YOUR CODE HERE"
no_first_last()
test_data = [
("Hello Brave New World", ['Brave', 'New']),
('This is a very test! Is it okay?', ['is', 'a', 'very',
'test!', 'Is', 'it']),
('1 22 333 4444 55555', ['22','333', '4444']),
('One', []),
('One Two', []),
('One Two Three', ['Two'])
]
for inp, out in test_data:
with Tester([inp]) as t:
no_first_last()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0].rstrip() == repr(out), (
"Неверный ответ для входной строки {}, "
"ожидалось {}, получено {}".format(inp, repr(out), t[0]))
print("Отлично!")
Ввести с клавиатуры строку s
, а затем целое число n
. Разбить строку на слова и вывести n
'ое слово на экран. Счёт начинать с единицы, то есть если в качестве n
было введено число 1, вывести первое слово.
В задаче не нужно использовать циклы.
Примеры
Входные данные
Hello Brave New World
3
Выходные данные
New
Входные данные
This is a very test! Is it okay?
1
Выходные данные
This
def word_and_number():
"# YOUR CODE HERE"
word_and_number()
test_data = [
["This", "is", "a", "test"],
["Hello"],
["One", "two", "three"],
["One", "Two"] * 100
]
for inp in test_data:
for i in range(len(inp)):
with Tester([" ".join(inp), str(i+1)]) as t:
word_and_number()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert t[0].rstrip() == inp[i], (
"Неверный ответ для входной строки {} и номера {}, "
"ожидалось {}, получено {}".format(" ".join(inp), i+1,
inp[i], t[0]))
print("Всё верно")
Введите с клавиатуры строку, разбейте её на слова. Выведите список из слов, записанный в обратном порядке.
В этой задаче не нужно использовать циклы. Используйте метод списка .reverse()
: изучите самостоятельно, как он работает.
Пример
Входные данные
Hello Brave New World
Выходные данные
['World', 'New', 'Brave', 'Hello']
def right_to_left():
"# YOUR CODE HERE"
right_to_left()
from ast import literal_eval
test_data = [
(["This", "is", "a", "test"]),
(["Hello"]),
(["One", "two"]),
(["One", "Two"] * 100)
]
for words in test_data:
with Tester([" ".join(words)]) as t:
right_to_left()
assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
assert literal_eval(t[0]) == list(reversed(words)), (
"Неверный ответ для входных данных\n{}\n"
"ожидалось {}, получено {}".format(
" ".join(words) + "\n",
repr(words + [word]), t[0]))
print("Отлично!")