Máquina Cheapo Enigma (ladrones)

8

Para la publicación de la policía, Cheapo Enigma machine (Cops)

El envío de un ladrón consiste en un programa / función que acepta la salida del código de un policía y devuelve la entrada para todas las salidas proporcionadas por el código de ese policía. (En otras palabras, debe escribir la función inversa)

No puede utilizar elementos integrados que tengan el único propósito de cifrar o cifrar.

Formato de entrada / salida

8 bits (0 o 1), o un entero de base 10 en el rango 1-256, 0-255 o -128 a 127. Puede usar E / S estándar o E / S de archivo. La función también puede devolver un valor como salida. La entrada y la salida deben pertenecer al mismo rango (como en, binario, 1-256, 0-255 o -128 a 127), que también debe ser el mismo rango que el utilizado por el policía.

Puntuación

Relación entre el recuento de bytes del policía y el recuento de bytes. La puntuación más alta gana.

Puede enviar un intento de robo contra su propio código de policía como referencia. (Por supuesto, este código no es elegible para ganar)

Notificación

Edite la respuesta del policía correspondiente para incluir su nuevo recuento de bytes y la proporción correspondiente.

fantasmas_en_el_código
fuente
2
Al principio me preguntaba cómo ibas a convertir a Emigna en una máquina. Entonces me di cuenta de que no estabas hablando del usuario.
Magic Octopus Urn
OK, perdón por molestarte de nuevo, pero quiero asegurarme de que lo hice bien esta vez. Si la respuesta brainfuck lee e imprime bytes (puntos de código 0 a 255) y mi respuesta Jelly toma un número entero entre 0 y 255 y devuelve un número entero en el mismo rango, ¿es eso aceptable?
Dennis
@ Dennis No, no lo es. Tal vez usted (u otra persona) podría sugerir una redacción alternativa que aclare esto.
ghosts_in_the_code
@carusocomputing Emigna es una máquina, ¿verdad? Tiene cada programa 05AB1E cargado en su sistema de memoria, ¿sí?
caird coinheringaahing

Respuestas:

3

JavaScript por Christoph , 25/08

f=(y,x=0)=>y?f(y/2,x^y):x

(rango 0-255)

Lamentablemente, f=(y,x)=>y?f(y/2,x^y):xfunciona para todos los valores excepto 0.

Nota tecnica

Usamos en y/2lugar de y>>1guardar un byte. Esto es abusar del hecho de que cualquier valor de yeventualmente se redondeará a 0causa del flujo inferior aritmético .

Arnauld
fuente
2

C, por Dave , 64/95 92 85

b,i,e,t[256];r(x){for(;!b;++i,b=e==x)for(srand(i&&e);t[e=rand()%256]++;);return i-1;}

Pruébalo aquí !

C, versión más corta, 64/89 71

i,e,t[256];r(x){for(srand(1);t[e=rand()%256]++||++i,e!=x;);return i-1;}

Este es más específico de implementación, pero funciona en TIO. Misma longitud que la solución PHP, no pude obtenerla más corta que esta.

Pruébalo aquí !

Cáscara de manzana
fuente
Ok, lo abordaré con la presentación de la policía entonces. Gracias por informarme.
Ad Hoc Garf Hunter
1

Gelatina , 22/3 = 7 1/3

⁹ḶDÞḊi

Pruébalo en línea!

La presentación de la policía por fəˈnɛtɪk fue devolver el n º ( índice indexado 0 ) lexicográficamente ordenado utilizando el dominio [0,255] .

I primera literalmente invertido la operación descrita, ⁹ḶDÞi⁸‘- toma el rango rebajado de 256 , ⁹Ḷy Þda instrucciones a solucionar por una función clave de la conversión a una lista decimal, D; luego encuentra el índice de, i, la entrada, y resta 1 , (listas de jalea son 1 -indexed).

Luego jugué al golf quitando la lista ordenada con . Cuando no se encuentra un elemento, idevuelve 0 como se requiere para el primer elemento eliminado ( 0 ), mientras que todo lo demás se encuentra un índice antes, lo que permite la eliminación de la disminución , que a su vez proporciona una ientrada implícita a su derecha desde la izquierda (solo ) entrada al enlace monádico.

Jonathan Allan
fuente
1

Javascript por Magenta, 32/23

x=>x%16*16+(x/16+13)%16

El código básicamente cambia los 4 bits inferiores y superiores y hace una adición de módulo en una parte.

Christoph
fuente
1

Javascript por histocrat, 27/29

x=>x-65?x-126?x*127%258:131:6

Lamentablemente, se necesitan dos codificaciones duras para romperlo. Tenga en cuenta que la función original no asigna ningún valor a 130, pero asigna un valor a 256 .

Christoph
fuente
1
Tener 256 en el rango es legal de acuerdo con las reglas ("8 bits (0 o 1), o un entero de base 10 en el rango 1-256"). ¡Sin embargo, sigue siendo un ladrón válido en ese rango!
histocrat
1

PHP, puntaje 64/71

for(srand(0);$a<256;)$b[$c=rand()%256]++||$d[$c]=$a++;echo$d[$argn]|0;

Afortunadamente, PHP randsolo reenvía a stdlib como C. Así que esto funciona siempre que estemos usando el mismo stdlib. Esto significa que funciona en TIO pero no en, por ejemplo, sandbox.onlinephpfunctions.com . La versión actual del código de Dave simplemente itera sobre una secuencia pseudoaleatoria y devuelve el enésimo valor único, por lo que creo que podría haber respuestas mucho más cortas si un lenguaje de golf también usa stdlib.

Aquí hay una implementación del código de Dave que no depende de stdlib. Eso también podría ayudar.

Christoph
fuente
¡+1 por encontrar una manera de cambiar el idioma en este! ¿Alguna idea de por qué esto no necesita srand(1)? También aquí hay una ¡ Pruébelo en línea!
Dave
@Dave srand(x&&f(x-1))esto se detiene solo si, x==0por lo tanto, se siembra 0en la primera ronda. No estoy seguro de por qué las próximas llamadas no lo cambian.
Christoph
@Dave parece que se srand(0)rompe rand(ver aquí ). Supongo que srand(0)automáticamente es promovido a srand(1). Supongo que si pudieras usar una semilla diferente cada vez, sería mucho más difícil romperla.
Christoph
Interesante que esto funcione. Parece ser específico para la versión stdlib utilizada en TIO, el comportamiento en C aparentemente allí es aparentemente el mismo, mientras que en mi máquina local con sonido metálico requiere volver a invocar srand con 0 resp. 1 en cada iteración, en lugar de simplemente invocarlo una vez con 0.
Appleshell
1
@ Apple parece que las sospechas de Christoph son correctas: glibc tiene un control especial. Ver aquí: stackoverflow.com/a/8049852/1180785 (ya que mencionas el sonido metálico, supongo que tu local es OSX, así que no glibc)
Dave
0

Gelatina , 11/8

*205%257

Pruébelo en línea para ver toda la tabla.

En caso de que no se permitan envíos de ladrones en diferentes idiomas en el futuro, llamo a dibs en la siguiente solución.

g=(x,y=0)=>x-++y**5%257?g(x,y):y
Dennis
fuente
0

C (gcc) por Bijan, 32/30

g(x){x=x?g(--x)*205+51&255:0;}

Lo pasé muy bien jugando al golf, ¡gracias! x=permite omitir el retorno con gcc y tcc (es posible que desee cambiar su respuesta para incluirla). g(--x)*205+51&255es el inverso

Christoph
fuente
0

Jalea , 37/11

O_77×191%⁹Ọ

Utiliza el mismo formato de E / S que el policía. No estoy seguro si eso es necesario.

Pruébelo en línea para ver toda la tabla.

Cómo funciona

Para la entrada n , la respuesta del policía calcula f (n): = (((((n + 5)% 256 × 2)% 256 + 2)% 256 × 9)% 256 . Dado que %es un operador lineal, esto es equivalente a f (n) = (((n + 5) × 7 + 2) × 9)% 256 . Expandiendo el término correcto, obtenemos f (n) = (63n + 333)% 256 = (63n + 77)% 256 .

Revertir esto es bastante sencillo. Para deshacer la suma, simplemente tenemos que restar 77 . Además, dado que 191 × 63% 256 = 12033% 256 = 1 , se deduce que 191 es el módulo inverso 256 de 63 , por lo que multiplicar por 191 deshace la multiplicación por 63 . De esta manera, g (n) = (n - 77) × 191% 256 define el inverso de f .

Dennis
fuente