Упражнения

A: Таблица ASCII

Выведите все символы ASCII с кодами от 33 до 126 и их коды в следующем виде:

Вывод
! 33
" 34
# 35
...
} 125
~ 126

B: От омеги до коппы

Напишите программу, которые выводит исторические кириллические символы, начиная с омеги и заканчивая коппой.

Программа должна вывести заглавные буквы, их коды — чётные числа от 1120 до 1152, разделяя символы пробелом.

Вывод
Ѡ Ѣ Ѥ Ѧ Ѩ Ѫ Ѭ Ѯ Ѱ Ѳ Ѵ Ѷ Ѹ Ѻ Ѽ Ѿ Ҁ 

С: Следующий символ

Дан один символ. Выведите следующий за ним символ в таблице ASCII.

Ввод Вывод
A
B
z
{

D: Символы в заданном интервале

Выведите подряд, без пробелов, все символы, лежащие в таблице ASCII между двумя заданными символами.

Программа получает на вход два символа, каждый в отдельной строке и должна вывести строку, начинающуюся первым из заданных символов и заканчивающуюся вторым.

Ввод Вывод
A
D
ABCD
0
9
0123456789

E: isdigit

Для данного символа проверьте, является ли он цифрой.

Решение оформите в виде функции isdigit(c: str) -> bool.

На проверку сдайте только тело функции.

В решении нельзя использовать циклы условную инструкцию. В решении нельзя использовать константы с неочевидным значением типа 48 или 57. Да и функция ord тоже не нужна.

Вызов функции Возвращаемое значение
isdigit('0')
True
isdigit('A')
False

Для тех, кто решил эту задачу. У строк в языке Python есть метод isdigit(), то есть использовать его нужно так: s.isdigit(). Если длина строки больше 1, то метод возвращает True, если все символы строки являются цифрами.

Помимо этого есть методы isalpha, isupper, islower, проверяющие, является ли символ буквой, заглавной буквой, строчной буквой. Об этих и других методах можно прочитать в документации.

F: upper

Напишите функцию upper(c: str) -> str, которая переводит символ в верхний регистр, то есть для строчной буквы латинского алфавита возвращает сооветствующую заглавную букву латинского алфавита, а для остальных символов возвращает тот же символ.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
upper('f')
'F'
upper('F')
'F'
upper('4')
'4'

G: lower

Напишите функцию lower(s: str) -> str, которая переводит все символы данной строки в нижний регистр.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
lower('Hello, world!')
'hello, world!'

Для тех, кто решил эту задачу. У строк в языке Python есть методы upper() и lower(), аналогичные данным. Об этих и других методах можно прочитать в документации.

H: Палиндром

Дано слово, состоящее только из заглавных и строчных латинских букв. Проверьте, верно ли что это слово читается одинаково как справа налево, так и слева направо (то есть является палиндромом), если считать заглавные и строчные буквы не различающимися.

Решение оформите в виде функции is_palindrome(s: str) -> bool, возвращающей значение типа bool.

Вызов функции Возвращаемое значение
is_palindrome('Radar')
True
is_palindrome('True')
False

I: Значение выражения - 1

Дана непустая строка, состоящая из \(n\) цифр (т.е. однозначных чисел), между которыми стоит \(n-1\) знак операции, каждый из которых может быть либо +, либо -. Вычислите значение данного выражения.

Решение оформите в виде функции evaluate(s: str) -> int, получающей в качестве аргумента строку и возвращающую ее значение.

На проверку сдайте только тело функции. Решение должно иметь сложность \(O(n)\), где \(n\) — длина строки.

Вызов функции Возвращаемое значение
evaluate('1+2-3')
0

J: Значение выражения - 2

Дано выражение одно из следующих видов: \(A+B\), \(A-B\) или \(A\ast B\), где \(A\) и \(B\) — целые неотрицательные числа. Определите значение этого выражения.

Решение оформите в виде функции evaluate(s: str) -> int, получающей в качестве аргумента строку и возвращающую ее значение.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
evaluate('2*2')
4
evaluate('100-101')
-1

K: Количество слов

Дана строка, возможно, содержащая пробелы. Определите количество слов в этой строке. Слово — это несколько подряд идущих букв латинского алфавита (как заглавных, так и строчных).

Решение оформите в виде функции count_words(s: str) -> int, возвращающее значение типа int.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
count_words('Yesterday, all my troubles seemed so far away')
8

L: Слова с прописной буквы

Дана строка. Измените регистр символов в этой строке так, чтобы первая буква каждого слова была заглавной, а остальные буквы —строчными.

Решение оформите в виде функции capitalize(s: str) -> str.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
capitalize('In a hole in the ground there lived a hobbit.')
'In A Hole In The Ground There Lived A Hobbit.'

M: Максимальная буква

Дана строка. Определите максимальную букву, которая встречается в этой строке, при этом заглавные и строчные буквы нужно считать одинаковыми. Под буквой подразумеваются как русские, так и английские буквы, строка может содержать русские и английские буквы.

При решении задачи вам понадобятся методы строк, упомянутые раньше:

s.isalpha() — возвращает True или False, в зависимости от того, является ли символ буквой (все символы строки, если их несколько).

s.upper() — возвращает значение строки, переведённой в верхний регистр.

s.lower() — возвращает значение строки, переведённой в нижний регистр.

Решение оформите в виде функции max_char(s: str) -> str. Функция должна возвращать максимальную букву в верхнем регистре.

Если в данной строке нет символов, являющихся буквами, функция возвращает пустую строку.

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
max_char('Встретив двусмысленность, отбрось искушение угадать.')
'Ь'

N: Частота появления букв

Дана программа, которая может содержать ASCII-символы и русские буквы. Посчитайте, сколько раз в этой строке встречается каждый возможный символ. Выведите все встречающиеся в этой строке символы в порядке возрастания их кодов, а затем количество вхождений этого символа. Пробелы при этом игнорируйте (считаются только символы, чьи коды больше 32).

Задача должна решаться за однократный проход по данной строке. Для этого создайте список count, в котором значение count[i] будет равно количеству вхождений символа chr(i) в данную строку.

Максимальный код символа русского алфавита равен 1105 (для буквы «ё»).

Ввод Вывод
Встретив двусмысленность, отбрось искушение угадать.
, 1
. 1
В 1
а 2
б 1
в 2
г 1
д 2
е 4
и 3
к 1
л 1
м 1
н 3
о 3
р 2
с 6
т 5
у 3
ш 1
ы 1
ь 3

O: Самая частая буква

Дана строка содержащая буквы русского и латинского алфавитов и иные символы. Определите, какая буква (или какие буквы) в этой строке встречается чаще всего. При решении этой задачи заглавные и строчные буквы считаются одинаковыми, а прочие символы, не являющиеся буквами, не учитываются. Буква «Ё» в тексте не встречается. Заглавные и строчные буквы считаются одинаковыми.

Программа должна вывести в первой строке все буквы, которые встречаются чаще всего в исходной строке. Выводить буквы необходимо в заглавном написании, в алфавитном порядке, без пробелов. Во второй строке выведите единственное число - сколько раз в данной строке встречаются эти буквы.

При решении этой задачи нельзя пользоваться вложенными циклами. Входная строка должна обрабатываться за один проход.

Ввод Вывод Примечание
Beautiful is better than ugly. Красивое лучше, чем уродливое.

4
Программа выводит английскую букву «T», затем русскую букву «E»

P: Анаграммы

Даны две строки. Определите, можно ли получить одну из другой перестановкой символов.

Программа получает на вход две строки, содержащие только ASCII-символы, не содержащие пробелы.

Программа должна вывести слово YES, если одна строка может быть получена из другой перестановкой букв или NO.

Заглавные и строчные буквы в этой задаче считаются различными.

Ввод Вывод
eleven_plus_two
twelve_plus_one
YES
Eleven_plus_two
Twelve_plus_one
NO

Q: Самое длинное слово

Дана строка. Найдите в этой строке самое длинное слово и выведите его. Если в строке несколько слов одинаковой максимальной длины, выведите первое из них. Решение оформите в виде функции longest_word(s: str) -> str, возвращающей значение типа str. Если в строке нет ни одной буквы, функция возвращает пустую строку.

Слово — это несколько подряд идущих букв латинского алфавита (как заглавных, так и строчных).

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
longest_word('In a hole in the ground there lived a hobbit.')
'ground'

R: Капитан Флинт

Капитан Флинт зарыл клад на Острове сокровищ. Он оставил описание, как найти клад. Описание состоит из строк вида: “North 5”, где первое слово – одно из “North”, “South”, “East”, “West”, а второе число – количество шагов, необходимое пройти в этом направлении.

Напишите программу, которая по описанию пути к кладу определяет точные координаты клада, считая, что начало координат находится в начале пути, ось OX направлена на восток, ось OY – на север.

Программа получает на вход последовательность строк указанного вида, завершающуюся строкой со словом “Treasure!”. Программа должна вывести два целых числа: координаты клада.

Ввод Вывод
North 5
East 3
South 1
Treasure!
3 4

S: Шифр Цезаря

В шифре Цезаря каждый символ заменяется на другой символ, третий по счету в алфавите после данного, с цикличность. То есть символ A заменяется на D, символ B - на E, символ C - на F, ..., символ Z на C.

Дана строка, зашифруйте ее при помощи шифра Цезаря. Решение оформите в виде функции caesar_cipher(s: str, k: int) -> str, возвращающей новую строку. s — исходная строка, k — величина сдвига. Величина сдвига может быть произвольным целым числом, в том числе и отрицательным.

В тексте могут быть только заглавные английские буквы и символы ASCII, не являющиеся буквами.

Вызов функции Возвращаемое значение
caesar_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.', 3)
'LQ D KROH LQ WKH JURXQG WKHUH OLYHG D KREELW.'

T: Шифр замены - зашифровать сообщение

Шифр замены  обобщение шифра Цезаря. Каждая буква сообщения меняется на какую-то другую букву (разные буквы меняются на разные буквы). Символы, не являющиеся буквами, остаются такими же. Ключом шифрования является перестановка: указание того, на какую букву должна быть заменена каждая другая буква.

Вам дана строка, содержащая только заглавные латинские буквы и символы ASCII, не являющиеся буквами. Зашифруйте её при помощи шифра замены.

Решение оформите в виде функции substitution_cipher(msg: str, key: str) -> str, возвращающей новую строку с зашифрованным сообщением. msg — исходное сообщение, key — ключ шифрования.

Ключ шифрования представляет собой строку длиной 26, являющейся перестановкой символов от A до Z. В строке последовательно записаны буквы, в которые переходят буквы A, B, C, ..., Z исходного сообщения.

Вызов функции Возвращаемое значение
substitution_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.', 'ABCDIFGHEJKLMNUPQRSTOVWXYZ')
'EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.'

U: Шифр замены - расшифровать сообщение

Расшифруйте сообщение, зашифрованное шифром замены.

Решение оформите в виде функции substitution_decipher(msg: str, key: str) -> str, возвращающей новую строку с расшифрованным сообщением. msg — зашифрованное сообщение, key — ключ шифрования, заданный как в предыдущей задаче.

Вызов функции Возвращаемое значение
substitution_decipher('EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.', 'ABCDIFGHEJKLMNUPQRSTOVWXYZ')
'IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.'

V: Значение выражения - 3

Дана строка, содержащая одно или более целых неотрицательных чисел, разделенных знаками “+” или “-”. Вычислите значение этого выражения.

Решение оформите в виде функции evaluate(s).

На проверку сдайте только тело функции.

Вызов функции Возвращаемое значение
evaluate('21+7-10')
18

W: 12-часовой формат времени

Во многих англоговорящих странах время записывается в 12-часовом формате с указанием одного из двух 12-часовых интервалов: до полудня (a.m.) или после полудня (p.m.). Формально запись времени в 12-часовом формате выглядит, как строка “h:mm x.m.”, где h — число часов от 1 до 12 (однозначное или двухзначное), mm — число минут от 00 до 59, дополненное нулями до двух разрядов, x — одна из двух букв “a” или “p”. Подробней примеры записи времени и их перевод в 24-часовой формат можно найти в википедии.

Дана строка с записью некоторого времени в 12-часовом формате. Выведите его в 24-часовом формате “hh:mm” (hh — количество часов от 00 до 23, дополненное нулями до двух разрядов, mm — количество минут от 00 до 59, дополненное нулями до двух разрядов).

Ввод Вывод
1:00 a.m.
01:00
12:34 p.m.
12:34

X: IP-адрес

В сети интернет каждому компьютеру присваивается четырехбайтовый код, который принято записывать в виде четырех чисел, каждое из которых может принимать значения от 0 до 255, разделенных точками. Вот примеры правильных IP-адресов:

127.0.0.0
192.168.0.1
255.0.255.255

Программа получает на вход строку из произвольных символов. Если эта строка является корректной записью IP-адреса, выведите YES, иначе выведите NO.

Ввод Вывод
127.0.0.1
YES

Y: Детская задача

Хорошо известна задача-шутка, в которой требуется продолжить числовую последовательность:

1
11
21
1211
111221
312211
13112221
1113213211
...

Свойства данного ряда изучались математиками, а сама последовательность названа look-and-say sequence.

Напишите программу, которая по данному числу \(k\le 25\) выводит \(k\)-е число в этой последовательности.

Ввод Вывод
4
1211

Z: Шифр перестановки

В шифре перестановки меняется порядок следования букв, но сами буквы не меняются. При шифровании сообщение разбивается на блоки длины \(n\), символы внутри блока переставляются в соответствии с ключом. Ключ — это перестановка длины \(n\).

Дано сообщение и ключ шифрования, зашифруйте сообщение при помощи данного ключа.

Длина ключа может быть строкой длиной \(n\) (\(1 \le n \le 9\)), состоящей из неповторяющихся цифр от 1 до \(n\). Перестановка показывает, на какие позиции переходят символы блока с номерами 1, 2, ..., \(n\). То есть перестановка вида 51234 означает, что блок длины 5 циклически сдвигается вправо на 1 символ.

При шифровании сообщение разбивается на блоки длины \(n\), если длина сообщения некратна \(n\), то в конец сообщения дописываются точки.

Решение оформите в виде функции transposition_cipher(msg: str, key: str) -> str, где msg — исходное сообщение, key — ключ шифрования.

Вызов функции Возвращаемое значение
transposition_cipher('IN A HOLE IN THE GROUND THERE LIVED A HOBBIT', '312')
' INHA EOLN IH TGE URO NDETH REVLI EDHA BOB.IT'

ZA: Значение выражения — 4

Строка состоит из целых неотрицательных чисел, разделенных знаками операций “+”, “-” и “*”. Вычислите значение этого выражения, выполняя действия по правилам арифметики.

Тесты к этой задаче закрытые.

Ввод Вывод
10-2*3
4

ZB: Значение выражения — 5

Строка состоит из целых неотрицательных чисел (последовательности цифр), бинарных операций “+”, “-” и “*” и круглых скобок. Вычислите значение этого выражения, выполняя действия по правилам арифметики.

В выражении нет пробелов и унарных операций.

Тесты к этой задаче закрытые.

Ввод Вывод
(1+(10+100))*(3-5)-0
-222

ZC: Значение выражения — 6

Добавим к предыдущей задаче операции “унарный плюс” и “унарный минус”

Ввод Вывод
(1-(-10-100))*(-3-(-5))-(+0)
222