К содержанию

Анатолий
Анатольевич
Eфремов

Символы

Символы. Таблица ASCII



Рассмотрим вопрос сравнения строк в компьютере. Например, строка 'hello' меньше строки 'world', потому что буква h идёт в алфавите раньше, чем буква w.

Строки сравниваются в алфавитном (лексикографическом) порядке. Сначала сравниваются первые буквы, если они равны, то сравниваются вторые буквы и так далее.

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

Выпишем для примера несколько коротких строк в порядке их возрастания: a, aa, ab, ac, b, bb, bc.

Но что делать, если нужно сравнить строчную букву a и прописную букву A? Также может понадобиться сравнивать буквы с цифрами или другими символами. Все символы можно сравнивать между собой, потому что каждому символу приписан код (некоторый номер), и сравнение символов производится по этому коду. Код буквы a меньше, чем код буквы b, причём коды букв a, b, c, d, … идут подряд по возрастанию.

Чтобы понять, как сравниваются между собой буквы различного регистра, а также другие символы, посмотрим на таблицу ASCII (American standard code for information interchange).

           
32  (space)48  064  @80  P96  `112  p
33  !49  165  A81  Q97  a113  q
34  "50  266  B82  R98  b114  r
35  #51  367  C83  S99  c115  s
36  $52  468  D84  T100  d116  t
37  %53  569  E85  U101  e117  u
38  &54  670  F86  V102  f118  v
39  '55  771  G87  W103  g119  w
40  (56  872  H88  X104  h120  x
41  )57  973  I89  Y105  i121  y
42  *58  :74  J90  Z106  j122  z
43  +59  ;75  K91  [107  k123  {
44  ,60  <76  L92  \108  l124  |
45  -61  =77  M93  ]109  m125  }
46  .62  >78  N94  ^110  n126  ~
47  /63  ?79  O95  _111  o127  (del)

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

Символы с кодами от 0 до 31 являются специальными символами, и большинство из них в наше время не используются, поэтому эту часть таблицы мы не стали иллюстрировать.

Символ с кодом 32 — это пробел. После него идут знаки препинания и знаки арифметических операций.

Символы с кодами 48 — 59 — это цифры от 0 до 9.

Прописные буквы латинского алфавита пронумерованы подряд кодами 65 — 90.

Строчные буквы латинского алфавита пронумерованы подряд кодами 97 — 122.

Для того чтобы можно было использовать символы других алфавитов, используется стандарт Unicode. В него включено более 100000 различных символов, среди которых можно встретить все распространённые национальные алфавиты мира. Этот стандарт позволяет сравнивать между собой не только буквы латинского (английского) алфавита, но и буквы различных алфавитов.


Для того чтобы узнать код символа, можно использовать функцию ord(). Например, строка кода

print(ord('A'))

напечатает число 65 — код символа A.


Функция ord() в качестве аргумента принимает строку, состоящую ровно из одного символа. Если передать ей пустую строку или строку длины больше 1, то получим ошибку исполнения.


Функция, которая по числу возвращает символ с данным кодом называется chr(). Например, код

print(chr(65))

напечатает символ A, код которого равен 65.


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

c = input()
print(chr(ord(c) + 1))



Задача 1

ASCII-код символа

Считайте со стандартного ввода символ и выведите его код.

Входные данные

Программа получает на вход один символ с кодом от 33 до 126.

Выходные данные

Нужно вывести одно число — код считанного символа

Примеры

Ввод Вывод
A 65

ОТВЕТ:
c = input()
print(ord(c))



Задача 2

Символ с данным ASCII-кодом

Считайте со стандартного ввода целое число и выведите ASCII-символ с таким кодом. Решите эту задачу с использованием только одной переменной типа int.

Входные данные

Программа получает на вход число от 33 до 126.

Выходные данные

Нужно вывести символ, который имеет введённый код.

Примеры

Ввод Вывод
65 A

ОТВЕТ:
print(chr(int(input())))



Задача *

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

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

Входные данные

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

Выходные данные

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

Примеры

Ввод Вывод
A
D
ABCD

Ввод Вывод
0
9
0123456789

Видеоразбор

ОТВЕТ:
s1 = input()
s2 = input()
for i in range(ord(s1), ord(s2) + 1):
     print(chr(i), end='')



Работа с символами



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

Рассмотрим строку s. Пусть мы должны проверить её i-й символ, то есть s[i]. Поместим его в переменную с. Чтобы проверить, является ли символ цифрой, нужно проверить, что его код находится между кодами цифр 0 и 9:

if ord('0') <= ord(c) <= ord('9'):
     print('Цифра')


Можно сравнивать не коды символов, а сами символы. Тогда получим следующий код:

if '0' <= c <= '9':
     print('Цифра')


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

if 'A' <= c <= 'Z':

И проверка, является ли символ строчной буквой латинского алфавита выглядит так:

if 'a' <= c <= 'z':


В языке Python есть встроенные методы для подобных проверок:

if c.isdigit():    # проверка, является ли символ цифрой

if c.isupper():    # проверка, является ли символ прописной буквой

if c.islower():    # проверка, является ли символ строчной буквой

if c.isalpha():    # проверка, является ли символ буквой (строчной или прописной)

Эти методы работают не только со строками длины 1, но и со строками произвольной длины. Метод будет возвращать True, если все символы строки удовлетворяют условию, которое этот метод проверяет. Эти методы работают не только с латинским алфавитом, но и со всеми другими алфавитами, которые включены в стандарт Unicode.


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

c = input()
c = chr(ord(c) + 32)
print(c)

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


В языке Python есть стандартные методы upper и lower для решения задачи о переводе символа в другой регистр. Например, код, написанный выше, можно реализовать следующим образом:

c = input()
c = c.upper()
print(c)

Методы upper и lower работают со строками любой длины и со всеми алфавитами.



Задача 3

Сменить регистр символа

Напишите функцию CaseChange(c), меняющую регистр символа, то есть переводящую заглавные буквы в строчные, а строчные — в заглавные, остальные символы меняться не должны. В решении нельзя использовать циклы. В решении нельзя использовать численные константы с неочевидным значением.

Примеры

Ввод Вывод
n N

Ввод Вывод
4 4

Ввод Вывод
O o

ОТВЕТ:
def CaseChange(c):
     if c.isupper():
          return c.lower()
     if c.islower():
          return c.upper()
     return c
a = input()
ans = CaseChange(a)
print(ans)



Задача 4

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

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

Решение оформите в виде функции Capitalize(S), возвращающей новую строку.

Примеры

Ввод Вывод
-a-bb-ccc -A-Bb-Ccc

Ввод Вывод
In a hole in the ground there lived a hobbit. In A Hole In The Ground There Lived A Hobbit.

Ввод Вывод
Everyone OF uS HAS all wE NEED Everyone Of Us Has All We Need

ОТВЕТ:
def Capitalize(S):
     ans = ''
     for i in range(0, len(S)):
          if S[i].isupper() and S[i - 1].isalpha() == True and i != 0:
               ans += S[i].lower()
          elif S[i].islower() and S[i - 1].isalpha() == False or i == 0:
               ans += S[i].upper()
          else:
               ans += S[i]
     return ans
S = input()
print(Capitalize(S))



Задача 5

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

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

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

Входные данные

Дана непустая строка.

Выходные данные

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

Примеры

Ввод Вывод
- We all live in the Yellow Submarine! EL
5

ОТВЕТ:
s = input()
s = s.upper()
q = [chr(i) for i in range(65, 91)]
res = 0
letters = ''
for i in range(len(q)):
     if s.count(q[i]) > res:
          res = s.count(q[i])
          letters = q[i]
     if s.count(q[i]) == res and letters != q[i]:
          letters += q[i]
print(letters)
print(res)



Задача 6

Палиндром

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

Решение необходимо сдать в виде функции IsPalindrome(S), возвращающей значение типа bool. При решении этой задачи нельзя пользоваться вспомогательными массивами или строками.

Примеры

Ввод Вывод
Radar YES

Ввод Вывод
YES NO

ОТВЕТ:
def IsPalindrome(S):
     if S.lower() == S.lower()[::-1]:
          return True
S = input()
if IsPalindrome(S):
     print('YES')
else:
     print('NO')



Задача 7

Шифр Цезаря

В шифре Цезаря каждый символ, являющийся буквой латинского алфавита, заменяется на другой символ, k-тый по счёту в алфавите после данного. Если этот символ выходит за границы, то берётся соответствующий из начала строки. Например, для k=3 символ A заменяется на D, символ B — на E, символ C — на F, ... , символ Z — на C. Аналогично, строчные буквы заменяются на строчные буквы. Все остальные символы не меняются.

Дана строка, зашифруйте её при помощи шифра Цезаря. Решение оформите в виде функции CaesarCipher(s, k), возвращающей новую строку. s — исходная строка, k — величина сдвига. Функцию нужно вызывать со значением k = 3.

Указание

Напишите функцию CaesarCipherChar(c, k), шифрующую один символ.

Примеры

Ввод Вывод
In a hole in the ground there lived a hobbit. Lq d kroh lq wkh jurxqg wkhuh olyhg d kreelw.

ОТВЕТ:
def CaesarCipherChar(c, k):
     a = "abcdefghijklmnopqrstuvwxyz"
     a2 = a.upper()
     if c.isupper():
          return (a2[(a2.index(c) + k) % len(a2)])
     elif c.islower():
          return (a[(a.index(c) + k) % len(a)])
     else:
          return c
def CaesarCipher(s, k):
     res = ''
     for c in s:
          res += CaesarCipherChar(c, k)
     return (res)
S = input()
print(CaesarCipher(S, 3))



Задача *

Ход короля и шахматная нотация

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

Входные данные

Входной файл состоит из двух строк — координат первой и второй клетки в шахматной нотации.

Как известно, в шахматной нотации горизонтальные строки обозначаются цифрами от 1 до 8, считая от расположения белых фигур, стоящих внизу доски, а вертикальные столбцы — буквами латинского алфавита: a, b, c, d, e, f, g, h.

Выходные данные

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

Примеры

Ввод Вывод
a1
a2
YES

Ввод Вывод
a1
c2
NO

Видеоразбор

ОТВЕТ:
s = input()
f = input()
x1 = ord(s[0]) - ord('a') + 1
y1 = int(s[1])
x2 = ord(f[0]) - ord('a') + 1
y2 = int(f[1])
if abs(x2 - x1) <= 1 and abs(y2 - y1) <= 1:
     print("YES")
else:
     print("NO")