Cheapo Enigma machine (Policías)

15

Para el puesto de ladrones, máquina Cheapo Enigma (ladrones)

El envío de un policía consistirá en un programa / función que acepta un solo byte de datos y devuelve un solo byte de datos. Cada entrada posible debe producir una salida única. (En otras palabras, su función debe ser biyectiva)

Los ladrones intentarán crear la función inversa de los suyos utilizando un código lo más corto posible. Por lo tanto, su objetivo es hacer que su función sea difícil de invertir.

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

Su recuento de bytes no puede exceder los 64 bytes. Las soluciones de 0 bytes no son elegibles para ganar.

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 (binario, 1-256, 0-255 o -128 a 127). El ladrón también deberá usar este rango para entrada y salida.

Puntuación

Relación entre el número de bytes y el intento del mejor ladrón contra usted. La puntuación más baja gana.

Eres elegible para ganar (como policía) solo si un ladrón ha intentado vencerte. (Este ladrón puede ser usted)

Ejemplo

C ++, usa rango 0-255, 31 bytes

int x;
cin>>x;
cout<<(x+1)%256;

Posible envío de ladrones en C ++, 32 bytes

int f(int x)
{return x?x-1:255;}

Usar el mismo lenguaje o un algoritmo similar no es un requisito

Esto le da un puntaje de 31/32 = 0.97 tanto al policía como al ladrón.

fantasmas_en_el_código
fuente
1
¿En qué consiste un envío de policía? ¿Idioma, tamaño y código completo del programa / función?
Arnauld
1
¿no está un poco roto si el policía puede hacer algo arbitrariamente grande?
Destructible Lemon
1
Este ladrón puede ser usted. ¿Qué pasa si publico una respuesta de policía de 64 bytes que asigna N a N y una respuesta de ladrón que hace lo mismo en un byte?
Arnauld
1
Es posible que desee especificar si / cómo se debe actualizar el envío de policía cuando los ladrones responden. (Supongo que la actualización "crackeada" habitual no se aplica aquí. Al menos no como un crack único y definitivo).
Arnauld
3
Pensándolo bien, es posible que desee eliminar esa regla por completo. Puedo destruir la mayoría de las respuestas publicando un ladrón en Jelly.
Dennis

Respuestas:

7

Javascript, 11 8 bytes, Puntuación: 8/5

x=>x^x/2

Implementación simple de código gris. La decodificación usualmente necesita un ciclo completo. ¡Veamos a quién se le ocurre el más pequeño o incluso sin bucle!

Christoph
fuente
Supongo x^x/4que será más difícil porque no debería haber incorporados para ello ...
Christoph
1
Puntuación: 25/08
Arnauld
1
¿Cómo es este biyectivo?
Leaky Nun
1
@LeakyNun Uhm no estoy seguro de qué tipo de respuesta espera, pero lo intentaré: el código gris es una forma alternativa de representar un número donde cada número consecutivo solo cambia en 1 bit (la distancia media es siempre 1). Para cada número hay exactamente una codificación gris y una codificación binaria, por lo tanto, forman una biyección. Por ejemplo, 7 es 0111 en binario y 0100 en gris, el siguiente número 8 es 1000 en binario y 1100 en gris. La codificación gris es básicamente la codificación de borde de binario.
Christoph
1
@LeakyNun ^es bitor xor, no exponenciación. De todos modos, parece mágico
Евгений Новиков
7

C, 64 bytes, puntaje 64/71 = 0.901

T[256];f(x){srand(x&&f(x-1));for(;T[x=rand()%256]++;);return x;}

Toma entrada en el rango [0 255].

Pruébalo en línea! - en TIO (usando GCC), esto produce:

103,198,105,115,081,255,074,236,041,205,186,171,242,251,227,070,
124,194,084,248,027,232,231,141,118,090,046,099,051,159,201,154,
102,050,013,183,049,088,163,037,093,005,023,233,094,212,178,155,
180,017,014,130,116,065,033,061,220,135,112,062,161,225,252,001,
126,151,234,107,150,143,056,092,042,176,059,175,060,024,219,002,
026,254,067,250,170,058,209,230,148,117,216,190,097,137,249,187,
168,153,015,149,177,235,241,179,239,247,000,229,202,011,203,208,
072,071,100,189,031,035,030,028,123,197,020,075,121,036,158,009,
172,016,080,021,111,034,025,125,245,127,164,019,181,078,152,224,
077,052,188,095,119,108,134,043,085,162,004,211,054,226,240,228,
079,073,253,169,008,138,010,213,068,091,243,142,076,215,045,066,
006,196,132,173,222,048,246,032,133,007,244,185,195,217,160,120,
218,106,083,144,087,238,207,096,210,053,101,063,098,128,165,089,
140,012,192,131,047,039,022,147,184,109,182,193,199,237,018,069,
057,157,174,104,122,166,055,110,003,040,139,086,145,114,129,113,
206,167,191,214,146,221,136,038,156,082,200,029,044,204,223,064

Tenga en cuenta que en otros sistemas, puede producir resultados diferentes (pero aún válidos), ya que C no exige una randimplementación específica . Mi presentación es específicamente la versión que se ejecuta en TIO (como vinculada).


Estoy bastante decepcionado de que no haya podido obtener una versión como mi original ( f(x){return rand(srand(x*229))/229%256;}) para trabajar en TIO, ya que creo que es mucho más elegante. Como eso solo funciona en Clang que se ejecuta en OS X, no es justo para la competencia. Esto todavía es bastante incómodo de revertir, así que eso es suficiente, supongo.

Dave
fuente
Bueno ... ¡Esto es divertido!
Matthew Roh el
Solución aquí , pero me costó un poco trabajar con usted srand(), por lo que tendrá que decidir si es aceptable de esta forma.
Appleshell
No veo cómo este programa cumple el requisito de Bijection, ya que la salida es aleatoria, no todas las entradas tienen una salida única.
Post Rock Garf Hunter
2
El problema no es la implementación. El problema es que carece de lo que creo que son todas las ideas clave de este desafío: encontrar un algoritmo de prueba (por lo tanto, limitado a 64 bytes e idioma independiente) que no sea reversible para revertir. Su envío "se siente" como un vacío legal: independencia del lenguaje, el límite de 64 bytes al subcontratar a una implementación desconocida de un builtin incorporado (rand no depende del idioma sino del stdlib local ) y la regla de cifrado / hash. Está dentro de las reglas de PPCG, pero ciertamente no es lo que ghosts_in_the_code pretendía con sus reglas.
Christoph
1
@ghosts_in_the_code buenos RNG y funciones hash están diseñados para ser apenas reversibles. Por lo tanto, creo que deberían incluirse en esa regla (incluso si la implementación real podría no estar diseñada de esta manera). De todos modos, no recomiendo cambiar las reglas en esta etapa.
Christoph
2

JavaScript, 44 bytes 22/3

x=>a.sort()[x]
for(a=[],i=0;i<256;)a[i]=i++;

Utiliza ordenación lexicográfica (Javascript predeterminado) para reorganizar todos los números del 0-255

Pruébalo en línea!

fəˈnɛtɪk
fuente
1
22/3 : un idioma diferente parece aceptable, aunque sea un poco extraño. Pensé que tenía 5, pero 256 se interpusieron en mi camino :).
Jonathan Allan
1

Javascript, 11/8 bytes

x=>x**5%257

El dominio / rango es de 1 a 256.

histocrat
fuente
Hm, ¿es Javascript malo con exponentes de gran número? Esto funciona en Ruby: repl.it/HXvZ/0
histocrat
JavaScript solo tiene flotantes de doble precisión, por lo que cualquier cosa con más de ~ 53 bits no se puede representar exactamente. x**3y x**5debería funcionar
Dennis
Bueno, me sirve bien para asumir. Voy a cambiar los idiomas
histocrat
O haga la sugerencia de Dennis, dadas las reglas que favorecen los idiomas terser. :) ¡Gracias!
histocrat
Desafortunadamente, las reglas están un poco rotas en este momento, y se me permitiría invertir esto con otro idioma. Precisamente debido al límite de precisión, esto será bastante detallado para invertir usando JS.
Dennis
1

Javascript, 27/29 bytes

x=>x-6?x*95%127+x*98%131:65

Editar: Rango / Dominio es 1..256. Generado a través de la fuerza bruta, más o menos.

histocrat
fuente
Lamentablemente es biyectivo pero no está en el rango [0,256): el valor de 130 nunca se emite pero un valor de 256 sí (que no se ajusta a un int de 8 bits).
Christoph
Puntuación 27/29 . Me gusta !
Christoph
1
¡Gracias! Las reglas me permiten especificar un rango de [1,256], y es biyectivo en ese rango.
histocrat
1

Octava , 16/6

@(x)mod(x*3,256)

Pruébalo en línea!

falla
fuente
1
Puntuación: 16/6 (Nota: no creo que deba permitirse usar otro idioma para la presentación del ladrón, pero en este momento lo es).
Dennis
1
También sería interesante saber si puedo intentar vencer tu sumisión de ladrón haciendo otro policía (de nuevo usando Jelly o
MATL
1

Java, 35 bytes

int a(int v){return (v*v+v)%512/2;}

Dominio / Rango son 0-255

Targz
fuente
1

Ruby, 23 bytes

->x{('228'*x).to_i%257}

Rango y dominio es 0..255. Concatena 228 consigo mismo x veces, luego toma el módulo de resultado 257 (0 asigna a 0). 228 es el primer número mágico después del 9 que funciona para este rango (proporciona valores distintos que no incluyen 256).

histocrat
fuente
0

Python 3, 55 bytes

y=lambda x,i=3:x if i==0 else pow(3,y(5*x,i-1),257)-1

El dominio / rango es 0-255.

Magenta
fuente
0

Python 3, 32 bytes 32/23

V=lambda x:((3+x)%16)*16+x//16

El dominio / rango es 0-255.

Voltea los primeros cuatro bytes con los últimos cuatro y agrega un tres a los primeros bytes.

Magenta
fuente
1
Puntuación 32/23
Christoph
0

Mathematica, 13 bytes

Mod[#^7,257]&

Utiliza el rango [1..256], aunque es igualmente válido en el rango [0..255]. Para ver la tabla completa, copie / pegue una de las siguientes líneas de código en el sandbox de Wolfram :

Array[ Mod[#^7,257]&, 256]   (for a list of values in order)
Array[ Rule[#,Mod[#^7,257]]&, 256]   (for a list of input-output rules)
Greg Martin
fuente
0

brainfuck , 37/11

,+++++[>+++++++<-]>++[<+++++++++>-]<.

Pruébalo en línea!

No muy bueno pero rango de 0-255

Christopher
fuente
@Dennis ¡Buen trabajo! No debería usar ese lenguaje bytey.
Christopher
3
Por cierto, censurar nombres de idiomas no es una buena idea. Sí, este idioma en particular tiene un nombre común e infantil, pero todos saben lo que significa el asterisco y el motor de búsqueda no lo puede encontrar en su forma actual.
Dennis
@Dennis finalmente arregló eso
Christopher