Давайте воспользуемся срезами в практической задаче. Примерно 400 лет назад Фрэнсис Бэкон придумал, как можно в книгах писать закодированные сообщения, причем так, что никто даже и не поймет, что это сообщение в книге вообще существует. Для этого он придумал, что можно все буквы, которые стоят в алфавите на нечетных местах заменить на буквы А. Все буквы, стоящие на четных местах заменить на букву B. После этого закодировать каждую букву английского алфавита пятью идущими подряд символами из букв A и B, по специально созданной таблице. Давайте попробуем расшифровать доставшуюся нам строчку закодированную шифром Бэкона. Для этого возьмем английский алфавит, мы будем использовать его современную версию, и создадим для себя два среза. В первом срезе мы возьмем все нечетные буквы — буквы стоящие на нечетных местах, то есть на первом, третьем и далее каждую вторую. Во-вторых, во втором срезе мы возьмем все буквы, которые должны будут заменяться на букву B, то есть те, что стоят на четных местах — это буква b, буква d, буква f и так далее, каждая вторая. Так как компьютер все нумерует с нуля, то нечетные буквы начинаются с нулевого индекса, а четные буквы неожиданно начинаются с индекса "1" — это некая особенность того, как мыслят компьютеры. Также нам бы хотелось, чтобы все буквы были в одинаковом регистре, чтобы компьютерам было их проще сравнивать друг с другом, поэтому допишем к нашим срезам строковый метод "upper()", который превратит результат среза в большие буквы. Посмотрим, какие буквы мы будем на что заменять. В буквы на нечетных местах я прошу компьютер подставить букву из строки "A", а в буквы на четных местах я прошу компьютер подставить буквы, хранящиеся в переменной "B". Посмотрим, что получится. Теперь у нас есть две строчки, с которыми мы можем сравнивать наши буквы. Напишем следующую часть нашего дешифровщика. Посмотрим на строчку, с которой нам выпало работать. Можно обратить внимание, что здесь есть буква английского алфавита написанная в верхнем регистре, мы уже умеем с ними работать. У нас уже есть две строчки, с которыми сравнивать. Также здесь есть пробел, который кажется незашифрованным. И есть одинарные кавычки, которые тоже не зашифрованы. Напишем расшифровщик. Для этого создадим промежуточную строчку. Она будет состоять только из букв "A B", пробелы и кавычки. Назовем ее "ab_string". Спросим у человека зашифрованную строку: "Какой шифр надо разгадать?". После этого будем перебирать символы зашифрованной строки. Если символы входят в список букв, которые надо заменить на букву A — будем нашу промежуточную строчку наращивать буквой A, добавлять ее в конец. Если символы входят в строчку символов, которые надо заменить на букву B будем добавлять в конец нашей промежуточной строки букву B. Если символы относятся к кавычке или к пробелу, будем копировать их и добавлять в конец нашей промежуточной строки как есть. С помощью конструкции "for" просмотрим нашу зашифрованную строчку. Если очередной попавшийся нам символ входит в строчку из кавычки или пробела, то мы добавляем этот символ к промежуточной строке как есть. Если наш символ входит в строчку символов, которые надо заменить на букву A, то мы добавляем букву 'A'. Если наш чудесный символ входит в строчку букв, которые надо заменить на символ B, мы добавляем к промежуточной строке символ 'B'. В конце мы можем посмотреть какая строка получилась, вывести ее на экран, попросив компьютер подставить значения переменной "ab_string" в наш ввод. Посмотрим что будет. Мы получили промежуточную строчку, которая состоит из букв "A B", нашей чудесной кавычки, пробела. Мы можем уже попробовать расшифровать вручную, просто посмотрев на таблицу расшифровки, как это делали бы люди 400 лет назад. Давайте напишем последний кусок программы-расшифровщика, которая будет брать последовательности из пяти идущих подряд букв, смотреть на таблицу расшифровки и подставлять в расшифрованный текст, наращивать расшифрованную строку теми буквами, которым соответствуют эти последовательности из пяти букв. Для этого создадим переменную с расшифрованным текстом. Я тут выписал последовательности букв и тех букв английского алфавита, на которые их нужно заменить. Для простоты, чтобы все было под рукой. Создадим переменную "decrypted", которая пока будет пустой и которую мы будем наращивать по ходу расшифровки. В дальнейшем мы будем просматривать нашу промежуточную переменную "ab_string", и мы будем ее просматривать до тех пор, пока она не закончится. Мы будем удалять из нее символы, которые мы уже расшифровали, потому что они нам больше не нужны. Для начала напишем кусок, который позволит нам расшифровать, просто перенести по сути в итоговую строчку наш пробел и нашу одинарную кавычку. Если первый символ нашей промежуточной строки является одинарной кавычкой или пробелом, то есть входит в строчку, состоящую из одинарной кавычки или пробела, то мы можем просто в нашу расшифрованную строчку добавить этот символ как есть. После чего мы можем попросить компьютер удалить этот символ из нашей строки промежуточной, взяв срез строки "ab_string", промежуточной строки, начиная со второго символа и до конца. В этом срезе будет отсутствовать наш самый первый символ, который мы только что обработали, и который мы только что перенесли в расшифрованную строчку. Таким образом, мы попросим компьютер забыть про этот символ и сможем пойти дальше в нашей расшифровке. Если же первый символ нашей строки относится к буквам A или B, то мы можем попросить компьютер показать нам тот пятибуквенный код, с которым мы сейчас работаем, сделав срез из пяти элементов, начиная с начала строки, остановившись перед элементом с индексом пять. Если этот код совпадает с каким-то из кодов в таблице расшифровки, будем наращивать нашу строчку с расшифровкой соответствующей буквой. Несколько монотонная работа по объяснению компьютеру какие конкретно пять идущих подряд символов на какую букву надо заменить. Осталось всего два кода. Теперь один. После того, как мы обработали наши пятибуквенные сочетания, вот мы написали расшифровку для всех пятибуквенных кодов, которые есть в нашей промежуточной строке. Мы должны попросить компьютер удалить наш код из промежуточной строки. Сделаем это точно так же, как и в прошлый раз. Мы попросим компьютер заменить строчку "ab_string" срезом строки, которые начинаются с элемента с индексом пять, элементы с индексом: 0, 1, 2, 3, 4 мы только что обработали, рассмотрели, они нам больше не нужны и заканчивается в конце строки. В этой новой строке, в этом срезе первых пяти букв не будет, и таким образом мы их удалим из нашей промежуточной строки. В конце работы программы-дешифровщика можно попросить рассказать, что же было зашифровано, подставив значения переменной "decrypted" в функцию вывода. Была зашифрована фраза: "я — счастлив". А теперь повторим эту неделю.