Учебная страница курса биоинформатики,
год поступления 2016
Начиная с этого практикума, будет проверяться не только корректность работы программы, но и его соответствие рекомендациям PEP8 (см. также оригинальный английский текст). Для зачёта соблюдение стандарта не обязательно, но баллы за плохой код могут быть снижены до минимума.
Практикум 9. Функции и модули. Запись в файл.
(*) — дополнительное задание
Всем заданиям присвоены мнемоники, указанные после названий. Мнемоники заданий подчеркнуты.
Внимание: поскольку некоторые задания подразумевают многомодульные программы, решения каждой задачи кладите в отдельную папку ~/term1/block3/credits/Lastname_pr9_mnemonics. При этом основная программа должна быть в файле ~/term1/block3/credits/Lastname_pr9_mnemonics/Lastname_pr9_mnemonics.py , а файл(ы) с функциями могут называться произвольно (но без использования пробелов, кириллицы, заглавных букв!). Разумеется, при импорте модуля в основную программу его имя должно совпадать с именем соответствующего файла без расширения.
См. советы и подсказки. Может пригодиться также памятка позапрошлого года.
Во всех заданиях входные параметры получайте из командной строки.
1. Тригонометрия. Мнемоника: trigonometry
Программа принимает угол в градусах и печатает его синус и косинус с четырьмя знаками после запятой. Значение угла может быть любым вещественным числом.
Пример входа:
python Pupkine_pr9_trigonometry.py 90
Пример выхода:
1.0000 0.0000
Подключите модуль math. С помощью dir и help узнайте, как переводить из градусов в радианы и как вызывается синус и косинус. В подсказках см., как отформатировать действительное число с нужным количеством знаков после запятой.
2. Приближённое вычисление производной синуса. Мнемоника: der-sin Программа принимает на вход число x и шаг d (то и другое — в радианах) и вычисляет производную синуса по приближённой формуле:
f'(x) ≈ (f(x + d) - f(x - d))/2d
(в данном случае f(x) = sin x), после чего печатает в одну строку через табулятор четыре числа: x, производную, вычисленную по приближённой формуле, настоящую производную и модуль разности между настоящей и приближённой производной. Каждое число печатайте с 4 знаками после запятой.
2a (* – дополнительно, результат описывайте в протоколе Lastname_pr9.doc) какое d надо взять, чтобы приближённое значение производной для любого x отличалось от истинного меньше, чем на одну тысячную?
2b (* – дополнительно, результат там же): сравните точность вышеприведённой формулы и другой приближённой формулы для производной:
f'(x) ≈ (f(x + d) - f(x))/d
при одинаковых значениях x и d (не на одном примере, разумеется — нужно выявить тенденцию!)
2c (** – дополнительно, результат там же) то же, что 2b, но для других функций (логарифм, экспонента, квадратный корень, арктангенс), чьи производные вам известны.
3. Случайная последовательность. Мнемоника: randomdna
Для тестирования различных методов обработки биологических последовательностей часто применяют случайные последовательности. Самый простой способ создать случайную последовательность — это выбирать на каждую позицию последовательности случайную букву (одну из A, T, G, C) с равной вероятностью.
Программа принимает длину последовательности и создаёт файл randomseq.fasta, в который пишет случайную последовательность заданной длины с именем "random" и без описания (вспоминайте fasta-формат!).
Пример входа:
python Pupkine_pr9_randomdna.py 10
Пример выхода (содержимое файла randomseq.fasta):
>random CATCAGGGAC
4. Много случайных последовательностей. Мнемоника: randomdnamany
Программа принимает через аргументы командной строки число последовательностей, минимальную и максимальную длины последовательностей и создаёт файл randomseqs.fasta, в который пишет последовательности согласно пожеланиям пользователя. Длина каждой из последовательностей выбирается случайным образом между минимальной и максимальной длиной включительно. Имена последовательностям присваивайте по своему усмотрению, но без повторов (иначе фаста-файл не будет корректным).
Пример входа:
python Pupkine_pr9_randomdnamany.py 2 10 20
Пример выхода (randomseqs.fasta):
>random-1 CATCAGGGACCGCA >random-2 GCAATGAATGCTCAC
Эта программа должна подключать написанный вами же модуль, в котором содержатся: (i) функция, получающая в качестве аргумента длину последовательности и возвращающая случайную последовательность указанной длины; (ii) функция, получающая номер последовательности (число) и возвращающая ее название для фаста-файла (строку).
Дополнительные задания
* 5. Числа Фибоначчи. Мнемоника: fibonacci
Числа Фибоначчи — элементы бесконечной числовой последовательности
0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...
в которой каждое последующее число равно сумме двух предыдущих чисел.
Договоримся нумеровать элементы последовательности с нуля. Таким образом, нулевой элемент последовательности равен 0, первый: 1, второй: 1 = 0 + 1, третий: 2 = 1 + 1 и т.д.
Программа принимает число N через аргументы командной строки и создаёт список членов последовательности Фибоначчи с индексами от 0 до N включительно. Таким образом, в списке будет N+1 элементов.
Полученный список программа выводит через пробел (print).
Пример входа:
python Pupkine_pr9_fibonacci.py 6
Пример выхода:
0 1 1 2 3 5 8
* 6. Поиск палиндромов. Мнемоника: find-selfcomplement
Через аргументы командной строки программа получает имя фаста-файла и название последовательности, с которой она в дальнейшем и работает. Кроме того, программа получает имя выходного фаста-файла (третий аргумент командной строки).
Найти максимальные по длине подстроки в составе данной последовательности, представляющие собой палиндромы. Минимальная длина найденного палиндрома равна 4. Если один палиндромом входит в другой (младший палиндром может быть расположен при этом не обязательно по центру старшего палиндрома), то выводить нужно только более длинный.
(*) Подумайте, почему ДНК-палиндромы всегда четной длины. Ответ в протокол.
Найденные палиндромы в любом порядке записываются в выходной файл. Имена последовательностей произвольные, но не должны повторяться.
Пример входа:
python Pupkine_pr9_find-selfcomplement.py mydna.fasta test2 mypalindromes.fasta
Входной файл mydna.fasta (имя файла передаётся через аргументы командной строки):
>test1 description 1 TTTGCACA >test2 description 2 GTTTAAAGGG >test3 description 3 TAAT
Выходной файл mypalindromes.fasta (имя файла передаётся через аргументы командной строки):
>sc1 TTTAAA
** 7. Игра НИМ. Мнемоника: nim
Ним — математическая игра, в которой два игрока по очереди берут предметы, разложенные на несколько кучек. За один ход может быть взято любое количество предметов (большее нуля) из одной кучки. Выигрывает игрок, взявший последний предмет.
Игра интересна тем, что для неё существует простая выигрышная стратегия. Кому интересно, могут над ней подумать, а для выполнения этого задания можно воспользоваться готовой стратегией.
Напишите программу, играющую с игроком в НИМ и выигрывающую всегда, когда это возможно.
Пользователь вводит начальные количества камней в кучках, разделяя их пробелами:
1 2 4
Число камней в каждой кучке должно быть натуральным.
Программа решает, будет ли она ходить первой или второй (в соответствии с выигрышной стратегией). Если решила, что будет ходить первой, то делает ход и печатает новое состояние игры:
1 2 3
Если программа решила ходить второй, то она перепечатывает исходное состояние игры.
Затем программа принимает ввод нового состояния игры от пользователя. Пустые кучки обозначаются числом 0. Если пользователь ошибся с вводом (ввёл что-то вместо списка чисел нужной длины или ввёл состояние игры, которое не может получиться в результате его хода), то программа должна напечатать фразу, включающую слово error и предложить пользователю переходить.
Так они и ходят, пока кто-то не возьмёт последний камень (и введёт список из нулей). После этого программа печатает, кто победил. Если победил пользователь (чего не должно происходить, если программа следует выигрышной стратегии), выдача программы в этом месте должна содержать слово you, а если победил компьютер, выдача должна содержать me.