Науки о данных

И. В. Щуров, НИУ ВШЭ

Источники задач: pythontutor.ru, курс Д. П. Кириенко, informatics.mccme.ru.

На странице курса находятся другие материалы.

Домашнее задание №1

За разные задачи можно получить разное число баллов. Если не указано обратное, задача весит 1 балл. Максимум за ДЗ можно набрать 15 баллов. Вы можете решить больше задач, чем требуется, чтобы потренироваться.

Для предварительной проверки задания нужно сделать следующее:

  1. Скачать данный ipynb-файл на свой компьютер, открыть его в IPython Notebook/Jupyter (подробнее о том, как это сделать, см. здесь.
  2. Активировать тесты (см. ниже).
  3. Вставить решение каждой задачи в ячейку для кода, следующую за его условием, там, где написан комментарий # YOUR CODE HERE. Отступ вашего кода должен составлять 4 пробела. Ничего не менять вокруг!
  4. Запустить ячейку, в которую вы вставили код с решением. Ввести какие-то входные данные, проверить визуально правильность вывода.
  5. Запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.

Внимание! Если в какой-то момент забыть ввести входные данные и перейти на следующую ячейку, есть риск, что Notebook перестанет откликаться. В этом случае надо перезапустить ядро: Kernel → Restart. При этом потеряются все значения переменных, но сам код останется.

Чтобы сдать ДЗ, его надо загрузить в nbgr-x в виде ipynb-файла. Получить ipynb-файл можно, выбрав в Jupyter пункт меню File → Download as... → IPython Notebook (.ipynb).

В задачах вам потребуется написать код, запрашивающий данные с клавиатуры с помощью функции input(). Обратите внимание: input() всегда возвращает строку, чтобы преобразовать результат к другому типу, нужно использовать соответствующие функции, см. конспект лекции.

Активировать тесты

Запустите следующие ячейку, чтобы иметь возможность запускать тесты.

In [ ]:
# Фабрика тестов для проверки программ, принимающих данные через 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

Часть 1: Первое знакомство и арифметика

Задача 1

Напишите программу, которая последовательно запрашивает три целых числа с помощью input() (после ввода каждого числа пользователь нажимает «Enter» — иными словами, каждое число вводится на отдельной строке) и выводит их сумму.

Пример.

Входные данные:

1
2
3

Выходные данные:

6

Подсказка: вам придётся вызвать input() три раза.

In [ ]:
def sum3():
    # YOUR CODE HERE
sum3()
In [ ]:
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

Задача 2

Напишите программу, которая запрашивает имя пользователя, а затем приветствует его.

Входные данные

Пользователь вводит одно слово — имя.

Выходные данные

Программа должна выводить одну строчку:

Hello, имя!

где имя — введенное пользователем имя. Обратите внимание на пробел после запятой. Других пробелов быть не должно!

Примеры

Входные данные

Harry

Выходные данные

Hello, Harry!

Входные данные

Hermiona

Выходные данные

Hello, Hermiona!

Подсказка. Чтобы напечатать значение нескольких переменных, можно либо передать их через запятую функции print() (например, print(a, b)), либо преобразовать в строки и сложить с помощью оператора +. Избавиться от лишних пробелов в первом случае поможет параметр sep — посмотрите, например, что будет, если набрать print("one", "two", sep="---").

In [ ]:
def hello_Harry():
    # YOUR CODE HERE

hello_Harry()
In [ ]:
test_data = [
    ("Harry", "Hello, Harry!"),
    ("Hermiona", "Hello, Hermiona!"),
    ("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

Задача 3

Напишите программу, которая считывает длины двух катетов в прямоугольном треугольнике и выводит его гипотенузу. Входные числа могут быть целыми или с плавающей точкой. После ввода каждого числа пользователь нажимает «Enter».

In [ ]:
def triangle():
    # YOUR CODE HERE
    
triangle()
In [ ]:
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

Задача 4

Напишите программу, которая считывает целое число и выводит текст, аналогичный приведенному в примере (пробелы важны!).

Пример

Входные данные

179

Выходные данные

The next number for the number 179 is 180.
The previous number for the number 179 is 178.

Подсказка. См. подсказку к задаче 2.

In [ ]:
def prevnext():
    # YOUR CODE HERE
    
prevnext()
In [ ]:
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

Задача 5 (2 балла)

Дано целое число $n$. Выведите следующее за ним четное число. При решении этой задачи нельзя использовать условный оператор if и циклы.

Подсказка. Бывает оператор целочисленного деления // и взятия остатка при делении %. Например, результат выполнения операции 15 % 7 равен 1.

Примеры

Входные данные

7

Выходные данные

8

Входные данные

8

Выходные данные

10
In [ ]:
def next_even():
    # YOUR CODE HERE
    
next_even()
In [ ]:
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)

Задача 6 (3 балла)

Электронные часы показывают время в формате h:mm:ss, то есть сначала записывается количество часов (в 24-часовом формате), потом обязательно двузначное количество минут, затем обязательно двузначное количество секунд. Количество минут и секунд при необходимости дополняются до двузначного числа нулями.

С начала суток прошло n секунд. Выведите, что покажут часы.

Запрещается пользоваться условным оператором, циклами, любыми библиотеками, а также методами форматирования строк. Разрешено использовать только целочисленную арифметику (операции +, -, //, %), преобразования строк в числа (int) и чисел в строки (str), а также конкатенацию строк (+).

Входные данные

Вводится целое число $n$.

Выходные данные

Выведите ответ на задачу, соблюдая требуемый формат.

Примеры

Входные данные

3602

Выходные данные

1:00:02

Входные данные

129700

Выходные данные

12:01:40
In [ ]:
def clock():
    # YOUR CODE HERE
    
clock()
In [ ]:
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)

Часть 2: списки

Задача 7

Ввести с клавиатуры строку и вывести на экран список, состоящий из слов в этой строке, кроме первого и последнего. Список необходимо вывести на экран просто функцией print, так, чтобы слова вывелись через запятую и пробел, в квадратных скобках. Если слов меньше трёх, должен быть выведен пустой список ([]).

В задаче не нужно использовать циклы.

Примеры

Входные данные

Hello Brave New World

Выходные данные

['Brave', 'New']

Входные данные

This is  a      very   test! Is it okay?

Выходные данные

['is', 'a', 'very', 'test!', 'Is', 'it']
In [ ]:
def no_first_last():
    # YOUR CODE HERE
no_first_last()
In [ ]:
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("Отлично!")

Задача 8

Ввести с клавиатуры строку s, а затем целое число n. Разбить строку на слова и вывести n'ое слово на экран. Счёт начинать с единицы, то есть если в качестве n было введено число 1, вывести первое слово.

В задаче не нужно использовать циклы.

Примеры

Входные данные

Hello Brave New World
3

Выходные данные

New

Входные данные

This is  a      very   test! Is it okay?
1

Выходные данные

This
In [ ]:
def word_and_number():
    # YOUR CODE HERE
word_and_number()
In [ ]:
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("Всё верно")

Задача 9

Введите с клавиатуры строку, разбейте её на слова. Выведите список из слов, записанный в обратном порядке.

В этой задаче не нужно использовать циклы. Используйте метод списка .reverse(): изучите самостоятельно, как он работает.

Пример

Входные данные

Hello Brave New World

Выходные данные

['World', 'New', 'Brave', 'Hello']
In [ ]:
def right_to_left():
    # YOUR CODE HERE
right_to_left()
In [ ]:
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("Отлично!")

Задача 10

С клавиатуры вводится строка, содержащая имена, разделённые пробелами. Для каждого имени вывести строчку

Hello, <имя>

Всего должно быть выведено столько строк, сколько имён написано в строке.

Пример

Входные данные

Alice Bob Daniel

Выходные данные

Hello, Alice
Hello, Bob
Hello, Daniel
In [ ]:
def hello_names():
    # YOUR CODE HERE
hello_names()
In [ ]:
from itertools import zip_longest
import re
names = ['Alice', 'Bob', 'Daniel', 'C3PO', 'Tyrion']
for i in range(1, len(names) + 1):
    cur_names = " ".join(names[:i])
    with Tester([cur_names]) as t:
        hello_names()
        assert len(t) == i
        for out, name in zip_longest(t, names[:i]):
            assert re.match("Hello, " + name + "$", out.rstrip()), "Something wrong with name " + \
                                                    name + ", expected 'Hello, " + name + \
                                                    "', got '" + out + "'"
print("Очень хорошо! Вы справились!")

Задача 11

Даны два целых числа A и B (при этом A≤B). Каждое число вводится с клавитуры, после ввода пользователь нажимает «Enter». Выведите все целые числа от A до B включительно в столбик.

Здесь имеет смысл использовать цикл for (хотя в принципе можно обойтись и без него).

Пример

Входные данные

3
6

Выходные данные

3
4
5
6
In [ ]:
def my_range():
    # YOUR CODE HERE

my_range()
In [ ]:
test_data = [
    ["2 4", "2 3 4"],
    ["1 10", "1 2 3 4 5 6 7 8 9 10"],
    ["0 0", "0"],
    ["-5 0", "-5 -4 -3 -2 -1 0"],
    ["1 1", "1"],
    ["0 100", '0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100']
]

for inp, out in test_data:
    with Tester(inp.split()) as t:
        my_range()
        assert len(t) == len(out.split()), 'Вы вывели неверное количество чисел для входных данных ' + inp
        for o, e in zip(t, out.split()):
            assert int(o) == int(e), "Неверный ответ для входных данных " + inp

print("Это было просто да? Дальше будет интереснее :)")

Задача 12

Напишите программу, которая запрашивает целое число n с клавиатуры, затем n целых чисел, после чего выводит произведение всех этих чисел.

Пример.

Входные данные:

3
9
2
5

Выходные данные:

90
In [ ]:
def prod_n():
    # YOUR CODE HERE
prod_n()
In [ ]:
test_data = [
    ("3 9 2 5", 90),
    ("1 1", 1),
    ("2 0 10", 0),
    ("2 10 0", 0),
    ("10 1 2 3 4 5 6 7 8 9 10", 3628800),
    ("5 -1 -1 -1 -1 -1", -1)
]

for inp, out in test_data:
    with Tester(inp.split()) as t:
        prod_n()
        assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
        assert t[0].strip() == str(out), "Неверный ответ, были введены числа " + inp
print("Ура, всё верно!")

Задача 13

Написать программу, которая запрашивает целое число n с клавиатуры, а затем n строк. (Каждая строка запрашивается отдельно, то есть после очередного запроса пользователь дожен нажать Enter.) После этого она должна вывести список, в который записаны эти строки, в том порядке, в котором они записаны.

Пример

Входные данные

3
This
is
a test

Выходные данные

['This', 'is', 'a test']

Подсказка Введите сначала число n таким образом, как это обычно делалось. Затем создайте пустой список [] и присвойте его какой-нибудь переменной. После этого создайте цикл, который должен исполниться ровно n раз (для этого необходимо использовать функцию range()), в теле цикла вводите очередную строку и записывайте её в список с помощью .append().

In [ ]:
def input_strings():
    # YOUR CODE HERE
input_strings()
In [ ]:
from ast import literal_eval
test_data = [["This", "is", "a test"], ["Hello"], ["Hello, World!"], 
             ["Hello,", " World!"], ["this"] * 100]
for testcase in test_data:
    inp = [str(len(testcase))] + testcase
    with Tester(inp) as t:
        input_strings()
        assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
        assert literal_eval(t[0]) == testcase, (
            "ошибка на входных данных\n{}\ожидался ответ ответ\n{}\n"
            "получен ответ\n{}\n".
            format(inp, testcase, t[0]))

Задача 14 (2 балла)

С клавиатуры вводится строка, состоящая из нескольких предложений. Каждое предложение заканчивается точкой. Все слова разделены пробелами. После точек тоже ставится пробел (если это не самая последняя точка). Никаких других знаков препинания нет. Для каждого предложения вывести его первое и последнее слово.

Пример

Входные данные

One two three. Hello World. This is just a test.

Выходные данные

One three
Hello World
This test

Подсказка. Если передать методу .split() параметр, то он будет использовать его в качестве разделителя. Например, попробуйте посмотреть, что выдаст "Hello, World! This is a test! Okay?".split("!"). Чтобы избавиться от пробелов в начале и конце строки можно использовать метод .strip().

In [ ]:
def first_last_word():
    # YOUR CODE HERE
    
first_last_word()
In [ ]:
test_data = [("One two three. Hello World. This is just a test.",
              "One three", "Hello World", "This test"),
            ("One two.", "One two"),
            ("One two three.", "One three"),
            (" ".join(("Hello world " * 10).strip() + "." 
                     for _ in range(100)),) + ("Hello world", ) * 100]
for testcase in test_data:
    with Tester([testcase[0]]) as t:
        first_last_word()
        assert len(t) == len(testcase) - 1
        assert [s.strip() for s in t] == list(testcase[1:]), (
            [s.strip() for s in t], testcase[1:])

Задача 15 (3 балла)

Введите число n с клавиатуры. Выведите таблицу умножения от 1 до n включительно, как показано в примере. Допустимо, чтобы каждая строка заканчивалась пробелом.

Пример

Входные данные

5

Выходные данные

1 2 3 4 5 
2 4 6 8 10 
3 6 9 12 15 
4 8 12 16 20 
5 10 15 20 25 

Подсказка. Вам можно создавать циклы внутри циклов (вложенные циклы).

In [ ]:
def mult_table():
    # YOUR CODE HERE
mult_table()
In [ ]:
test_data = [(1, ['1 \n']),
 (4, ['1 2 3 4 \n', '2 4 6 8 \n', '3 6 9 12 \n', '4 8 12 16 \n']),
 (7,
  ['1 2 3 4 5 6 7 \n',
   '2 4 6 8 10 12 14 \n',
   '3 6 9 12 15 18 21 \n',
   '4 8 12 16 20 24 28 \n',
   '5 10 15 20 25 30 35 \n',
   '6 12 18 24 30 36 42 \n',
   '7 14 21 28 35 42 49 \n']),
 (10,
  ['1 2 3 4 5 6 7 8 9 10 \n',
   '2 4 6 8 10 12 14 16 18 20 \n',
   '3 6 9 12 15 18 21 24 27 30 \n',
   '4 8 12 16 20 24 28 32 36 40 \n',
   '5 10 15 20 25 30 35 40 45 50 \n',
   '6 12 18 24 30 36 42 48 54 60 \n',
   '7 14 21 28 35 42 49 56 63 70 \n',
   '8 16 24 32 40 48 56 64 72 80 \n',
   '9 18 27 36 45 54 63 72 81 90 \n',
   '10 20 30 40 50 60 70 80 90 100 \n']),
 (13,
  ['1 2 3 4 5 6 7 8 9 10 11 12 13 \n',
   '2 4 6 8 10 12 14 16 18 20 22 24 26 \n',
   '3 6 9 12 15 18 21 24 27 30 33 36 39 \n',
   '4 8 12 16 20 24 28 32 36 40 44 48 52 \n',
   '5 10 15 20 25 30 35 40 45 50 55 60 65 \n',
   '6 12 18 24 30 36 42 48 54 60 66 72 78 \n',
   '7 14 21 28 35 42 49 56 63 70 77 84 91 \n',
   '8 16 24 32 40 48 56 64 72 80 88 96 104 \n',
   '9 18 27 36 45 54 63 72 81 90 99 108 117 \n',
   '10 20 30 40 50 60 70 80 90 100 110 120 130 \n',
   '11 22 33 44 55 66 77 88 99 110 121 132 143 \n',
   '12 24 36 48 60 72 84 96 108 120 132 144 156 \n',
   '13 26 39 52 65 78 91 104 117 130 143 156 169 \n'])]

for inp, out in test_data:
    with Tester([str(inp)]) as t:
        mult_table()
        line_t = "".join(t)
        t = line_t.splitlines()
        assert len(t) == len(out), "Неверное количество строк в выводе"
        for l_test, l_out in zip(t, out):
            assert len(l_test.split()) == len(l_out.split()), \
                "Неверное количество элементов в строке " + l_out
            for el_test, el_out in zip(l_test.split(), l_out.split()):
                assert el_test == el_out, "Ошибка {} != {}".format(l_test, 
                                                                   l_out)
print("Теперь вы можете печатать тетрадки для школьников!")

Задача 16 (4 балла)

Не пользуясь библиотечными функциями, для вводимого с клавиатуры натурального $n$, вывести на экран первые $n$ строк треугольника Паскаля. Элементы должны быть разделены пробелами. Допустимо наличие пробела в конце строки.

Пример

Входные данные

5

Выходные данные

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
In [ ]:
def pascal_triangle():
    # YOUR CODE HERE

pascal_triangle()
In [ ]:
test_data = zip(range(1, 20), [['1\n'],['1\n', '1 1\n'], ['1\n', '1 1\n', '1 2 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n', '1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n', '1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n', '1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n', '1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n', '1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1\n', '1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n', '1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n', '1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1\n', '1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1\n', '1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1\n'], ['1\n', '1 1\n', '1 2 1\n', '1 3 3 1\n', '1 4 6 4 1\n', '1 5 10 10 5 1\n', '1 6 15 20 15 6 1\n', '1 7 21 35 35 21 7 1\n', '1 8 28 56 70 56 28 8 1\n', '1 9 36 84 126 126 84 36 9 1\n', '1 10 45 120 210 252 210 120 45 10 1\n', '1 11 55 165 330 462 462 330 165 55 11 1\n', '1 12 66 220 495 792 924 792 495 220 66 12 1\n', '1 13 78 286 715 1287 1716 1716 1287 715 286 78 13 1\n', '1 14 91 364 1001 2002 3003 3432 3003 2002 1001 364 91 14 1\n', '1 15 105 455 1365 3003 5005 6435 6435 5005 3003 1365 455 105 15 1\n', '1 16 120 560 1820 4368 8008 11440 12870 11440 8008 4368 1820 560 120 16 1\n', '1 17 136 680 2380 6188 12376 19448 24310 24310 19448 12376 6188 2380 680 136 17 1\n', '1 18 153 816 3060 8568 18564 31824 43758 48620 43758 31824 18564 8568 3060 816 153 18 1\n']])
for inp, out in test_data:
    with Tester([str(inp)]) as t:
        pascal_triangle()
        line_t = "".join(t)
        t = line_t.splitlines()
        assert len(t) == len(out), "Неверное количество строк в выводе"
        for l_test, l_out in zip(t, out):
            assert len(l_test.split()) == len(l_out.split()), \
                "Неверное количество элементов в строке " + l_out
            for el_test, el_out in zip(l_test.split(), l_out.split()):
                assert el_test == el_out, "Ошибка: {} != {}".format(
                l_test, l_out)
print("Ну как вам треугольничек? Красивый, правда?")