Программирование

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

Данный notebook является набором задач по курсу «Программирование» (Магистерская программа «Журналистика данных», НИУ ВШЭ, 2018-19).

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

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

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

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

  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() всегда возвращает строку, чтобы преобразовать результат к другому типу, нужно использовать соответствующие функции, см. конспект лекции.

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

Запустите следующие ячейку, чтобы иметь возможность запускать тесты. Эту операцию нужно проделывать каждый раз, когда вы перезапускаете ядро. Если какой-то из тестов говорит NameError: name 'Tester' is not defined, нужно запустить эту ячейку ещё раз.

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

Даны два целых числа 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("Это было просто да? Дальше будет интереснее :)")

Задача 2

Напишите программу, которая запрашивает целое число 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("Ура, всё верно!")

Задача 3

Факториалом натурального числа $n$ называется произведение всех натуральных чисел от 1 до $n$ включительно. Факториал $n$ обозначается $n!$. Например, $$ 4! = 1 \times 2 \times 3 \times 4 = 24. $$ Написать программу, запрашивающую натуральное число $n$ с клавиатуры, вычисляющую и печатающую $n!$. Использовать какие-либо библиотечные функции нельзя (то есть запрещена конструкция import).

Пример.

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

5

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

120
In [ ]:
def my_fact():
    # YOUR CODE HERE

my_fact()
In [ ]:
test_data = [
    ("1", 1),
    ("2", 2),
    ("3", 6),
    ("4", 24),
    ("5", 120),
    ("10", 3628800),
    ("20", 2432902008176640000)
]

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

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

Числа Фибоначчии — это последовательность чисел, заданная следующим образом:

$$a_1 = 1,\quad a_2 = 1, \quad a_{k+1}=a_k+a_{k-1}$$

Ввести число k с клавиатуры и вывести $a_k$. Считать, что число k всегда больше одного. (То есть на вход никогда не будет подано число, меньшее или равное одного.)

Пример.

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

3

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

2

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

5

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

5

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

6

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

8
In [ ]:
def fib_k():
    # YOUR CODE HERE
fib_k()
In [ ]:
test_data = [(33, 3524578),
 (87, 679891637638612258),
 (66, 27777890035288),
 (43, 433494437),
 (44, 701408733),
 (19, 4181),
 (98, 135301852344706746049),
 (65, 17167680177565),
 (32, 2178309),
 (11, 89)]
for inp, out in test_data:
    with Tester([str(inp)]) as t:
        fib_k()
        assert len(t) == 1, "Вам нужно вывести ровно одну строку с ответом"
        assert t[0].strip() == str(out), ("Неверный ответ, было "
                                          "введено число " + str(inp) + 
                                         " ожидалось " + str(out))
print("Ура, всё верно!")

Задача 5

Написать программу, которая запрашивает целое число 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]))

Задача 6

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

Пример

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

3
This
is
a test

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

a test
is
This

Подсказка Вы можете использовать метод .reverse() для списков или срез [::-1].

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

Задача 7 (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:])

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

С клавиатуры вводится целое число, разбивается на цифры и каждая цифра записывается словом. Результат выводится с большой буквы, разделенный пробелами.

Запрещено использовать оператор if.

Пример.

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

123

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

One two three

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

5023

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

Five zero two three

В выходной строке в конце может быть лишний пробел.

Подсказка В цикле for строка будет вести как список, состоящий из отдельных символов. Чтобы сделать первую букву строки большой, используйте метод .capitalize().

In [ ]:
def digits_to_stings():
    # YOUR CODE HERE
    
digits_to_stings()
In [ ]:
test_data = [(1, "One"),
            (12, "One two"),
            (123, "One two three"),
            (1234567890, "One two three four five six seven eight nine zero"),
            (90912, "Nine zero nine one two")]
for inp, out in test_data:
    with Tester([str(inp)]) as t:
        digits_to_stings()
        assert len(t) == 1, len(t)
        assert t[0].strip() == out, (t[0].strip(), out)

Задача 9 (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 

Подсказка. Вам понадобятся вложенные циклы — цикл внутри цикла. Также может оказаться полезным следующее знание: print по умолчанию добавляет в конец строки символ перевода строки (то есть каждый следующий print печатает с новой строки). Чтобы он этого не делал, можно добавить ему именованный аргумент end. Например, попробуйте запустить следующий код:

print("Hello", end="!!!")
print("World")
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("Теперь вы можете печатать тетрадки для школьников!")

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

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

Пример

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

5

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

1
1 1
1 2 1
1 3 3 1
1 4 6 4 1
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("Ну как вам треугольничек? Красивый, правда?")