{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "## Домашнее задание №3 \n", "\n", "*Задачи 5-6 заимствованы из [домашнего задания](http://nbviewer.jupyter.org/url/python.math-hse.info/static/assignments_release/dj2017/ps02/ps02.ipynb) по [курсу](http://math-info.hse.ru/s17/1) «Введение в программирование» (Магистерская программа «Журналистика данных», НИУ ВШЭ, 2017-18). *\n", "\n", "За разные задачи можно получить разное число баллов. Если не указано обратное, задача весит 1 балл. Максимум за ДЗ можно набрать 6 баллов. Вы можете решить больше задач, чем требуется, чтобы потренироваться.\n", "\n", "Для предварительной проверки задания нужно сделать следующее:\n", "\n", "1. Скачать данный `ipynb`-файл на свой компьютер, открыть его в IPython Notebook/Jupyter.\n", "2. Активировать тесты (см. ниже).\n", "3. Вставить решение каждой задачи в ячейку для кода, следующую за его условием, там, где написан комментарий `# YOUR CODE HERE`. Отступ вашего кода должен составлять 4 пробела. Ничего не менять вокруг!\n", "4. Запустить ячейку, в которую вы вставили код с решением. Ввести какие-то входные данные, проверить визуально правильность вывода.\n", "5. Запустить следующую ячейку (в ней содержится тест). Если запуск ячейки с тестом не приводит к появлению ошибки (assertion), значит, всё в порядке, задача решена. Если приводит к появлению ошибки, значит, тест не пройден и нужно искать ошибку.\n", "\n", "**Внимание!** Если в какой-то момент забыть ввести входные данные и перейти на следующую ячейку, есть риск, что Notebook перестанет откликаться. В этом случае надо перезапустить ядро: *Kernel → Restart*. При этом потеряются все значения переменных, но сам код останется.\n", "\n", "Чтобы сдать ДЗ, его надо загрузить в [nbgr-x](http://python.math-hse.info) в виде `ipynb`-файла. Получить `ipynb`-файл можно, выбрав в Jupyter пункт меню *File → Download as... → IPython Notebook (.ipynb)*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Активировать тесты\n", "Запустите следующие ячейку, чтобы иметь возможность запускать тесты. Эту операцию нужно проделывать каждый раз, когда вы перезапускаете ядро. Если какой-то из тестов говорит `NameError: name 'Tester' is not defined`, нужно запустить эту ячейку ещё раз." ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# Фабрика тестов для проверки программ, принимающих данные через input()\n", "\n", "from collections import deque\n", "\n", "class Tester(object):\n", " def __init__(self, inp):\n", " self.outputs = []\n", " self.inputs = deque(inp)\n", " def print(self, *args, sep = \" \", end = \"\\n\"):\n", " text = sep.join(map(str, args)) + end\n", " newlines = text.splitlines(keepends=True)\n", " if self.outputs and self.outputs[-1] and self.outputs[-1][-1] != \"\\n\" and newlines:\n", " self.outputs[-1] += newlines[0]\n", " self.outputs.extend(newlines[1:])\n", " else:\n", " self.outputs.extend(newlines)\n", " \n", " def input(self, *args):\n", " assert self.inputs, \"Вы пытаетесь считать больше элементов, чем предусмотрено условием\"\n", " return self.inputs.popleft()\n", " def __enter__(self):\n", " global print\n", " global input\n", " print = self.print\n", " input = self.input\n", " return self.outputs\n", " def __exit__(self, *args):\n", " global print\n", " global input\n", " del print\n", " del input" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 1\n", "Напишите программу, которая запрашивает у пользователя любой адрес в одну строку в формате: `город,улица,дом` и выводит на экран список из отдельных элементов адреса (в квадратных скобках через запятую и пробел). Обратите внимание на отстутствие пробела после запятых во входных данных, это важно!\n", "\n", "**Пример.**\n", "\n", "**Входные данные:**\n", "\n", " Москва,Мясницкая,20\n", "\n", "**Выходные данные:**\n", "\n", " ['Москва', 'Мясницкая', '20']" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "505ca65e27ef3e060195fbc2a1cf7832", "grade": false, "grade_id": "p1", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def address():\n", " # YOUR CODE HERE\n", "address()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "d1ad39649e2b7ef66f1fd6ff7c45a7fa", "grade": true, "grade_id": "p1_test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"Москва,Мясницкая,20\", [\"Москва\", \"Мясницкая\", \"20\"]),\n", " (\"Санкт-Петербург,Кантемировская,3\", [\"Санкт-Петербург\", \"Кантемировская\", \"3\"]),\n", " (\"Пермь,Студенческая,38\", [\"Пермь\", \"Студенческая\", \"38\"])]\n", "\n", "for inp, out in test_data:\n", " with Tester([inp]) as t:\n", " address()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t[0].rstrip() == repr(out), (\n", " \"Неверный ответ для входной строки {}, \"\n", " \"ожидалось {}, получено {}\".format(inp, repr(out), t[0]))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 2\n", "\n", "Дан список станций желтой ветки московского метро (упорядочены как на карте):\n", "\n", " line = [\"Третьяковская\", \"Марксистская\", \"Площадь Ильича\", \"Авиамоторная\", \"Шоссе Энтузиастов\",\n", " \"Перово\", \"Новогиреево\", \"Новокосино\"]\n", "\n", "Давайте считать, что движение происходит от Третьяковской до Новокосино.\n", "\n", "Напишите программу, которая запрашивает у пользователя название текущей станции метро (без лишнего пробела на конце) и выводит на экран сообщение вида\n", "\n", " Следующая станция: станция.\n", "\n", "Считайте, что пользователь знает, какая станция конечная, и не будет запрашивать станцию, следующую после Новокосино.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " Введите текущую станцию: Площадь Ильича\n", "\n", "*Выходные данные:*\n", "\n", " Следующая станция: Авиамоторная\n", "\n", "**Подсказка:**\n", "\n", "Чтобы вернуть индекс определенного элемента в списке, нужно воспользоваться методом `.index()`. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "4eb47abd4771cbb606e8bfc70a9fb56e", "grade": false, "grade_id": "p2", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def metro():\n", " line = [\"Третьяковская\", \"Марксистская\", \"Площадь Ильича\", \"Авиамоторная\", \"Шоссе Энтузиастов\",\n", " \"Перово\", \"Новогиреево\", \"Новокосино\"]\n", " # YOUR CODE HERE\n", "\n", "metro()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "0b0063423d133df289a3bd667a9a3eb6", "grade": true, "grade_id": "p2-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"Третьяковская\", \"Следующая станция: Марксистская\"),\n", " (\"Марксистская\", \"Следующая станция: Площадь Ильича\"),\n", " (\"Площадь Ильича\", \"Следующая станция: Авиамоторная\"),\n", " (\"Авиамоторная\", \"Следующая станция: Шоссе Энтузиастов\"),\n", " (\"Шоссе Энтузиастов\",\"Следующая станция: Перово\"),\n", " (\"Перово\", \"Следующая станция: Новогиреево\"),\n", " (\"Новогиреево\", \"Следующая станция: Новокосино\")\n", "]\n", "\n", "for inp, out in test_data:\n", " with Tester([inp]) as t:\n", " metro()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t[0] == out+\"\\n\", \"Неверный ответ, была введена строка \" + inp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 3\n", "\n", "Напишите программу, которая запрашивает у пользователя номер мобильного телефона в формате X-XXX-XXX-XX-XX и выводит на экран номер в формате X(XXX)XXX-XX-XX.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " Введите номер телефона: 8-906-000-11-22\n", "\n", "*Выходные данные:*\n", "\n", " 8(906)000-11-22" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "ae59eb810142d3be72da1361bd705154", "grade": false, "grade_id": "p3", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def phone():\n", " # YOUR CODE HERE\n", " \n", "phone()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "7720eb5bd8419f11cee3e12e7a2eeae4", "grade": true, "grade_id": "p3-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"8-906-000-11-22\", \"8(906)000-11-22\"),\n", " (\"1-234-000-17-82\", \"1(234)000-17-82\"),\n", " (\"7-190-904-88-00\", \"7(190)904-88-00\")\n", "]\n", "\n", "for inp, out in test_data:\n", " with Tester([inp]) as t:\n", " phone()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t[0] == out+\"\\n\", \"Неверный ответ, была введена строка \" + inp" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 4\n", "\n", "Дан список с названиями файлов:\n", "\n", " files = ['file 1.txt', 'file 2.txt', 'file 6.txt', 'file 9.txt']\n", "\n", "Напишите программу, которая переименовывает файлы в списке ‒ заменяет все пробелы на нижнее подчеркивание ‒ и выводит обновленный список `files` на экран.\n", "\n", "**Пример:**\n", "\n", "*Входные данные:*\n", "\n", " files = ['file 1.txt', 'file 2.txt', 'file 6.txt', 'file 9.txt']\n", "\n", "*Выходные данные:*\n", "\n", " files = ['file_1.txt', 'file_2.txt', 'file_6.txt', 'file_9.txt']\n", " \n", "**Подсказка:** вам потребуется цикл и метод `.replace()` для строк. " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "5538d0101acd0ff6d3592468dc0dad8d", "grade": false, "grade_id": "p4", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def frename():\n", " files = ['file 1.txt', 'file 2.txt', 'file 6.txt', 'file 9.txt']\n", " # YOUR CODE HERE\n", " \n", " return files\n", "frename() " ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "5b5821bd96477f42234c09ac2fbd7126", "grade": true, "grade_id": "p4-test", "locked": true, "points": 1, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "files = ['file_1.txt', 'file_2.txt', 'file_6.txt', 'file_9.txt']\n", "\n", "t = frename()\n", "\n", "assert t == files,\"Неверный ответ\" " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 5 (2 балла)\n", "Факториалом натурального числа $n$ называется произведение всех натуральных чисел от 1 до $n$ включительно. Факториал $n$ обозначается $n!$. Например,\n", "$$\n", "4! = 1 \\times 2 \\times 3 \\times 4 = 24.\n", "$$\n", "Написать программу, запрашивающую натуральное число $n$ с клавиатуры, вычисляющую и печатающую $n!$. Использовать какие-либо библиотечные функции нельзя (то есть запрещена конструкция `import`).\n", "\n", "**Пример.**\n", "\n", "**Входные данные:**\n", "\n", " 5\n", "\n", "**Выходные данные:**\n", "\n", " 120" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "d61f7de752f5a7b69b9d41f3c52959cf", "grade": false, "grade_id": "p8", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def my_fact():\n", " # YOUR CODE HERE\n", "\n", "my_fact()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "3a6bd639862def50c485166c59c10356", "grade": true, "grade_id": "p8_test", "locked": true, "points": 2, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [\n", " (\"1\", 1),\n", " (\"2\", 2),\n", " (\"3\", 6),\n", " (\"4\", 24),\n", " (\"5\", 120),\n", " (\"10\", 3628800),\n", " (\"20\", 2432902008176640000)\n", "]\n", "\n", "for inp, out in test_data:\n", " with Tester([inp]) as t:\n", " my_fact()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t[0].strip() == str(out), \"Неверный ответ, были введены числа \" + inp\n", "print(\"Хорошо, давайте теперь что-нибудь посложнее решим!\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Задача 6 (2 балла)\n", "Числа Фибоначчии — это последовательность чисел, заданная следующим образом:\n", "\n", "$$a_1 = 1,\\quad a_2 = 1, \\quad a_{k+1}=a_k+a_{k-1}$$\n", "\n", "Ввести число `k` с клавиатуры и вывести $a_k$. Считать, что число `k` всегда больше одного. (То есть на вход никогда не будет подано число, меньшее или равное одного.)\n", "\n", "\n", "**Пример.**\n", "\n", " \n", "_Входные данные:_\n", "\n", " 3\n", "\n", "_Выходные данные:_\n", "\n", " 2\n", " \n", "_Входные данные:_\n", "\n", " 5\n", "\n", "_Выходные данные:_\n", "\n", " 5\n", " \n", "_Входные данные:_\n", "\n", " 6\n", "\n", "_Выходные данные:_\n", "\n", " 8" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "f4150c8a446c56db057305c890b947ec", "grade": false, "grade_id": "p9", "locked": false, "schema_version": 1, "solution": true } }, "outputs": [], "source": [ "def fib_k():\n", " # YOUR CODE HERE\n", "fib_k()" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "deletable": false, "nbgrader": { "checksum": "7ddb2b0ce496591ab2f50bd302428ddf", "grade": true, "grade_id": "p9_test", "locked": true, "points": 2, "schema_version": 1, "solution": false } }, "outputs": [], "source": [ "test_data = [(33, 3524578),\n", " (87, 679891637638612258),\n", " (66, 27777890035288),\n", " (43, 433494437),\n", " (44, 701408733),\n", " (19, 4181),\n", " (98, 135301852344706746049),\n", " (65, 17167680177565),\n", " (32, 2178309),\n", " (11, 89)]\n", "for inp, out in test_data:\n", " with Tester([str(inp)]) as t:\n", " fib_k()\n", " assert len(t) == 1, \"Вам нужно вывести ровно одну строку с ответом\"\n", " assert t[0].strip() == str(out), (\"Неверный ответ, было \"\n", " \"введено число \" + str(inp) + \n", " \" ожидалось \" + str(out))\n", "print(\"Ура, всё верно!\")" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.6.8" } }, "nbformat": 4, "nbformat_minor": 2 }