Описание
Сдвиг Цезаря - это очень простой моноалфавитный шифр, в котором каждая буква заменяется буквой после алфавита. Пример:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
это выход для реальной задачи, это был пример сдвига на 1.)
Как видите, интервалы и знаки препинания остаются ненастроенными. Однако, чтобы предотвратить угадывание сообщения, все буквы пишутся с большой буквы. Перемещая буквы назад, сообщение было расшифровано, удобно, но также очень легко расшифровывалось другими людьми, которые, как предполагается, не знают, что означает сообщение.
Итак, мы немного поможем Цезарю, используя усовершенствованную форму его шифра: Само-сдвигающийся Цезарь-Сдвиг !
Вызов
Ваша задача - написать программу или функцию, которая при наличии строки для шифрования выводит зашифрованную строку, соответствующую вводу. Продвинутый Цезарь Сдвиг работает так:
1. Compute letter differences of all adjacent letters:
1.1. Letter difference is computed like this:
Position of 2nd letter in the alphabet
-Position of 1st letter in the alphabet
=======================================
Letter difference
1.2. Example input: Hello
H - e|e - l|l - l|l - o
7 - 5|5 - 12|12 - 12|12 - 15 Letter differences: 3; -7; 0; -3
=3| =-7| =0| =-3
2. Assign the letters continously a letter difference from the list,
starting at the second letter and inverting the differences:
2.1. 2nd letter: first difference, 3rd letter: second difference, etc.
2.2. The first letter is assigned a 1.
2.3. Example input: Hello with differences 3; -7; 0; -3
Letter || Value
=======||======
H || 1
E || -3
L || 7
L || 0
O || 3
3. Shift the letters by the value x they have been assigned:
3.1. In case of a positive x, the letter is shifted x letters to the right.
3.2. In case of a negative x, the letter is shifted |x| letters to the left.
3.3. In case of x = 0, the letter is not shifted.
3.4. If the shift would surpass the limits of the alphabet, it gets wrapped around
Example: Y + Shift of 2 --> A
3.5. Example input: See the table under 2.3.
|| || Shifted
Letter || Value || Letter
=======||=======||=========
H || 1 || I
E || -3 || B Program output:
L || 7 || S IBSLR
L || 0 || L
O || 3 || R
В этом процессе пропускаются пробелы и другие специальные символы, такие как знаки препинания. Гарантируется, что вашей программе будет задана строка, содержащая только печатные символы ASCII. Вывод вашей функции / программы должен быть только в верхнем регистре.
Это код-гольф , поэтому применяются стандартные лазейки, и пусть победит кратчайший ответ в байтах!
источник
E
-3
?ZEN
, например.Z
смещено на 1 это ...A
? (как примечание, ответ 05AB1E превращаетсяZ
вA
)RELIEF
иRELIES
оба для шифрования с тем же результатомSRSFAG
?Ответы:
05AB1E ,
282724 байтаПопробуйте онлайн!
объяснение
источник
IBSLR, EGUFV!
дляHello, World!
, это правильно? OP только испортил этот пример?Python 3 , 100 байт
Попробуйте онлайн!
b
отслеживает код последней буквы ASCII или изначально равен нулю; формулаc+c-(b or~-x)
означает, что буква с кодом ASCIIc
сдвигается наc-b
if, еслиb
она не равна нулю, иc-(c-1) == +1
ifb
на ноль (для самой первой буквы).b
никогда не станет равным нулю, так как строка гарантированно состоит из печати символов ASCII.Наконец,
64<c<91
проверяет,c
является ли ASCII буквой в верхнем регистре, и(…-65)%26+65
переносит все обратно вA-Z
диапазон.ovs спас байт. Благодарность!
источник
05AB1E ,
323029 байтПопробуйте онлайн!
источник
ES6 (Javascript), 138 байтов:
http://jsbin.com/manurenasa/edit?console
источник
MATL , 27 байт
Попробуйте онлайн!
Я думаю, что это самое короткое, что я могу получить, но есть много разных вариантов, поскольку существует многократное повторное использование «переменных» (есть 3
t
(дублирование) и 2w
(обмен) операции,H
используется буфер обмена и даже тогда есть еще дубликат1Y2
...). К сожалению, я не мог сохранить байты с помощью автоматическогоM
буфера обмена.Более половины программы посвящено тому, чтобы сделать ее заглавной и игнорировать не алфавитные символы - только шифр не более 13 байтов ( попробуйте онлайн! )
источник
Perl,
9089Хотя языки, не относящиеся к Codegolf, редко бывают конкурентоспособными, мы можем опуститься ниже 100;)
Я решил раскрутить это:
@a = split//,<>;
Принимает данные из STDIN, сохраняет список символов (с новой строкой!) В @a.say uc(++$a[0])
вывод первой заглавной буквы со смещением на 1. Оказывается, вы можете увеличивать букву в perl, если используете префикс ++. Это мутатор ofc.2*ord($a[$_+1])-ord($a[$_])+!$_
Нас просят взять символ в x и добавить разницу + (x- (x-1)). Ну, это 2x - (x-1). Однако: я изменил первую букву! Таким образом, я должен исправить эту ошибку, следовательно+!$_
, это исправит то, что вычел слишком много в позиции 0 (только случай! $ _ Не undef). Затем мыuc chr
получим заглавную букву из рассчитанного значения ASCII.map{ ... } $#a-2
-$#a
это позиция для доступа к последнему элементу массива. Так как я добавляю один, который я хочу$#a-1
, но так как перевод строки из ввода должен игнорироваться, это так$#a-2
.Это связано с первым письмом, и мы сделали :)
источник
Perl 5
-F
,737774 байтаПопробуйте онлайн!
источник
Hello, World!
должно привестиIBSLR, EGUFV!
, а неIBSLR, XGUFV!
.PHP,
10698 байтдовольно неприятно, что ... если бы не было так
base_convert
долго (илиctype_alpha
) ...но я получил его под 100. доволен.
Запустите как трубу с
-nR
или попробуйте онлайн .источник
JavaScript (Node.js) ,
86838781 байтПопробуйте онлайн!
источник