Transformadores disfrazados (Hilo de policías)


10

El hilo del ladrón está aquí.

La tarea de los policías es escribir una función o programa que, cuando recibe una entrada de sí mismo, emite una cadena determinista finita. Si el programa recibe una entrada diferente, debería devolver una salida diferente.

Reglas:

  • Las presentaciones consisten en
    • Nombre del lenguaje
      • Si se utilizan banderas, deben revelarse.
    • Cuenta de bytes del programa
    • Recuento de bytes de salida
    • Salida
      • Si es particularmente largo, proporcione un pastebin o algo similar
      • Si contiene elementos no imprimibles, proporcione un volcado hexagonal.
      • Las nuevas líneas y espacios en blanco finales deben incluirse en la salida
    • De dónde proviene la entrada (STDIN, línea de comando, etc. )
  • Si corresponde, puede suponer que el byte que representa EOF no está presente en la entrada, a menos que use ese byte en su programa.
  • Si su programa está descifrado, agregue un enlace a la respuesta correspondiente en el hilo del ladrón en su título.
  • Su programa no es seguro hasta que haya pasado una semana y usted lo marque así.
  • Desapruebo técnicas como la siembra aleatoria con la entrada o las funciones hash criptográficas. No puedo detenerlos, pero no aceptaré una solución que utilice ninguno de estos . También tenga en cuenta que algunas de estas técnicas pueden tener colisiones, donde una cadena diferente produce la misma salida.
  • Su objetivo es tener el menor rendimiento. ¡La solución segura más corta publicada dentro de las tres semanas posteriores a la publicación de esta pregunta gana!

La tarea del ladrón es encontrar un programa de tamaño igual o menor que el original, que también obedece las reglas anteriores.

Si un ladrón descifra su programa con una solución diferente a la prevista, entonces tiene la oportunidad de "descifrarlo" demostrando que la solución del ladrón es incorrecta. Puede hacer esto buscando una entrada al programa del ladrón que produzca la misma salida.

Presentación de ejemplo:

brainfuck, 10 bytes, Puntuación: 10

]<.[<],>[,

Esta solución es , [>,] <[. <] Que simplemente invierte la entrada

¡Buena suerte!


"Si el programa recibe una entrada diferente, debería devolver una salida diferente". ¿Esto significa que el programa nunca debería generar lo mismo para otras entradas? ¿O significa esto que el programa no debería generar constantemente algo independientemente de la entrada? (EXISTE una entrada que no es igual a sí misma, vs., TODAS las entradas que no son iguales a sí misma, devuelve una salida diferente.)
tsh

@tsh Solo la entrada de sí misma debe tener una salida única. Por ejemplo, una presentación válida podría ser un programa de autoidentificación , que se genera 1por sí mismo y de 0otro modo
Jo King el

@JoKing ¿Entonces su envío de Python 3 de ejemplo no es válido? Porque, obviamente, también genera 1021111143210532105110321051101121171164041581121141051101164011111410040105414410111010061393941otras cadenas.
Lynn el

@lynn Tienes razón. He eliminado ese ejemplo
Jo King, el

Respuestas:


4

7 , 31 caracteres, puntaje 30, seguro pero posiblemente roto?

Un programa 7 normalmente es solo un número, pero puede contener espacios en blanco, dividiéndolo en múltiples números. Por lo tanto, esta presentación consta de dos números (que están implícitamente concatenados por el intérprete 7), y el programa también toma dos números como entrada, a través de la entrada estándar. (Los "31 caracteres" en el encabezado son la longitud total de los dos números, más un carácter de espacio en blanco de separación; los dígitos que componen los números se interpretan como octales cuando se usan como programa, pero decimales cuando se usan como entrada, y son los dígitos iguales en los dos casos, no los números reales. Tenga en cuenta que es irrelevante cuando se trata como un programa o cuando se trata como una entrada, ya sea que los separe con un espacio o una nueva línea; espero que eso no No invalidar la presentación.)

La salida esperada es el siguiente número (expresado aquí en decimal, ya que ese es el formato de salida que usa el intérprete 7):

238363505302130098723162537059

Tenga en cuenta que el intérprete 7 vinculado desde la wiki de Esolang almacena internamente números en unario, lo que significa que es poco probable que tenga suficiente memoria para ejecutar el programa en sí mismo para ver lo que hace. Verifiqué el programa calculando su comportamiento manualmente y probándolo en pequeñas entradas para verificar que hizo lo que esperaba que hiciera. Un enfoque alternativo sería escribir un intérprete que use un método más eficiente para almacenar números.

Evitar grietas aquí fue algo doloroso, pero finalmente estoy satisfecho de que no haya dos números distintos a los del programa en sí mismos que sean capaces de producir 238363505302130098723162537059 como salida. ( EDITAR 1 semana después: es posible que me haya equivocado, dependiendo de cómo interprete la pregunta; ver más abajo ) .

Solución

El programa original fue:

711170237403706
111723603700633
Este programa toma dos números X e y , y calcula el resultado de la expresión 3Xy-y-2 (es decir, y(3X-1)-2 ). Si realizamos este cálculo en X=711170237403706 e y=111723603700633 , obtenemos un resultado de 238363505302130098723162537059 según sea necesario .

Se pretendía que ninguna otra entrada daría el resultado deseado porque:

La entrada debe elegirse de manera que y(3X-1)-2=238363505302130098723162537059 , es decir y(3X-1)=238363505302130098723162537061 (sumando 2 a ambos lados). Este número es un semiprime, con solo dos factores: 111723603700633 y 2133510712211117 . Solo uno de estos números, 2133510712211117 , puede expresarse en la forma 3X-1 (dando (3×711170237403706)-1=2133510712211117 ). Por lo tanto, podemos identificar de forma exclusiva qué número esX cuál esy , lo que significa que solo funciona una entrada.

Sin embargo, dependiendo de cómo interprete la pregunta, puede haber una segunda entrada que produzca la salida deseada (invalidando así esta solución):

113X-1X79454501767376699574387512354189 9) que no están en el juego de caracteres para 7 programas. Entonces, si la entrada está restringida a estar en el mismo juego de caracteres que el programa, esta solución es válida; pero si se permite la entrada que contiene caracteres externos al conjunto de caracteres del programa, esta solución no es válida.

Explicación

Así es como funciona la solución deseada:

711170237403706 111723603700633
7 7 7 Separadores de elementos apilados
 113023 403706 111723603700633 Elementos iniciales de la pila
 111 Número 3, en unario
     023 DSL de E / S para "ingresar un número"
         403706 111723603700633 Programa principal
(Implícito: ejecutar una copia del elemento principal del programa, conservando el original)
         40 Intercambie {023} sobre {programa}, escapándolo
           3 Hacer E / S usando {023}; pop {programa}
     0 E / S: numérico
      23 Ingrese un número, copiando {111} tantas veces
            706 Agregar "6" al número (decrementándolo)
                11 Empuje dos elementos de pila vacíos
                  17236 Empuje un elemento de pila "23" (sin escape)
                       0 Escape {23}, consumiendo un elemento vacío
                        3 Hacer E / S usando {23}; pop {el elemento a continuación}
                    23 Copie la parte superior de la entrada de la pila muchas veces
                         7006 Agregar "66" (es decir, restar 2)
                             3 Salida {como un número}
                              3 Salga del programa (debido a la pila baja)
170666123453123451234512345



3

Un peral , 46 bytes de ASCII, puntaje 0, agrietado

La entrada se toma de la entrada estándar. La salida esperada (en la salida estándar) es una cadena vacía (es decir, cuando el programa se entrega como argumento, no se debe imprimir ninguna salida).

En otras palabras, el desafío aquí es escribir un programa A Pear Tree que no muestre nada en la salida estándar cuando se da a sí mismo en la entrada estándar, y que sí arroja algo en la salida estándar cuando se le da algo diferente a sí mismo en la entrada estándar, sin usar más de 46 bytes. (Me las arreglé para hacer esto mientras mantenía el programa en ASCII imprimible, a pesar de que A Pear Tree usa con frecuencia caracteres no ASCII y no imprimibles). Esta es efectivamente la tarea de escribir un programa autoidentificable , con un formato de salida específico (es decir, cadena nula cuando la autoidentificación tiene éxito); sin embargo, A Pear Tree tiene al menos dos giros que hacen que la tarea sea un poco más difícil de lo que parece cuando se hace en este lenguaje específico (por eso lo elegí para mi envío de policía).

Mi solución

Mi solución es un poco diferente del crack:

eval(k=q(print$\=$_="eval(k=q($k))"ne$_;MZpa))

Pruébalo en línea!

En lugar de usar exit, establezco $_(salida implícita) y $\(nueva línea después de la salida, incluida la salida implícita) en la cadena nula si hay una coincidencia (y 1si no hay una coincidencia). Una printsigue siendo necesaria porque la producción implícita sólo se activa si hay al menos un byte de entrada (por lo tanto, tenemos que imprimir de forma explícita si algo se nos da una cadena vacía como entrada, que es distinto del programa).

Todos los programas de A Pear Tree deben contener una suma de comprobación en alguna parte (esa es la MZpasolución). Tanto mi solución como el crack seleccionan nombres de variables (y varían otros detalles menores del código) para hacer que la suma de verificación consista completamente en letras ASCII.



3

Perl 5 -p0777, 10 bytes, puntaje 10, seguro

W)9r46<(k

El último carácter aquí es "desplazamiento", código de carácter 14 (decimal) / 0E (hexadecimal). Todos los demás son ASCII imprimibles.

Debido a que estamos usando el argumento de E / S implícito de Perl -p0777, la entrada proviene de la entrada estándar y la salida va a la salida estándar.

Solución

El programa hace lo siguiente:

NUL-rellena la entrada de al menos 10 caracteres, luego XOR con la cadena svgOUT_TOP

lo que significa que el programa en sí, la única entrada que produce la salida deseada, es:

$ _ ^ = abc | $ ^

Pruébalo en línea!

Explicación

Perl tiene varias variables de propósito especial. Por ejemplo, cuando se usa -p0777para E / S implícitas, $_se ingresa al inicio del programa y se emite al final del programa.

La mayoría de estas variables tienen un valor predeterminado muy simple. Sin embargo, el valor predeterminado de $^, el formato de inicio de página seleccionado actualmente, es la cadena mucho más larga STDOUT_TOP. Como tal, podemos usar esto como un método de ofuscación muy breve a través de XORing $^con el valor que queremos ofuscar (en este caso, el programa).

Con el fin de ocultar la información reveladora _TOPal final, completé el programa hasta 10 caracteres agregando un abc|, lo que significa que todos los caracteres de STDOUT_TOPserían XORed con algo; La elección abc|al principio era una manera fácil de mantener la salida en su mayoría imprimible (y hacer que sea más difícil detectar que estaba XORing con una cadena hecha principalmente de letras mayúsculas, porque en ASCII, XOR en minúscula mayúscula es minúscula).


3

Python 3, 50 bytes descifrados

Entrada y salida de / a stdin / -out. La salida es diferente para cada entrada diferente. Salida única cuando se le da el código fuente:

218216195196222130136136132192197195196130241204136209197216206130201131244155157154215136138204197216138201138195196138195196218223222130131247131131

(Eso es 150 dígitos)

¡Buena suerte!


Whoops! Ahora veo que este desafío ha terminado hace mucho tiempo ... Extraño que apareció en mi línea de tiempo / feed. Curioso por ver si alguien responde a esto ...
hasta el



2

Cubix , 18 bytes, puntaje 18, seguro

Es una pena que este desafío no haya recibido más atención, pero a veces es así. Iba a dejar esto inseguro, pero decidí publicar la solución antes de olvidarlo.

Esto debería ser bastante fácil de descifrar.

Entrada destdin

Salida

$`*2aJPJ#74(o);89

Editar: Debo mencionar que esto espera la fuente en su forma abreviada ... y ahora me he dado cuenta de que falta un byte (no imprimible) del resultado que rompí cuando publiqué. Debería copiar ahora. Los valores hexadecimales son24 60 2a 13 32 61 4a 50 4a 23 37 34 28 6f 29 3b 38 39

El concepto era eliminar imprimir el primer carácter y luego eliminar el índice inverso del carácter, por ejemplo, [caracteres] - [0, len ([caracteres]) .. 2]

El código es

$r;#AoW\U-@</u.?;;

que se asigna al siguiente cubo

    $ r
    ; #
A o W \ U - @ <
/ u . ? ; ; . .
    . .
    . .

Pruébalo aquí


2

Jalea , 14 bytes, Puntuación: 21, Seguro

Tanto el programa como el tamaño de salida se cuentan utilizando la página de códigos Jelly.

Entrada

Primer argumento de línea de comando.

Salida

-§ḋẇ"*YdĖDƘ>Ẉed€Ç+æạɦ

Solución

ØJiⱮÄÆNPḃØ⁵ịØJ

Pruébalo en línea!


Debido a que la conversión de / a la página de códigos Jelly es difícil, sería útil tener un verificador (que tome un programa, lo convierta de UTF8 a Jelly, lo alimente consigo mismo, convierta de Jelly a UTF8 y verifique si es igual al esperado salida)
user202729

@ user202729, este programa Jellyv⁼ rendirá 1si la entrada evaluada como código Jelly con una entrada de la entrada es igual a la entrada y producirá un 0error (si la entrada es un código Jelly no válido) si no.
Jonathan Allan

1

JavaScript Firefox, <10 bytes, Puntuación: 52, de entrada de argumento de función, Agrietado

ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ==


btoa

btoa(btoa) codifica la siguiente cadena:

function btoa() {
    [native code]
}

lo que da:

"ZnVuY3Rpb24gYnRvYSgpIHsKICAgIFtuYXRpdmUgY29kZV0KfQ=="

acabo de copiar


En primer lugar, después de hacer lo obvio, ¿este no es el código real? En segundo lugar, no especifica de dónde proviene la entrada. Publicaría un crack, pero sinceramente, no estoy seguro de si esta presentación es válida.
Quintec


No creo que sea necesario incluir la publicación de crack en esta publicación: las personas solo pueden hacer clic en el enlace para ver la crack.
user202729

1

GCC 61-> 61 bytes

70 4F 92 73 08 D4 03 E7 65 DC D6 89 B5 AD BA 90 
97 26 31 10 F6 FA 0A 30 8F 24 69 0A A7 8B 59 9E 
A2 42 D5 67 B8 12 3A 1E 9D 25 80 F9 6B 25 32 C2 
EE 46 3F 8D 7E 0C 73 0F F0 93 C6 68 50

Programa completo, tome la entrada de stdin y la salida a stdout


Entonces, ¿hay un espacio después del último 50?
tsh

@tsh Es un vertedero hexadecimal
l4m2

1

Perl 6, 43 bytes, Puntuación: 15, de stdin

49671296789805

2
Simplemente verificando, dado que su respuesta anterior no siguió las reglas de una salida única para su programa como entrada, ¿puede confirmar que esta presentación sí?
Jo King

Sí, eso creo.
donaldh


1

J , 26 bytes, Puntuación: 52, Seguro

El programa no es un REPL, sino un script completo que acepta stdine imprime explícitamente stdout.

Entrada

Entrada estándar

Salida

6fc42353c98217ef5a2908a3c63d090aa9a55b2558b61294e06a

No, no es un método de cifrado.


Solución

echo]hfd]257x#.3&u:stdin''
                   stdin'' Take the whole input
               3&u:        Convert to codepoints
         257x#.     Convert base 257 to integer
     hfd]           "Hex from Decimal"
echo]               Print to stdout

Pruébalo en línea!


1

Barril , 6 bytes, Puntuación: 6

Entrada

De stdin, usando?

Salida

5\x1c"\x1c"9

Tenga en cuenta que esas son secuencias de escape para bytes no imprimibles. Reemplace los escapes con los caracteres literales. Texto sin procesar disponible aquí

Buena suerte con este! ¡Nos vemos la próxima semana!


0

 Perl 6, 31 bytes, Puntuación: 39, de stdin - Agrietado

Agrietado aquí

().1111111111112222235abcegijkmnorstvy

Solución cruda. Podría sobrevivir.


Estoy bastante seguro de que descifré su solución y sospecho que su programa no sigue la regla de que diferentes entradas deberían producir diferentes salidas.
nwellnhof el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.