Два приведенных выше ответа наполовину отвечают на ваш вопрос здесь, но они на самом деле не видят вашей проблемы, которая заключается в том, что для ответа на вызов Free Code Camp вам нужно уйти и понять математику, стоящую за шифром Цезаря, и арифметика ROT13. У меня тоже были проблемы с этим.
Давайте посмотрим на это вместе и пройдемся по ним шаг за шагом. (Я понимаю, что не все изучали это в средней школе - я не!):
// I DON'T CLEARLY UNDERSTAND THIS CODE BELOW
rotCharArray.push((str[x].charCodeAt() - 65 + 13) % 26 + 65);
} else {
rotCharArray.push(str[x].charCodeAt());
}
Ответы @bastos.sergio и @caulitomaz помогают, но они лишь частично объясняют и не указывают на дальнейшие исследования:
@bastos.sergio's
«Получите модуль 26 (это гарантирует, что кодирование не будет шифроваться ни во что выше буквы «Z», например, буква «Z» будет преобразована в (90-65+13)% 26 + 65) = 77 'M ' Письмо. По сути, это заставит алгоритм шифрования вернуться к началу.
@caulitomaz's
В английском алфавите 26 символов. Вот почему вы применяете вращение шифра 13, а затем применяете операцию по модулю.
Здесь они оба имеют в виду «модульную арифметику»:
Модульная арифметика показывает, что некоторые числа "конгруэнтны", то есть они имеют один и тот же остаток, когда к ним применяется операция по модулю.
Например, 2 % 12, 14 % 12, 26 % 12 = остаток 2. Таким образом, когда у вас есть числа, которые должны появляться в диапазоне, или устройство, которое показывает только числа в диапазоне, вы можете определить, где это число «зацикливается».
Обратите внимание, что в моем примере используется % 12 — это общее количество часов, которое могут показывать 12-часовые часы. Поэтому, если сейчас 2 часа ночи, и я хочу узнать время через 12 часов, я добавляю 12. Но мои часы не могут показывать 14:00 (не в 12-часовом режиме). Модуль 12 дает мне реальное время.
Пример. Сейчас 4 часа утра. Мой самолет задержали на 29 часов (ужасная авиакомпания). Как определить новое время взлета? 4 + 29 % 12 = 9 утра. (Если задержка была меньше 24, мне нужно поменять местами am/pm, но вы должны получить изображение.)
ROT13
Здесь у нас есть особый случай ротационного шифра с ROT 13, где двойное применение шифра даст вам исходный символ для кодирования, потому что в алфавите всего 26 символов, а 13 — это ровно половина от 26.
х = ROT13 (ROT13 (х))
Так что на самом деле нам не нужно беспокоиться о добавлении 13 или вычитании 13 при применении или реверсировании шифрования, мы просто применяем его снова, чтобы получить оригинал.
Итак, как работает алгоритм:
Как уже указывалось, наши коды символов для прописных букв A-Z находятся в диапазоне от 65 (A) до 90 (Z). Но мы хотим работать с модульной арифметикой, чтобы найти, в какой диапазон 0-26 попадает новая буква. Поэтому вычтите 65 из кода символа целевой буквы: str[x].charCodeAt() - 65
Примените шифр: добавьте 13
(str[x].charCodeAt() - 65 + 13)
Примените модуль, чтобы найти букву, которая «зациклилась». Что для нас составляет %26 (количество символов в алфавите):
(str[x].charCodeAt() - 65 + 13) % 26
Добавьте обратно 65, чтобы у нас был код символа в диапазоне 65...90.
(str[x].charCodeAt() - 65 + 13) % 26 + 65)
Примеры работы:
ROT13(X)
'X'.charCodeAt(0) = 88
- 65 = 23
+ 13 = 36
%26 = 10
+65 = 75
charCodeFrom(75) = K
ROT13(К)
'K'.charCodateAt(0) = 75
- 65 = 10
+ 13 = 23
%26 = 23
+65 = 88
charCodeFrom(88) = X
Источник(и):
http://betterexplained.com/articles/fun-with-modular-arithmetic/ https://www.khanacademy.org/computing/computer-science/cryptography/modarithmetic/a/what-is-modular-arithmetic
person
ortonomy
schedule
01.05.2016