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.
fuente
Respuestas:
JavaScript por Christoph , 25/08
(rango 0-255)
Lamentablemente,
f=(y,x)=>y?f(y/2,x^y):x
funciona para todos los valores excepto0
.Nota tecnica
Usamos en
y/2
lugar dey>>1
guardar un byte. Esto es abusar del hecho de que cualquier valor dey
eventualmente se redondeará a0
causa del flujo inferior aritmético .fuente
JavaScript por fəˈnɛtɪk , 13/19
(rango 1-256)
fuente
C, por Dave ,
64/959285Pruébalo aquí !
C, versión más corta,
64/8971Este 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í !
fuente
JavaScript por fəˈnɛtɪk, 13/12
Otro inverso multiplicativo.
fuente
JavaScript , 13/11
Pruébalo en línea!
fuente
Gelatina , 22/3 = 7 1/3
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,i
devuelve 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 unai
entrada implícita a su derecha desde la izquierda (solo ) entrada al enlace monádico.fuente
Javascript por Magenta, 32/23
El código básicamente cambia los 4 bits inferiores y superiores y hace una adición de módulo en una parte.
fuente
Javascript por histocrat, 27/29
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 .fuente
PHP, puntaje 64/71
Afortunadamente, PHP
rand
solo 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.
fuente
srand(1)
? También aquí hay una ¡ Pruébelo en línea!srand(x&&f(x-1))
esto se detiene solo si,x==0
por lo tanto, se siembra0
en la primera ronda. No estoy seguro de por qué las próximas llamadas no lo cambian.srand(0)
romperand
(ver aquí ). Supongo quesrand(0)
automáticamente es promovido asrand(1)
. Supongo que si pudieras usar una semilla diferente cada vez, sería mucho más difícil romperla.Octava , 16/18
Pruébalo en línea!
fuente
Gelatina , 2/5 (no competitiva)
Pruébelo en línea para ver toda la tabla.
fuente
Gelatina , 8/5
Pruébelo en línea para ver toda la tabla.
fuente
Gelatina , 16/6
Pruébelo en línea para ver toda la tabla.
fuente
Gelatina , 11/8
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.
fuente
Gelatina , 35/7
Pruébelo en línea para ver toda la tabla.
fuente
C (gcc) por Bijan, 32/30
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&255
es el inversofuente
Jalea , 37/11
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 .
fuente