Шифр чата в игре: сдвиг букв
Условие
В командном чате игры кто-то включил «шифр»: каждая буква заменяется на следующую по алфавиту, а после z снова идёт a. Если сдвиг сделать на k шагов, то это применяют k раз подряд.
Тебе нужно восстановить, что получится после такого сдвига.
Алфавит — только строчные латинские буквы a..z.
Формат ввода
Первая строка: целое число k — величина сдвига. Вторая строка: строка s из строчных латинских букв.
Формат вывода
Выведи строку, которая получится после сдвига каждой буквы строки s на k по циклу a..z.
Ограничения
1 ≤ len(s) ≤ 20000 ≤ k ≤ 1 000 000sсостоит только из символовa..z
Пример
Ввод:
2
abz
Вывод:
cdbКак решать — идея подхода
Приём: Сдвиг по модулю 26 (ASCII-коды)
Ключевое наблюдение: алфавит циклический и содержит ровно 26 букв. Значит, сдвиг на 26, 52, 78… ничего не меняет, поэтому достаточно заменить k на k % 26.
Приём: работа с кодами символов (ord/chr) и арифметика по модулю 26. Это удобно, потому что буквы a..z идут подряд в таблице кодов, и можно считать позицию буквы как число.
План решения:
- Прочитай
kи строкуs. - Сведи сдвиг:
k = k % 26. - Для каждой буквы
ch: - посчитай её номер:
pos = ord(ch) - ord('a')(получится 0..25); - сдвинь по кругу:
new_pos = (pos + k) % 26; - преврати обратно в букву:
chr(ord('a') + new_pos). - Собери все новые буквы в строку и выведи.
Мини-сниппет формулы (сердце решения): new = chr(ord('a') + (ord(ch) - ord('a') + k) % 26)
Сложность: O(n) по времени, где n = len(s), и O(n) по памяти на результат.
Частая ошибка: забыть сделать k % 26. Тогда при огромном k формула всё равно работает, но часто пишут сдвиг через многократное применение (k раз), что будет слишком медленно.
Разберись руками
В чате строка "abz" зашифрована: каждую букву двигают на 2 позиции вперёд по кругу a..z. После z снова идёт a. Нужно руками понять, что получится.
- Алфавит замыкается: после 26 сдвигов буква вернётся на место. Для примера посчитай, сколько «реальных» сдвигов нужно сделать при k=2 (то есть 2 по кругу из 26). Введи число.
- Посмотри на строку "abz". Отметь позиции (индексы с 0) тех букв, которые при сдвиге на 1 должны перейти через конец алфавита (то есть z превращается в a).
- Теперь прогони процесс: стартовая строка "abz". Сделай 2 раза «сдвиг на 1». Какой станет строка после 1-го сдвига? А после 2-го?
Идея: Сначала учти, что алфавит зациклен: много сдвигов можно сократить, потому что после полного круга всё повторяется. Потом для каждой буквы строки сдвинь её нужное число шагов вперёд, а если дошёл до 'z', продолжай снова с 'a'.
Решить задачу с автопроверкой на Python →
Куда дальше
- С нуля до олимпиады: маршрут — сколько занимает язык, какие приёмы нужны и к какому этапу это ведёт
- Перечневые олимпиады по информатике — олимпиады перечня Минобрнауки, их уровни и что нужно к диплому
- БВИ по олимпиадам: в какие вузы берут — правила приёма вузов, разобранные построчно, со ссылкой на приказ у каждой строки