Коды символов

Любой текст состоит из символов. Символ — это некоторый значок, изображение. Один и тот же символ можно записать по-разному, например, два человека по-разному напишут от руки букву «A», и даже в компьютерном представлении одна и та же буква будет выглядеть по-разному, если ее отображать разными шрифтами, при этом это будет все равно один и тот же символ. Верно и другое: разные символы могут быть записаны одинаково, например, вот две разные буквы, одна — латинского алфавита, другая - русского: «A» и «А». Несмотря на то, что они выглядят одинаково, удобней считать их разными символами.

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

Первоначально договорились под кодирование одного символа отвести один байт, то есть 8 бит информации. Таким образом можно было закодировать 256 различных значений, то есть в записи текста можно использовать 256 различных символов. Этого достаточно, чтобы отобразить все символы латинского алфавита, цифры, знаки препинания и некоторые другие символы. Стандарт, указывающий, какие числовые коды соответствуют каким основным символам, называется ASCII. В таблицу ASCII включены символы с кодами от 0 до 127, то есть ASCII - это семибитный код. Вот так выглядит таблица ASCII:

Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char  Dec  Oct  Hex | Char Dec  Oct   Hex
-------------------------------------------------------------------------------------
(nul)   0 0000 0x00 | (sp)   32 0040 0x20 | @      64 0100 0x40 | `      96 0140 0x60
(soh)   1 0001 0x01 | !      33 0041 0x21 | A      65 0101 0x41 | a      97 0141 0x61
(stx)   2 0002 0x02 | "      34 0042 0x22 | B      66 0102 0x42 | b      98 0142 0x62
(etx)   3 0003 0x03 | #      35 0043 0x23 | C      67 0103 0x43 | c      99 0143 0x63
(eot)   4 0004 0x04 | $      36 0044 0x24 | D      68 0104 0x44 | d     100 0144 0x64
(enq)   5 0005 0x05 | %      37 0045 0x25 | E      69 0105 0x45 | e     101 0145 0x65
(ack)   6 0006 0x06 | &      38 0046 0x26 | F      70 0106 0x46 | f     102 0146 0x66
(bel)   7 0007 0x07 | '      39 0047 0x27 | G      71 0107 0x47 | g     103 0147 0x67
(bs)    8 0010 0x08 | (      40 0050 0x28 | H      72 0110 0x48 | h     104 0150 0x68
(ht)    9 0011 0x09 | )      41 0051 0x29 | I      73 0111 0x49 | i     105 0151 0x69
(nl)   10 0012 0x0a | *      42 0052 0x2a | J      74 0112 0x4a | j     106 0152 0x6a
(vt)   11 0013 0x0b | +      43 0053 0x2b | K      75 0113 0x4b | k     107 0153 0x6b
(np)   12 0014 0x0c | ,      44 0054 0x2c | L      76 0114 0x4c | l     108 0154 0x6c
(cr)   13 0015 0x0d | -      45 0055 0x2d | M      77 0115 0x4d | m     109 0155 0x6d
(so)   14 0016 0x0e | .      46 0056 0x2e | N      78 0116 0x4e | n     110 0156 0x6e
(si)   15 0017 0x0f | /      47 0057 0x2f | O      79 0117 0x4f | o     111 0157 0x6f
(dle)  16 0020 0x10 | 0      48 0060 0x30 | P      80 0120 0x50 | p     112 0160 0x70
(dc1)  17 0021 0x11 | 1      49 0061 0x31 | Q      81 0121 0x51 | q     113 0161 0x71
(dc2)  18 0022 0x12 | 2      50 0062 0x32 | R      82 0122 0x52 | r     114 0162 0x72
(dc3)  19 0023 0x13 | 3      51 0063 0x33 | S      83 0123 0x53 | s     115 0163 0x73
(dc4)  20 0024 0x14 | 4      52 0064 0x34 | T      84 0124 0x54 | t     116 0164 0x74
(nak)  21 0025 0x15 | 5      53 0065 0x35 | U      85 0125 0x55 | u     117 0165 0x75
(syn)  22 0026 0x16 | 6      54 0066 0x36 | V      86 0126 0x56 | v     118 0166 0x76
(etb)  23 0027 0x17 | 7      55 0067 0x37 | W      87 0127 0x57 | w     119 0167 0x77
(can)  24 0030 0x18 | 8      56 0070 0x38 | X      88 0130 0x58 | x     120 0170 0x78
(em)   25 0031 0x19 | 9      57 0071 0x39 | Y      89 0131 0x59 | y     121 0171 0x79
(sub)  26 0032 0x1a | :      58 0072 0x3a | Z      90 0132 0x5a | z     122 0172 0x7a
(esc)  27 0033 0x1b | ;      59 0073 0x3b | [      91 0133 0x5b | {     123 0173 0x7b
(fs)   28 0034 0x1c | <      60 0074 0x3c | \      92 0134 0x5c | |     124 0174 0x7c
(gs)   29 0035 0x1d | =      61 0075 0x3d | ]      93 0135 0x5d | }     125 0175 0x7d
(rs)   30 0036 0x1e | >      62 0076 0x3e | ^      94 0136 0x5e | ~     126 0176 0x7e
(us)   31 0037 0x1f | ?      63 0077 0x3f | _      95 0137 0x5f | (del) 127 0177 0x7f

При этом символы с кодами, меньшими 32 - это специальные управляющие символы, которые не отображаются на экране. Например, для того, чтобы обозначить конец строки в системе Linux используется один символ с кодом 10, а в системе Windows - два подряд идущих символа с кодами 13 и 10, символы с кодами 48-57 соответствуют начертанию арабских цифр (обратите внимание, символ с кодом 0 - это вовсе не символ, отображающийся на экране, как «0»), символы с кодами 65-90 - заглавные буквы буквы латинского алфавита, а если к их кодам прибавить 32, то получатся строчные буквы латинского алфавита. В промежутках между указанными диапазонами находятся знаки препинания, математические операции и прочие символы.

Но в ASCII-таблицы нет русских букв! А также нет букв сотен других национальных алфавитов. Первоначально для отображения букв национальных алфавитов использовали вторую половину возможного значения байта, то есть символы с кодами от 128 до 255. Это приводило к множеству проблем, например, поскольку 128 значений явно недостаточно для того, чтобы отобразить символы всех национальных алфавитов (даже недостаточно для того, чтобы отобразить символы одного алфавита, например, китайской письменности. Поэтому в настоящее время для кодирования символов используется стандарт Unicode, последняя версия 13.0 которого (март, 2020) включает 143,859 различных символов. Естественно, для кодирования Unicode-символов недостаточно одного байта на символ, поэтому используются многобайтовые кодировки (для представления одного символа необходимо несколько байт).

Язык программирования Python — современный язык, поэтому он работает исключительно с Unicode-символами.

Код символа можно определить при помощи функции ord. Эта функция получает на вход строку, которая должна состоять ровно из одного символа. Функция возвращает код этого символа. Например, ord('A') вернет число 65.

Обратная функция получения по числовому коду его номера называется chr.

Сравнение символов

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

Также в питоне определены и операции сравнения строк, которые также сравниваются в лексикографическом порядке.

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

Строки и списки

Строки в языке Питон, в отличии от списков, являются неизменными объектами, то есть в отличии от списков нельзя изменить отдельный символ строки: операция A[i] = ... является допустимой, если A список, и недопустимой, если A — строка.

Один символ в строке можно поменять, если создать новую строку, например, следующий код меняет i-й символ строки на символ @.

A = A[:i] + '@' + A[i+1:]

К сожалению, подобное изменение требует время, пропорциональное длине строки.

Преобразование строки S в список символов A:

A = list(S)

Преобразование списка символов в строку:

S = ' '.join(A)
или, если пробелы между символами не нужны,
S = ''.join(A)

Замечание по коду

При написании программ может возникнуть желание использовать «странные» константы в духе 48 или 65. Каждая такая константа имеет смысл (откуда вы её взяли?). Вместо самой константы пишите её смысл. Программы, в которых встречаются подобные константы, приниматься не будут!

A: Таблица ASCII

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

! 33
" 34
# 35
...
} 125
~ 126
IDE

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

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

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

Ѡ Ѣ Ѥ Ѧ Ѩ Ѫ Ѭ Ѯ Ѱ Ѳ Ѵ Ѷ Ѹ Ѻ Ѽ Ѿ Ҁ 

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

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

A
B
z
{
IDE

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

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

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

A
D
ABCD
0
9
0123456789
IDE

E: isdigit

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

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

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

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

isdigit('0')
0
True
isdigit('A')
A
False
Код вызова функции для тестирования
res = isdigit(input())
if type(res) != bool:
    print("Функция должна возвращать значение типа bool")
print(res)

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

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

IDE

F: upper

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

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

upper('f')
f
F
upper('F')
F
F
upper('4')
4
4
Код вызова функции для тестирования
src = input()
res = upper(src)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)
IDE

G: lower

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

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

lower('Hello, world!')
Hello, world!
hello, world!
Код вызова функции для тестирования
src = input()
res = lower(src)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)

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

IDE

H: Палиндром

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

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

is_palindrome('Radar')
Radar
True
is_palindrome('True')
True
False
Код вызова функции для тестирования
res = is_palindrome(input())
if type(res) != bool:
    print("Функция должна возвращать значение типа bool")
print(res)
IDE

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

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

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

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

evaluate('1+2-3')
1+2-3
0
Код вызова функции для тестирования
res = evaluate(input())
if type(res) != int:
    print("Функция должна возвращать значение типа int")
else:
    print(res)
IDE

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

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

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

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

evaluate('2*2')
2*2
4
evaluate('100-101')
100-101
-1
Код вызова функции для тестирования
res = evaluate(input())
if type(res) != int:
    print("Функция должна возвращать значение типа int")
else:
    print(res)
IDE

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

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

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

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

count_words('Yesterday, all my troubles seemed so far away')
Yesterday, all my troubles seemed so far away
8
Код вызова функции для тестирования
res = count_words(input())
if type(res) != int:
    print("Функция должна возвращать значение типа int")
else:
    print(res)
Подсказка
Это ведь можно сделать за пяток строчек, но как?...

В этой задаче можно получить очень короткое и простое решение, если считать не слова, а... концы слов! Концы слов найти легко: там идёт буква, а после неё — идёт не-буква. Только есть одна тонкость... Почему-то всё работает на тесте "hello!" и ломается на тесте "hello".

IDE

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.
'In A Hole In The Ground There Lived A Hobbit.'
Код вызова функции для тестирования
src = input()
res = capitalize(src)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)
IDE

Дополнительные методы строк


ФункцияОписаниеПример
Строчные/прописные
str.capitalize Переводит первый символ строки в верхний регистр, а все остальные в нижний
>>> 'привет, МИР!'.capitalize()
'Привет, мир!'
str.lower Преобразование строки к нижнему регистру
>>> 'Странная ФУНКция'.lower()
'странная функция'
str.swapcase Переводит символы нижнего регистра в верхний, а верхнего – в нижний
>>> 'Странная ФУНКция'.swapcase()
'сТРАННАЯ функЦИЯ'
str.title Первую букву каждого слова переводит в верхний регистр, а все остальные в нижний
>>> 'Странная ФУНКция'.title()
'Странная Функция'
str.upper Преобразование строки к верхнему регистру
>>> 'Странная ФУНКция'.upper()
'СТРАННАЯ ФУНКЦИЯ'
Обрезка и выравнивание
str.center(width, [fill]) Возвращает отцентрованную строку, по краям которой стоит символ fill (пробел по умолчанию)
>>> 'xxx'.center(7)
'  xxx  '
str.ljust(width, fillchar=" ") Делает длину строки не меньшей width, по необходимости заполняя последние символы символом fillchar. Также есть метод rjust, выравнивающий по правому краю
>>> 'xxx'.ljust(7)
'xxx    '
>>> 'xxx'.rjust(7)
'    xxx'
str.zfill(width) Делает длину строки не меньшей width, по необходимости заполняя первые символы нулями
>>> '123'.zfill(5)
'00123'
str.strip([chars]) Удаление пробельных символов в начале и в конце строки, либо символов из параметра chars, если он передан. Также есть команды lstrip и rstrip, удаляющие символы только слева или только справа
>>> ' foo bo zooo   '.strip()
'foo bo zooo'
>>> '( ни за что!:-))'.strip('()-: ')
'ни за что!'
Проверка типа строки
str.isalnum Состоит ли строка из букв и цифр
>>> 'Wy7'.isalnum()
True
str.isalpha Состоит ли строка из букв
>>> 'Wy7'.isalpha()
False
str.isdigit Состоит ли строка из цифр
>>> '12313'.isdigit()
True
str.islower Состоит ли строка из символов в нижнем регистре
>>> 'привет, мир'.islower()
True
str.isspace Состоит ли строка из неотображаемых символов (пробел, табуляция, перенос строки и т.п.)
>>> ' \n\t\r'.isspace()
True
str.isupper Состоит ли строка из символов в верхнем регистре
>>> 'ПРИВЕТ, МИР'.isupper()
True
Нарезка и склейка строк
str.join Склеивает все строки из переданного параметра, используя соединитель (возможно, пустой)
>>> ', '.join(('кот', 'пёс', 'ёж'))
'кот, пёс, ёж'
str.split(sep=None, maxsplit=-1) Разрезать строку по пробельным символам. Если указан sep, то по символам sep. Если указан maxsplit, то нарезается не более, чем на указанное количество кусков. Также есть метод rsplit, который выдаст не более maxsplit кусков, считая справа
>>> 'пёт  кот     слон'.split()
['пёт', 'кот', 'слон']
>>> 'foo, boo, zoo'.split(', ')
['foo', 'boo', 'zoo']
str.splitlines Нарезать большой кусок текста на строки по любому из символов переноса ст
>>> """И днём, и ночью
Кот учёный...""".splitlines()
['И днём, и ночью', 'Кот учёный...']
str.partition Ищет шаблон в строке. Возвращает кортеж из строки до шаблона, самого шаблона, и строки после.
>>> 'fooboozoo'.partition('boo')
('foo', 'boo', 'zoo')
Посимвольная замена
str.maketrans Создаёт таблицу замены для translate. Принимает на вход две строки одинаковой длины.
>>> trans = str.maketrans('бгл', 'bgl')
str.translate Используя изготовленную при помощи maketrans таблицу, произвести посимвольную замену
>>> 'благодать'.translate(trans)
'blаgодать'

Кроме того, в модуле string можно найти ряд полезных констант:

string.ascii_letters   = abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
string.ascii_lowercase = abcdefghijklmnopqrstuvwxyz
string.ascii_uppercase = ABCDEFGHIJKLMNOPQRSTUVWXYZ
string.digits          = 0123456789
string.hexdigits       = 0123456789abcdefABCDEF
string.octdigits       = 01234567
string.punctuation     = !"#$%&'()*+,-./:;<=>?@[\]^_`{|}~
string.printable       = 0123456789abcdefghijklmnopqrstuvwxyzABCD...
string.whitespace      = " \t..."
Они включают себя только ASCII символы, поэтому разные тонкие вещи с юникодом решать не помогут.

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

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

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

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

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

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

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

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

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

max_char('Встретив двусмысленность, отбрось искушение угадать.')
Встретив двусмысленность, отбрось искушение угадать.
Ь
Код вызова функции для тестирования
src = input()
res = max_char(src)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(res) > 1:
    print("Функция должна возвращать строку длины 1 или пустую строку")
elif not (res == '' or res.isalpha()):
    print("Функция должна возвращать пустую строку или строку из одной буквы")
else:
    print(res)
IDE

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
IDE

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

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

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

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

Beautiful is better than ugly. Красивое лучше, чем уродливое.
TЕ
4
Программа выводит английскую букву «T», затем русскую букву «E»
Подсказка
Да что-то непонятное тут требуют...

Ну! Воспользуйтесь идеей и решением предыдущей задачи!

IDE

P: Анаграммы

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

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

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

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

eleven_plus_two
twelve_plus_one
YES
Eleven_plus_two
Twelve_plus_one
NO
IDE

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

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

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

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

longest_word('In a hole in the ground there lived a hobbit.')
In a hole in the ground there lived a hobbit.
ground
Код вызова функции для тестирования
src = input()
res = longest_word(src)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif res not in src:
    print("Функция вернула слово, которое не содержится в исходной строке")
else:
    print(res)
IDE

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

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

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

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

North 5
East 3
South 1
Treasure!
3 4
IDE

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)
IN A HOLE IN THE GROUND THERE LIVED A HOBBIT
3
LQ D KROH LQ WKH JURXQG WKHUH OLYHG D KREELW.
Код вызова функции для тестирования
src = input()
k = int(input())
res = caesar_cipher(src, k)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)
IDE

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')
IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.
ABCDIFGHEJKLMNUPQRSTOVWXYZ
EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.
Код вызова функции для тестирования
src = input()
key = input()
res = substitution_cipher(src, key)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)
IDE

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

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

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

substitution_decipher('EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.', 'ABCDIFGHEJKLMNUPQRSTOVWXYZ')
EN A HULI EN THI GRUOND THIRI LEVID A HUBBET.
ABCDIFGHEJKLMNUPQRSTOVWXYZ
'IN A HOLE IN THE GROUND THERE LIVED A HOBBIT.'
Код вызова функции для тестирования
src = input()
key = input()
res = substitution_decipher(src, key)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
elif len(src) != len(res):
    print("Длина строки, которую вернула функция, не равна длине исходной строки")
else:
    print(res)
IDE

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

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

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

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

evaluate('21+7-10')
21+7-10
18
Код вызова функции для тестирования
res = evaluate(input())
if type(res) != int:
    print("Функция должна возвращать значение типа int")
else:
    print(res)
IDE

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
IDE

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
IDE

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

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

1
11
21
1211
111221
312211
13112221
1113213211
...

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

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

4
1211
IDE

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')
IN A HOLE IN THE GROUND THERE LIVED A HOBBIT
312
' INHA EOLN IH TGE URO NDETH REVLI EDHA BOB.IT'
Код вызова функции для тестирования
src = input()
key = input()
res = transposition_cipher(src, key)
if type(res) != str:
    print("Функция должна возвращать значение типа str")
else:
    print(res)
IDE

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

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

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

10-2*3
4
IDE

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

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

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

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

(1+(10+100))*(3-5)-0
-222
IDE

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

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

(1-(-10-100))*(-3-(-5))-(+0)
222
IDE