Su tarea es tomar una cadena encriptada como entrada, y sacar la cadena desencriptada, para revelar su mensaje oculto.
Las cadenas, tanto de entrada como de salida, contendrán caracteres de esta lista de 64 caracteres ASCII (tenga en cuenta el espacio inicial):
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
Estos caracteres son números asignados, en el orden en que se enumeran arriba:
! " # $ % & ...
0 1 2 3 4 5 6 ...
Entonces, el espacio es el número 0, !
es el número 1 y ~
es el número 63. Estos números se pueden representar en código binario de 6 bits:
: 0: 000000
!: 1: 000001
": 2: 000010
#: 3: 000011
.. ... ......
z: 61: 111101
|: 62: 111110
~: 63: 111111
El cifrado es muy simple:
Lo usaré eC
para los caracteres encriptados y C
para los caracteres de la cadena original. C(n)
es el enésimo carácter de la cadena original, mientras que eC(n)
es el enésimo carácter de la cadena encriptada.
Usarás la representación binaria de 6 bits de los personajes. El primer personaje será eC(0) = not(C(0))
. A partir de ahí, todos los personajes serán eC(n) = xor(C(n),C(n-1))
.
Ejemplo:
Supongamos que la cadena de entrada es code
.
c
es el 38º carácter (indexado a cero), o100110
en binario. La versión encriptada tiene todos los bits invertidos, entonces011001 -> 25 -> '9'
(nuevamente, indexado a cero).o
es el personaje número 50, o110010
en binario.xor(100110, 110010) = 010100 = 20 = '4'
.d
es el 39º caracter, o100111
en binario.xor(100111, 110010) = 010101 = 21 = '5'
.e
es el personaje número 40, o101000
en binario.xor(101000, 100111) = 001111 = 15 = '/'
.
Entonces, si la cadena original es code
, la cadena cifrada se convertirá 945/
.
Casos de prueba:
945/
code
,&'8[14 =?;gp+% 2'@s&&c45/eg8?&
programming puzzles & code golf
;a$5$%0r?2@12dw6# lb-eg&519nt%ot=9$@es@96+?;ga" 4*)&ta56dp[?o#t%oh/"(&?#ee![,+,/+fe4"
a $150 reward will be given to those sending account and pin# to hackers@steal_id.com
~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!~!#!'!#!/!#!'!#![!#!'!#!/!#!'!#!
!"#$%&'()*+,-./0123456789:;=?@[\]^_abcdefghijklmnopqrstuvwxyz|~
fuente
Respuestas:
Jalea ,
2726 bytesPruébalo en línea!
Versión alternativa, 22 bytes (no competitiva)
Jelly finalmente se encontró con otros jugadores de golf y obtuvo un átomo ASCII imprimible , por lo que esto funciona ahora.
Pruébalo en línea!
Cómo funciona
fuente
JavaScript (ES6), 115 bytes
Casos de prueba
Mostrar fragmento de código
fuente
^
va a la derecha de la]
. La respuesta todavía funciona con ese cambio para los casos de prueba, creo.d
partir de lo que falta?Jalea ,
3431 bytes-3 bytes gracias a Dennis (use
ḟ
dos veces en lugar deœ-
,;
y¤
; use en”~
lugar de 63 )Un enlace monádico que toma y devuelve listas de personajes.
* Nota: los argumentos de entrada a un programa de jalea utilizan cadena de Python de formato, por lo que se cita con
"
,'
,'''
(o si no ambigua sin citar) son todas las opciones.Pruébalo en línea!
¿Cómo?
Bitwise-xor es invertible (dados los "ceros iniciales").
Bitwise-Not es un xor con "todos unos", en este caso solo se requieren 6 unos, por lo que 2 7 -1 = 63 .
Una vez que hemos creado la matriz o los caracteres y hemos buscado los índices de los caracteres de entrada, la decodificación en sí misma es simplemente una reducción acumulativa por bitwise-xor, después de lo cual podemos volver a indexar en la misma matriz.
* Nota: buscar un espacio en p arrojará un 64, pero está bien, ya que la indexación de nuevo en p es modular, por lo que agregar un líder
1
es como agregar 64, llevando el índice de vuelta a donde debe estar).fuente
Java, 225 bytes
No he jugado al golf en Java en mucho tiempo, por lo que agradezco cualquier consejo de golf.
¡Pruébelo en línea!
fuente
String D(String E){
convierte enE->{
(-15 bytes);-1-J
puede ser+~J
(-1 byte); yi=-1
puede seri=0
,++
se puede mover ai++<1?
, y luego sei-1
conviertei-2
(-1 byte) Pruébelo en línea: 208 bytes05AB1E , 40 bytes
Pruébalo en línea!
Explicación
fuente
Conjunto de instrucciones de CPU x86, 235 bytes
La función find () y deCript () + la cadena abc: 171 bytes + 64 bytes = 235 ensamblado con nasmw y compilador / biblioteca con el compilador Borland C:
resultados:
El ensamblaje es mejor (por ejemplo, el verdadero uso un sistema macro, sí, sé que es demasiado largo, pero como C one + - con el sistema macro, por decir el verdadero porque las instrucciones son más simples, es fácil escribir código en el ensamblaje incluso sin hacer correcciones mientras uno escribe en inglés (no yo))
fuente
C (gcc) , 153 bytes
Pruébalo en línea!
Ligeramente menos golf
fuente
APL (Dyalog Unicode) , SBCS de 52 bytes
Requiere
⎕IO←0
Pruébalo en línea!
fuente
¨
:{C[2⊥≠\⍉~@0⍉(6/2)⊤⍵⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']}
⍵
, puede guardar dos bytes mediante la conversión a un programa completo:C[2⊥≠\⍉~@0⍉(6/2)⊤⍞⍳⍨C←(32↓⎕UCS⍳127)~⎕A,'<>{}`']
Roda ,
120100 bytesPruébalo en línea!
Usé el
l=63
truco de la respuesta de JavaScript.Ahora mismo estoy trabajando en acortarA
para jugar golf en progreso ...fuente
Python 2 , 155 bytes
Pruébalo en línea!
fuente
PHP, 103 bytes
Pruébalo en línea!
PHP, 107 bytes
Pruébalo en línea!
PHP, 118 bytes
Pruébalo en línea!
fuente
Python + Numpy, 214 bytes
No puede competir con otra solución de Python, aunque utiliza un enfoque numérico diferente y puro:
Un poco de explicación:
S=A(r(32,60)+...)
- define el alfabeto como rangos de códigoT=A(r(128))
- tabla de hash init de tamaño 128 (punto de código más grande)T[S]=A(r(64))
- llenar la tabla hash, es decir, escribir índices 0-63 a los elementos con índices ASCIIW=T[fromstring(s,"b")]
- Convierte la entrada en matriz y la traduce a nuevos códigosW[0]=~W[0]
- invertir 1er valorW=S[bitwise_xor.accumulate(W)&63]
- use el método de acumulación de Numpy con xor para evitar bucles, restablezca 2 bits izquierdos y vuelva a traducir a asciifuente
Alice , 46 bytes
Pruébalo en línea!
Explicación
La primera mitad del programa se ejecuta en modo ordinal y configura la asignación de números a caracteres. La segunda mitad se ejecuta en modo cardinal y utiliza esta asignación para decodificar la entrada.
fuente
Japt
-P
, 33 bytesPruébalo en línea!
Por alguna razón, los casos de prueba se oponen a ejecutarse como una suite, así que aquí está el segundo , el tercero y el cuarto individualmente.
Explicación:
fuente
APL (NARS), 72 caracteres, 144 bytes
Esto supone que la entrada siempre está en la matriz 's' ... Para comprender cómo descifrar, primero tuve que escribir la versión del ensamblaje ... prueba:
fuente
105103 bytes, código máquina (16-bit x86), 57 instruccionesEjecutando: guardar en codegolf.com, dosbox:
codegolf.com < input.bin
Casi se me olvida la parte divertida:
Hola, esta es mi segunda entrada. El anterior fue RC4 . Hecho usando HT hexeditor , sin compilador , pero esta vez estaba usando Ctrl-a
assemble instruction
, todavía no sé si esto cuenta como una entrada o no.Por que y como
De manera similar, comencé creando un archivo con
NOP
s, luego reutilicé la lectura / escritura de RC4 . Primero escribí en python 'escalera de traducción' de ascii a index. y lo usé en el ensamblaje, creé una escalera similar en dirección inversa, finalmente agregué un pequeño truco para manejar el primer byteDe manera similar a RC4, el último paso fue deshacerse de los adicionales
nops
, que requirieron saltos de reparación.Disección
De nuevo, el programa se basa en valores de registro iniciales .
Dummy, se necesitará más tarde
leer byte
renunciar si stdin terminó
escalera que traduce ascii a index (tenga en cuenta que todos los saltos van a 0x134)
xor byte por byte anterior,
SI
apunta a la dirección0x100
, que inicialmente contiene 0xFF del código de operación de una instrucción ficticia en la parte superior, lo que resulta en un comportamiento negativo (recordatorio: los COM se cargan a 0x100)limite el resultado al índice y almacene el byte a 0x100,
escalera en sentido inverso
ponga el byte debajo de [di], escriba el byte en stdout (tenga en cuenta que AH = 40h usa DX como dirección, pero se configuró en la parte superior, cuando lee el byte)
Tenga en cuenta que stdin -> stdout y stdout to stdin se realiza usando inc bx / dec bx
bucle ^^
Herramientas y recursos
fuente