Descripción
Un César Shift es un cifrado monoalfabético muy simple en el que cada letra se reemplaza por la siguiente en el alfabeto. Ejemplo:
Hello world! -> IFMMP XPSME!
( IBSLR, EGUFV!
es la salida para el desafío real, este fue un ejemplo de desplazamiento por 1.)
Como puede ver, el espacio y la puntuación permanecen sin afinar. Sin embargo, para evitar adivinar el mensaje, todas las letras están en mayúscula. Al cambiar las letras hacia atrás, el mensaje fue descifrado, conveniente, pero también muy fácil de descifrar por otras personas que se supone que no saben lo que significa el mensaje.
Por lo tanto, estaremos ayudando a César un poco mediante el uso de una forma avanzada de su cifrado: ¡el Cambio de César con cambio propio !
Desafío
Su tarea es escribir un programa o función que, dada una cadena para cifrar, genere la cadena cifrada correspondiente a la entrada. El avanzado Caesar Shift funciona así:
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
Los espacios y otros símbolos especiales, como la puntuación, se omiten en este proceso. Se garantiza que su programa recibirá una cadena que solo contiene caracteres ASCII imprimibles. La salida de su función / programa solo debe estar en mayúscula.
Este es el código de golf , por lo que se aplican las lagunas estándar, ¡y que gane la respuesta más corta en bytes!
fuente
E
-3
?ZEN
, por ejemplo.Z
desplazado por 1 es ...A
? (como nota al margen, la respuesta 05AB1E se convierteZ
enA
)RELIEF
yRELIES
para cifrar el mismo resultadoSRSFAG
?Respuestas:
05AB1E ,
282724 bytesPruébalo en línea!
Explicación
fuente
IBSLR, EGUFV!
paraHello, World!
, ¿es correcto? ¿OP acaba de estropear ese ejemplo?Python 3 , 100 bytes
Pruébalo en línea!
b
realiza un seguimiento del código ASCII de la última letra, o es inicialmente cero; la fórmulac+c-(b or~-x)
significa que una letra con código ASCIIc
se desplaza porc-b
sib
no es cero yc-(c-1) == +1
sib
es cero (para la primera letra).b
nunca volverá a ser cero, ya que se garantiza que la cadena constará de caracteres ASCII imprimibles .Finalmente,
64<c<91
verifica sic
es una letra ASCII en mayúsculas y(…-65)%26+65
vuelve a colocar todo en elA-Z
rango.ovs guardaron un byte. ¡Gracias!
fuente
05AB1E ,
323029 bytesPruébalo en línea!
fuente
ES6 (Javascript), 138 bytes:
http://jsbin.com/manurenasa/edit?console
fuente
MATL , 27 bytes
Pruébalo en línea!
Creo que esto es lo más corto que puedo obtener, pero hay muchas variedades diferentes ya que hay muchas reutilizaciones de 'variables' (hay 3
t
(duplicación) y 2w
operaciones (intercambio),H
se usa el portapapeles y incluso entonces todavía hay un duplicado1Y2
...). Lamentablemente, no pude guardar bytes con elM
portapapeles automático .Más de la mitad del programa está dedicado a ponerlo en mayúsculas e ignorar los caracteres no alfabéticos: solo el cifrado no tiene más de 13 bytes (¡ Pruébelo en línea! )
fuente
Perl,
9089Aunque los lenguajes que no son codegolf rara vez son competitivos, podemos ir por debajo de 100;)
He decidido deshacer esto:
@a = split//,<>;
Toma información de STDIN, almacena la lista de caracteres (¡con nueva línea!) En @a.say uc(++$a[0])
la primera letra mayúscula de salida se desplazó por 1. Resulta que puede incrementar una letra en perl si usa un prefijo ++. Este es un mutador de c.2*ord($a[$_+1])-ord($a[$_])+!$_
Se nos pide que tomemos un carácter en x y agreguemos la diferencia + (x- (x-1)). Bueno, eso es 2x - (x-1). Sin embargo: ¡cambié la primera letra! Entonces tengo que corregir ese error, por lo tanto+!$_
lo , que corregirá por haber restado uno demasiado en la posición 0 (¡solo el caso! $ _ No es undef). Luego debemosuc chr
obtener una letra mayúscula del valor ASCII calculado.map{ ... } $#a-2
-$#a
es la posición para acceder al último elemento de la matriz. Como estoy agregando uno, quiero$#a-1
, pero debido a que la nueva línea de entrada necesita ignorarse, esto es$#a-2
.Esto se concatena con la primera letra, y hemos terminado :)
fuente
Perl 5
-F
,737774 bytesPruébalo en línea!
fuente
Hello, World!
debería resultarIBSLR, EGUFV!
, noIBSLR, XGUFV!
.PHP,
10698 bytesbastante desagradable ese ... si
base_convert
no fuera tan largo (octype_alpha
) ...pero lo obtuve por debajo de 100. satisfecho.
Ejecutar como tubería
-nR
o probarlo en línea .fuente
JavaScript (Node.js) ,
86838781 bytesPruébalo en línea!
fuente