Лаба: http://cs.mipt.ru/python/lessons/lab4.html.
В качестве ДЗ достаточно решить 6 задач: одну по функциям (по рекурсии), две по "неспискам", две по строкам и одну по "Картинкам на выставку".
По некоторым номерам в названии задачи есть ссылка на ресурс Питонтьютор. Если выбор в плане решения падает на такую задачу, рекомендуется перейти по соответствующей ссылке, чтобы посмотреть более полную версию условия (с примерами). (И, кроме условия, можно будет при желании и небольшую теорсправку там же на сайте почитать.)
Напишите рекурсивную функцию, вычисляющую факториал числа:
def factorial(n):
# Рекурсивно вычисляет факториал
print(factorial(3)) # 6
https://pythontutor.ru/lessons/functions/problems/negative_power.
Дано действительное положительное число a
и целоe число n
.
Вычислите power(a, n)
.
(Стандартной функцией возведения в степень пользоваться нельзя.)
Пример:
# Вход:
2
-3
# Выход:
0.125
Предполагается, что в каждой задаче этого раздела будет не лишним, кроме, возможно, "обычных" списков (list
), воспользоваться и другими типами данных для хранения и обработки нескольких элементов: множествами (set
) или кортежами (tuple
).
Компания "Motorama" проводит розыгрыш суперприза.
В каждой пачке с овсянкой спрятана маленькая карточка с буквой.
Всего есть восемь различных карточек: '1_M'
, '2_O'
, '3_T'
, '4_O'
, '5_R'
, '6_A'
, '7_M'
, '8_A'
(у каждой карточки есть номер, то есть, например, с буквой 'M'
есть две различные карточки).
Первый, кто соберёт все карточки (то есть чтобы получилось слово "MOTORAMA"), получит право на суперприз в виде супербольшой суммы денег.
Несколько человек собирали эти карточки, но ни у одного не получилось собрать полный комплект. Смогут ли они победить, объединив усилия?
В файле motorama.txt на каждой строчке через пробел перечислены карточки, собранные отдельными охотниками за призом (каждая строчка — карточки одного человека). Напишите программу, которая определяет, получится ли составить слово "MOTORAMA", если объединить вместе все карточки разных людей. (Выход программы — одно слово: "ДА", если можно, и "НЕТ", если нельзя.)
Motorama, 1991 (https://www.kinopoisk.ru/film/1820).
...Мокрый снег залепил молочные стекла оранжереи. Ветер трепал хвосты вымпелов и покачивал далекие верхушки мачт недостроенного флота. С моря наползал туман.
("Буря крыльев", М. Джон Харрисон. Перевод: Татьяна Серебряная)
Говорят, что эскимосы различают десятки (если даже не сотни) оттенков и состояний снега. А сколько оттенков белого сможете найти вы с помощью программы на Питоне?
В цветовой модели RGB каждый цвет представляется как "смесь" трёх цветов в разной пропорции: красного (R), зелёного (G) и синего (B).
Доли каждого из трёх цветов можно представлять как действительное число от 0 до 1.
Или, ещё один популярный вариант, как целое число от 0 до 255.
Например, вот цвет, который в RGB координатах представляется как (250, 37, 154) или (0.980, 0.145, 0.604).
В файле colours.txt построчно записаны цвета. Каждый цвет — как три RGB компоненты (целые числа), разделённые пробелом. Напишите программу, которая бы определила, сколько в указанном файле содержится оттенков белого цвета. Белым будет считать такой цвет, у которого каждая из трёх RGB компонент не меньше 230.
Результат работы программы — одно число, количество оттенков белого.
Это число можно вывести на экран с помощью функции print
или записать в файл с именем result.txt
.
Музыка для Маши — это больше, чем просто приятный "фонозаполнитель". Музыка может словно дарить крылья, позволяя красочнее ощущать какие-то моменты. Или может в хорошем смысле отвлекать, позволяя оставаться на плаву, когда ощущать уже больше вообще ничего не хочется. (Лабы по физике Маша оформляет только с музыкой.)
В файле scrobbles.txt вперемешку представлена история прослушиваний Маши за некоторый промежуток времени.
Формат записей: каждая строчка — это отдельный трек, сначала пишется имя группы, потом пробел, дефис, снова пробел, и название трека.
Например, возможная строчка: Chromatics - Shadow
.
Напишите программу, определяющую количество различных исполнителей, которых слушала Маша.
Например:
# Вход:
Chromatics - Shadow
Chromatics - Shadow
Julee Cruise - Falling
Julee Cruise - The World Spins
Chromatics - Shadow
# Выход:
2
Результат можно просто вывести на экран или записать в файл с именем result.txt
.
Пока Пуаро внимательно осматривает в парке место убийства, капитан Гастингс решил попробовать следующий интересный метод поиска убийцы.
У Гастингса есть список всех подозреваемых и возможность задавать вопросы каждому из них.
Все из них отрицают, что были в парке в момент совершения убийства прошлой ночью.
Однако Гастингс чувствует, что кто-то из них врёт.
А если в чём-то врёшь, то не сложно рано или поздно самому запутаться в показаниях.
Поэтому Гастингс решает провести "китайский допрос с пристрастием".1
Он многократно задаёт подозреваемым один и тот же вопрос: "Где вы были прошлой ночью в момент убийства?"
И записывает их ответы в файл suspects_answers.txt.
В формате: одна строчка — один ответ.
Сначала записывается имя человека, потом пробел-дефис-пробел, потом ответ (место нахождения в момент убийства).
Например, строка Паркер - Паб
означает, что подозреваемый Паркер был в пабе.
Помогите Гастингсу — напишите программу, которая просмотрит все ответы в указанном файле и найдёт убийцу.
Убийца — это тот человек, который "запутается в показаниях": сначала назовёт одно место, а потом другое.
Программа должна вывести на экран (или записать в файл с именем result.txt
) имя убийцы или строчку "Надо продолжать допрос!"
, если убийца пока не найден.
Пример:
# Вход:
Паркер - Паб
Паркер - Паб
Паркер - Клуб
# Выход:
Паркер
# Вход:
Паркер - Паб
Паркер - Паб
Паркер - Паб
# Выход:
Надо продолжать допрос!
Хью Фрейзер в роли Артура Гастингса (https://pinterest.com/pin/468374429966964448).
https://pythontutor.ru/lessons/sets/problems/number_of_coincidental.
Даны два списка чисел. Посчитайте, сколько чисел содержится одновременно как в первом списке, так и во втором.
Пример:
# Вход:
1 3 2
4 3 2
# Выход:
2
https://pythontutor.ru/lessons/sets/problems/occurs_before.
Во входной строке записана последовательность чисел через пробел.
Для каждого числа выведите слово 'YES'
(в отдельной строке), если это число ранее встречалось в последовательности, или 'NO'
, если не встречалось.
Пример:
# Вход:
1 2 3 2 3 4
# Выход:
NO
NO
NO
YES
YES
NO
https://pythontutor.ru/lessons/sets/problems/number_of_words.
Дан текст: в первой строке записано число строк, далее идут сами строки. Определите, сколько различных слов содержится в этом тексте.
Словом считается последовательность непробельных символов, идущих подряд; слова разделены одним или бо́льшим числом пробелов или символами конца строки.
Пример:
# Вход:
4
She sells sea shells on the sea shore;
The shells that she sells are sea shells I'm sure.
So if she sells sea shells on the sea shore,
I'm sure that the shells are sea shore shells.
# Выход:
19
Напишите функцию, которая находит сумму всех цифр в поданной на вход строке. (Принимает строку, возвращает число — сумму цифр.)
def sum_digits(s):
# Суммирует цифры
print(sum_digits("Hello world!")) # 0
print(sum_digits("He11o wor1d!")) # 3
print(sum_digits("123")) # 6
print(sum_digits("abc1efg2hij3")) # 6
print(sum_digits("10 + 3 > -17.5")) # 17
Напишите функцию, принимающую на вход строку и возвращающую новую строку, построенную по исходной, так что "маленькие" буквы становятся "большими" и наоборот.
def mirror_case(s):
# Меняет регистр с маленького на большой и наоборот
print(mirror_case("ЗаБоРчИк")) # зАбОрЧиК
Напишите функцию, которая получает на вход несколько фактов о человеке и составляет по ним короткое связное описание.
Параметры функции:
- имя (строка)
- возраст (целое число)
- средняя оценка по предметам (число с плавающей точкой)
- хобби (список строк)
- любимое блюдо (строка)
Функция возвращает одну строку – связный "рассказ" о человеке. Рассказ строится по шаблону, суть которого лучше увидеть на примере:
def make_description(name, age, grade, hobbies, favourite_food):
# Составляет описание
description = make_description(
name='Ник', age=18, grade=7.4, favourite_food='ролл Калифорния',
hobbies=['бадминтон', 'бас-гитара', 'прокрастинация'],
)
print(description) # Меня зовут Ник, мне 18 лет. Средняя оценка 7,4. Из еды очень люблю ролл Калифорния. Мои хобби: бадминтон, бас-гитара и прокрастинация.
Lollipop Chainsaw, 2012 (https://lollipopchainsaw.fandom.com/wiki/Nick_Carlyle).
Строки файла encrypted.txt "зашифрованы": записаны задом наперёд.
Напишите программу, которая переворачивает все строки обратно и записывает результат в файл result.txt
.
Пример:
# Вход
olleh
dlrow
# Выход
hello
world
Будем считать "криком" слово, состоящее из нескольких (больше одной) подряд идущих символов "A"
, за которыми стоит восклицательный знак.
Например, "AAA!"
это крик, "AAAAAAA!"
тоже.
Но "AAA."
криком не считается, как и "A!"
.
Напишите программу, которая в строке заменяет все "крики" на строку "Аа."
(более "тихая" версия крика).
Например:
# Вход
Принести ещё пива? Хорошо, сейчас вернусь... ААААА!
# Выход
Принести ещё пива? Хорошо, сейчас вернусь... Аа.
# Вход
ААА! Какой ужас! занавески зелёные, обои красные! ААААААА!
# Выход
Аа. Какой ужас! занавески зелёные, обои красные! Аа.
# Вход
Мы батарейки ААА, или "мизинчики".
# Выход
Мы батарейки ААА, или "мизинчики".
Напишите функцию, которая в поданной ей на вход строке находит все имена (возвращает имена как список строк).
Достаточно, если функция будет правильно работать только на приведённом примере. Однако решение всё-таки должно быть осмысленное, а не просто "вернуть правильный ответ".
def find_names(s):
# Ищет имена в тексте
text = """
Привет! Меня зовут Анжелика.
Кто он? Его имя Данте.
Как только я сказал, что меня зовут Джон, мне дали пройти.
Маша, пойдём сегодня гулять?
Моё имя Фредди. Теперь вы знаете, как зовут ваш ночной кошмар.
Этот меч теперь твой, Хорнрак.
Игорь, быстрее, клади его на стол, начинается гроза!
"""
names = find_names(text)
print(names) # ['Анжелика', 'Данте', 'Джон', 'Маша', 'Фредди', 'Хорнрак', 'Игорь']
https://pythontutor.ru/lessons/str/problems/slices.
Дана строка. Сначала выведите третий символ этой строки. Во второй строке выведите предпоследний символ этой строки. В третьей строке выведите первые пять символов этой строки. В четвертой строке выведите всю строку, кроме последних двух символов. В пятой строке выведите все символы с чётными индексами (считая, что индексация начинается с 0, поэтому символы выводятся начиная с первого). В шестой строке выведите все символы с нечётными индексами, то есть начиная со второго символа строки. В седьмой строке выведите все символы в обратном порядке. В восьмой строке выведите все символы строки через один в обратном порядке, начиная с последнего. В девятой строке выведите длину данной строки.
Пример:
# Вход:
Abrakadabra
# Выход:
r
r
Abrak
Abrakadab
Arkdba
baaar
arbadakarbA
abdkrA
11
https://pythontutor.ru/lessons/str/problems/first_and_last_occurences.
Дана строка.
Если в этой строке буква 'f'
встречается только один раз, выведите её индекс.
Если она встречается два и более раз, выведите индекс её первого и последнего появления.
Если буква 'f'
в данной строке не встречается, ничего не выводите.
Пример:
# Вход:
office
# Выход:
1 2
https://pythontutor.ru/lessons/str/problems/second_occurence.
Дана строка.
Найдите в этой строке второе вхождение буквы 'f'
, и выведите индекс этого вхождения.
Если буква 'f'
в данной строке встречается только один раз, выведите число -1, а если не встречается ни разу, выведите число -2.
Пример:
# Вход:
coffee
# Выход:
3
https://pythontutor.ru/lessons/str/problems/delete_chunk.
Дана строка, в которой буква 'h'
встречается минимум два раза.
Удалите из этой строки первое и последнее вхождение буквы 'h'
, а также все символы, находящиеся между ними.
Пример:
# Вход:
In the hole in the ground there lived a hobbit
# Выход:
In tobbit
https://pythontutor.ru/lessons/str/problems/reverse_chunk.
Дана строка, в которой буква 'h'
встречается как минимум два раза.
Разверните последовательность символов, заключённую между первым и последним появлением буквы 'h'
, в противоположном порядке.
Пример:
# Вход:
In the hole in the ground there lived a hobbit
# Выход:
In th a devil ereht dnuorg eht ni eloh ehobbit
См. задание 2 из лабы про Картинки: надо с помощью библиотеки pygame
нарисовать любую из приведённых на сайте картинок.
Footnotes
-
Термин придумал сам Гастингс. Возможно, он таким образом проводит аналогию между своим способом допроса и китайской пыткой водой. Один и тот же многократно повторяющийся вопрос как бы "капает" на психику убийцы (и не только убийцы), пока он или она окончательно не расколется. ↩