'''Тема урока: представление строк в памяти компьютера, ASCII и Unicode
Представление строк в памяти компьютера
Таблица символов ASCII
Таблица символов Unicode
Функция ord()
Функция chr()
Аннотация. Представление строк в памяти компьютера.

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

За прошедшие годы для представления символов в памяти компьютера были разработаны различные схемы кодирования.
Исторически самой важной из этих схем кодирования является схема кодирования ASCII (American Standard Code for
Information Interchange – американский стандартный код обмена информацией).

Таблица символов ASCII
ASCII представляет собой набор из 128 цифровых кодов, которые обозначают английские буквы, различные знаки
препинания и другие символы. Например, код ASCII для прописной английской буквы «А» (латинской) равняется 65. Когда
на компьютерной клавиатуре вы набираете букву «А» в верхнем регистре, в памяти сохраняется число 65
(как двоичное число, разумеется).
Код ASCII для английской «В» в верхнем регистре равняется 66, для «С» в верхнем регистре – 67 и т. д. На один символ
в ASCII отводится ровно 7 бит.
    Аббревиатура ASCll произносится «аски».
    Набор символов ASCII был разработан в начале 1960-х годов и в конечном счете принят почти всеми производителями
    компьютеров. Однако схема кодирования ASCII имеет ограничения, потому что она определяет коды только для 128
    символов. Для того чтобы это исправить, в начале 1990-х годов был разработан набор символов Юникода (Unicode).
     Это широкая схема кодирования, совместимая с ASCII, которая может также представлять символы многих языков мира.
      Сегодня Юникод быстро становится стандартным набором символов, используемым в компьютерной индустрии.

Таблица символов Unicode
Таблица символов Юникод представляет собой набор цифровых символов, которые включают в себя знаки почти всех
письменных языков мира. Стандарт предложен в 1991 году некоммерческой организацией «Консорциум Юникода».
Применение этого стандарта позволяет закодировать очень большое число символов из разных систем письменности:
в документах, закодированных по стандарту Юникод, могут соседствовать китайские иероглифы, математические
символы, буквы греческого алфавита, латиницы и кириллицы, символы музыкальной нотной нотации.

Стандарт состоит из двух основных частей: универсального набора символов и семейства кодировок (Unicode
transformation format, UTF). Универсальный набор символов перечисляет допустимые по стандарту Юникод символы
 и присваивает каждому символу код в виде неотрицательного целого числа. Семейство кодировок определяет
 способы преобразования кодов символов для хранения на компьютере и передачи.

В Юникод все время добавляются новые символы, а сам размер этой таблицы не ограничен и будет только расти,
поэтому сейчас при хранении в памяти одного юникод-символа может потребоваться от 1 до 8 байт. Отсутствие
ограничений привело к тому, что стали появляться символы на все случаи жизни.
    В Python строки хранятся в виде последовательности юникод символов.

Примечания
Примечание 1. Официальный сайт таблицы символов Unicode.

Примечание 2. Юникод — это не кодировка. Это именно таблица символов. То, как символы с соответствующими
кодами будут храниться в памяти компьютера, зависит от конкретной кодировки, базирующейся на Юникоде,
 например UTF-8. Про отличие таблицы символов Unicode от кодировки UTF-8 можно почитать тут.

Примечание 3. Первые 128 кодов таблицы символов Unicode совпадают с ASCII.
'''

'''Функция ord
Функция ord позволяет определить код некоторого символа в таблице символов Unicode. Аргументом данной функции является 
одиночный символ.

Результатом выполнения следующего кода:

num1 = ord('A')
num2 = ord('B')
num3 = ord('a') 
print(num1, num2, num3)
будет:

65 66 97
Обратите внимание, что функция ord принимает именно одиночный символ. Если попытаться передать строку, содержащую 
более одного символа:

num = ord('Abc')
print(num)
мы получим ошибку времени выполнения:

TypeError: ord() expected a character, but string of length 3 found
    Название функции ord происходит от английского слова order — порядок.'''

'''Функция chr
Функция chr позволяет определить по коду символа сам символ. Аргументом данной функции является численный код.

Результатом выполнения следующего кода:

chr1 = chr(65)
chr2 = chr(75)
chr3 = chr(110) 
print(chr1, chr2, chr3)
будет:

A K n
     Название функции chr происходит от английского слова char — символ.

Функции ord и chr часто работают в паре. Мы можем использовать следующий код для вывода всех заглавных букв 
английского алфавита:'''
#
# for i in range(26):
#     print(chr(ord('A') + i))
'''Вызов функции ord('A') возвращает код символа «A», который равен 65. Далее на каждой итерации цикла, к данному коду 
прибавляется значение переменной i = 0, 1, 2, ..., 25, а затем полученный код преобразуется в символ с помощью 
вызова функции chr.

Примечания
Примечание. Функции ord и chr являются взаимнообратными. Для них выполнены равенства:

chr(ord('A')) = 'A', ord(chr(65)) = 65.'''
# print(ord('foo'))
# a = int(input())
# b = int(input())
# for i in range(a, b+1):
#     print(chr(i), end=' ')
'''Простой шифр
На вход программе подается строка текста. Напишите программу, которая переводит каждый ее символ в соответствующий 
ему код из таблицы символов Unicode.
Формат входных данных 
На вход программе подается строка текста.
Формат выходных данных
Программа должна вывести кодовые значения символов строки разделенных одним символом пробела.
Sample Input:

Hello world!
Sample Output:

72 101 108 108 111 32 119 111 114 108 100 33'''
# b = input()
# for i in b:
#     print(ord(i), end=' ')
'''Шифр Цезаря 🌶️
Легион Цезаря, созданный в 23 веке на основе Римской Империи не изменяет древним традициям и использует шифр
 Цезаря. Это их и подвело, ведь данный шифр очень простой. Однако в постапокалипсисе люди плохо знают все 
 тонкости довоенного мира, поэтому ученые из НКР не могут понять как именно нужно декодировать данные сообщения.
  Напишите программу для декодирования этого шифра.
Формат входных данных
В первой строке дается число n (1≤ n≤ 25) – сдвиг, во второй строке даётся закодированное 
сообщение в виде строки со строчными латинскими буквами.
Формат выходных данных
Программа должна вывести одну строку – декодированное сообщение. Обратите внимание, что нужно декодировать 
сообщение, а не закодировать.
Sample Input 1:
1
bwfusvfupdbftbs
Sample Output 1:
avetruetocaesar'''

# a = int(input())
# b = input()
# for i in b:
#     n = ord(i) - a
#     if n < 97:
#         n = 122 - (96 - n)
#     print(chr(n), end='')

# s = 'Python rocks!'
# count = 0
# for i in s:
#     count += 1
# print(count)

# s = 'Python rocks!'
# print(s[1:5])

# s = '    Python rocks!     '
# print(s.strip())

# s = 'Python rocks!'
# print(s.upper())

# s = 'Python rocks!'
# print(s.replace('o', '@'))

# s = input()
# t = ''
# for i in range(len(s)):
#     if i % 3 != 0:
#         t += s[i]
# print(t)
# s = input()
# print(s.replace('1', 'one'))

# s = input()
# print(s.replace('@', ''))
# s = input()
# if s.count('f') == 1:
#     print(-1)
# elif s.count('f') < 1:
#     print(-2)
# else:
#     print(s.find('f', s.find('f') + 1))

# s = input()
# a = s[:s.find('h')]
# b = s[s.find('h'):s.rfind('h') + 1]
# c = s[s.rfind('h') + 1:]
# s = a + b[::-1] + c
# print(s)