Kodomo

Пользователь

Учебная страница курса биоинформатики,
год поступления 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.