La impresora de cadenas misteriosas (ladrones)

26

El hilo de policías se puede encontrar aquí: The Mystery String Printer (Cops)

Tu reto

  • Elija una presentación del hilo de la policía e imprima la cadena de una respuesta en ese hilo.
  • El envío que elija no debe ser seguro (debe ser más reciente que 7 días).
  • Su programa, función o script REPL necesita seguir las mismas reglas que el hilo policial. Solo para recapitular:

    • Su programa debe tener ≤128 caracteres (si el envío de un policía está en un rango menor de longitudes de programa, su programa también debe estar en ese rango de longitud. Por ejemplo, si el programa de un policía tiene ≤32 bytes, su programa debe tener ≤32 bytes )
    • El programa debe producir la misma salida cada vez que se ejecuta.
    • Sin funciones criptográficas.
    • El programa no debe tomar entrada.
    • No hay lagunas estándar.
  • Todos los envíos nuevos deben usar el mismo idioma. Las presentaciones anteriores a esta regla están bien, incluso si no lo hacen.

Tanteo

La puntuación funciona de manera similar para los ladrones, pero es ligeramente diferente:

  • Descifrar cualquier programa de ≤8 bytes da 1 punto.
  • Romper un programa de ≤16 bytes da 2 puntos. ≤32 bytes da 4 puntos, y así sucesivamente.
  • Cada presentación adicional, sin importar la longitud, gana +5 puntos
  • La presentación de cada policía solo se puede descifrar una vez, solo la primera persona en descifrar cada presentación obtiene los puntos.

Envíos

Cada respuesta debe incluir

  • Un enlace a la presentación del policía.
  • Su programa y lenguaje de programación.
  • También tenga la longitud del programa del policía (como una potencia de 2) como el último número en su encabezado.

Además, comente el envío del policía con un enlace a su respuesta.

Aquí hay un fragmento de pila para generar tablas de clasificación. Deja un comentario si hay un problema con el fragmento. Si desea ver todos los envíos de policías abiertos, vea el fragmento en el desafío de la policía.

Este concurso está cerrado.

Ganador general: kennytm

La mayoría de las presentaciones: Sp3000

(Tenga en cuenta que la cantidad de envíos no se traduce exactamente en los puntos, ya que la longitud del programa descifrado se cuenta al calcular la puntuación).

Daniel M.
fuente
Nota: cada presentación adicional gana 5 puntos
Daniel M.

Respuestas:

29

Pyth, Dennis, ≤ 8

V./Tp*FN

Maldición, eso fue divertido: la parte más difícil fue descubrir cómo hacerlo lo suficientemente corto en Pyth.

Análisis

Al 1234principio, indica que probablemente estamos tratando con una lista de números, impresa sin separador. Intentemos dividir los números de una manera que tenga sentido:

1 2 3 4 4 6 5 8 8 9 6 12 10 12 7 16 16 18 12 15 16 8 24 20 24 14 27 18 20 9 32 32 36 24 30 32 16 36 21 24 25 10

Hay algunas pistas de que estamos en el camino correcto:

  • Todos los números tienen factores primos menores que 10
  • Muchos números están muy cerca de su índice en la lista

Sin embargo, hay algunas peculiaridades. El número en el índice 23 es 24, y es el único caso en el que el número en el índice es mayor que el índice mismo. Sin embargo, la pista más importante es que algunos números son claramente más pequeños que sus vecinos, particularmente el 7 en el índice 15, el 8 en el índice 22 y el 9 en el índice 30.

Al observar que esto forma un patrón de 7-8-9, también podemos ver que el último número es un 10 en el índice 42. Dada la reciente pregunta de @Dennis sobre grupos abelianos , una revisión rápida en OEIS revela que 15, 22, 30, 42es una subsecuencia de la partición los números . Pyth tiene un incorporado para particiones, lo que nos da dos de ocho caracteres:./

Pero tenga en cuenta que el último número es 10, lo que es sospechoso porque 10 es una variable preinicializada en Pyth, como T. ./Tda una lista completa de las 42 particiones del número 10, que parece ser útil.

Ahora la impresión se realiza sin un separador, por lo que esto sugiere un uso de p. ¿Quizás recorremos cada partición, le hacemos algo y luego imprimimos p? Esto nos da la siguiente plantilla:

V./Tp??N

donde Ves un bucle for que recorre un iterable, almacenando cada elemento en la variable N.

Un vistazo rápido a la segunda última partición (5, 5)debería hacer obvio que queremos tomar un producto. La forma ingenua de reducir una lista por multiplicación es

u*GHd1

¿Dónde destá la lista en cuestión? Sin embargo, esto es demasiado largo.

Desafortunadamente, aquí es donde tuve que sacar un forzador bruto. No me he mantenido al día con Pyth por un tiempo, por lo que no conocía muchas de las características más nuevas. Solo quedaban dos personajes, que parecían completamente factibles.

El forzador bruto luego regresó:

V./Tp*FN

donde *Fse pliega por *(multiplicación). No es de extrañar que no lo haya encontrado en mi búsqueda. ¡Estaba buscando la palabra clave "reducir" en lugar de "doblar"!

Sp3000
fuente
3
Incluso posible en 7:jk*M./T
Jakube
@Jakube Oh, wow, si el rango hubiera sido <= 7, estaría condenado. Seguro que ha pasado un tiempo desde que revisé el idioma.
Sp3000
10

Mathematica, alphalpha, ≤ 32

GroupOrder[MonsterGroupM[]]

Odio decir esto, pero acabo de reconocer el número en el acto.

Sp3000
fuente
3
Aún más corto:31!10!27079205916672
kennytm
2
Maldición, sabía que ese número me resultaba familiar.
Dennis
9

> <>, VTCAKAVSMoACE, ≤ 64

'9?':?!;1-$:'@'+o'3'*'='%$30.

Irónicamente, no solo es mucho más bajo el límite de alcance, también es portátil y funciona con el intérprete en línea .

Análisis

Comencemos con la cadena de destino:

yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh[

> <> empuja los caracteres a la pila con 'o "en modo de cadena, pero con 63 caracteres para imprimir y solo 64 bytes para trabajar, la presencia de letras mayúsculas (instrucciones no válidas en> <>, para el truco de bucle redondo estándar) hace impresión directa imposible. Por lo tanto, debemos estar haciendo algo con los puntos de código.

La conversión a puntos de código da (estoy usando Python aquí):

>>> L = [ord(c) for c in "yh[cPWNkz^EKLBiQMuSvI`n\Yw|JVXDUbZmfoRC_xrq{TlpHjGt]OadFAsgeyh["]
>>> L
[121, 104, 91, 99, 80, 87, 78, 107, 122, 94, 69, 75, 76, 66, 105, 81, 77, 117, 83, 118, 73, 96, 110, 92, 89, 119, 124, 74, 86, 88, 68, 85, 98, 90, 109, 102, 111, 82, 67, 95, 120, 114, 113, 123, 84, 108, 112, 72, 106, 71, 116, 93, 79, 97, 100, 70, 65, 115, 103, 101, 121, 104, 91]

Tenga en cuenta que los últimos tres números son los mismos que los primeros tres. Esto sugiere un posible bucle de módulo en curso.

Echemos un vistazo a cuántos elementos diferentes tenemos:

>>> len(set(L))
60

Tenemos 63 elementos L, los tres primeros coinciden con los últimos tres. Esto significa que, aparte de esta colisión, todos los demás elementos son únicos. Ahora, esto sugiere algo así como tomar poderes módulo un número primo. De hecho, 60 + 1 = 61es primo, lo cual es una buena señal.

Intentemos encontrar el elemento más pequeño.

>>> min(L)
65

y use eso para escalar todos los elementos hacia abajo para que el elemento min sea 1

>>> M = [x-64 for x in L]
>>> M
[57, 40, 27, 35, 16, 23, 14, 43, 58, 30, 5, 11, 12, 2, 41, 17, 13, 53, 19, 54, 9, 32, 46, 28, 25, 55, 60, 10, 22, 24, 4, 21, 34, 26, 45, 38, 47, 18, 3, 31, 56, 50, 49, 59, 20, 44, 48, 8, 42, 7, 52, 29, 15, 33, 36, 6, 1, 51, 39, 37, 57, 40, 27]

Tenga en cuenta cómo el elemento después 1es 51. Si hay algún tipo de potencia / multiplicación, esta es una buena suposición para nuestro multiplicador.

Vamos a intentarlo:

>>> (57*51)%61
40
>>> (40*51)%61
27
>>> all((x*51)%61 == y for x,y in zip(M, M[1:]))
True

¡Bingo! Ahora podemos dar marcha atrás, dando el siguiente código:

x = 57
for _ in range(63):
    print(chr(x + 64), end="")
    x = (x*51)%61

que luego se tradujo a> <>

Sp3000
fuente
1
Curiosamente, esto es muy diferente a lo que hice: utilicé 37 y 112 (destinado a utilizar 101, pero cometí un error en el código. Error épico) como un conjunto de multiplicación continua y módulo con 63, luego agregué 64 a entrar en un rango legible ASCII. +1 Bien hecho.
Addison Crump
Muy agradable, ojalá pudiera hacer eso;)
J Atkin
7

Pyth, Maltysen, ≤4

C.ZG

La fuerza bruta tardó tanto que lo hice más rápido manualmente.

Análisis

C(convertir cadena a base 256 int) es la forma más fácil de generar un gran número en Pyth, por lo que probablemente sea el primer carácter. Si convertimos desde la base 256, obtenemos:

xÚKLJNIMKÏÈÌÊÎÉÍË/(,*.)-+¯¨¬ 

Hmm ... no muy esclarecedor.

Ahora Ges la cadena del alfabeto "abc...z", que parece que podría ser una fuente de alimentación para una cadena larga C. Mirando a través de los documentos encuentro:

.Z    Compresses or decompresses a string.

Si se trata de compresión aquí, no sería sorprendente obtener todo tipo de caracteres ASCII extendidos. Intentando, C.ZGentonces dio la respuesta.

Sp3000
fuente
6

Fourier, decadencia beta, ≤ 32

2~x1~y20(xoy~z*x~yz~xq^~q)

O, alternativamente, en CJam:

X0I{_2$+}*]2\f#

Análisis

Al principio podemos ver muchos poderes de 2:

2
1
2
2
4
8
32
256
8192
2097152
...

Si tomamos la base de registro 2 de estos números, obtenemos:

1 0 1 1 2 3 5 8 13 21 ...

que es la serie de Fibonacci, comenzando en 1, 0.

Sp3000
fuente
6

Caracoles, feersum, ≤2 bytes

z

Esto es en realidad 2 bytes; El personaje zseguido de una nueva línea \n.

No tengo idea de cómo funciona o lo que está haciendo, pero después de probar todas las posibles entradas aparte de ~+y ~,, este fue el único programa de 2 bytes que se produce 8como salida.

Y tomó años obtener este resultado. No es de extrañar que se llame "Caracoles" :-D


Nota personal: la próxima vez que realice una prueba fuzz de software desconocido, hágalo dentro de una máquina virtual.

ossifrage aprensivo
fuente
5

Rust, Liam Noronha, ≤128 bytes

fn main(){print!("AACAAEGAAACIIMOAAACAAEGQQQSYYDFAAACAAEGAAACIIMOHHHJHHLNXXXAGGKMAAACAAEGAAACIIMOAAACAAEGQQQSYYDFOOO");}

Simplemente imprimir la cadena textualmente es de 120 bytes ...

Pomo de la puerta
fuente
1
wow ya era tarde cuando hice eso. Tan tonto lo siento. Podría haber hecho el texto considerablemente más largo sin esfuerzo. Publicaré la fuente real.
Liam
5

CoffeeScript, usuario2428118, ≤64

alert 0+(btoa k.substr -2 for k of document.body.style).join ''

(solo funciona en Chrome 46.0.2490.71 como lo describe el policía).


La salida es obviamente una concatenación de cadenas cortas codificadas en base64 debido a todo el "=". Después de decodificarlos, encontramos una lista de cadenas de 2 caracteres como

['nt', 'ms', 'lf', 'ne', 'll', 'on', 'ay', 'on', …

lo cual no parece tener sentido. Pero encuentro algunos elementos extraños en él, como nXy tY. Después de filtrar estos, obtenemos

>>> # Python
>>>
>>> [i for i in tt if not re.match('[a-z]{2}$', i)]
['nX', 'nY', 'tX', 'tY', 'wX', 'wY', 'r', 'nX', 'nY', 'tX', 'tY', 'nX', 'nY', 'nX', 'nY', 'nZ', 'x', 'y']

Estos X e Y parecen indicar el código fuente original utilizado como propiedades de posición offsetX/Y. Un elemento particularmente interesante es el nZartículo. Para verificar mi suposición, busqué todas las propiedades que terminan con "Z":

// CoffeeScript
checked = []
f = (o) ->
    if !(o in checked) 
        for k of o
            if /Z$/.test(k)
                console.log(o, k)
            if o[k] instanceof Object
                f o[k]
f window

que muestra toneladas de CSSStyleDeclaration, "webkitTransformOriginZ". A partir de esto, tenemos una fuerte indicación de que la lista está formada por los últimos 2 caracteres de todas las claves de un styleobjeto, lo que la prueba anterior muestra que es correcta.

kennytm
fuente
Lo encontraste, ¡felicidades! Código fuente original
user2428118
5

Lua <= 4, Egor Skriptunoff

Muchos usuarios se inquietaban por esta respuesta en el chat, por lo que debo aliviarlos de su miseria. No conozco a Lua y no pude probarlo, pero me sorprendería mucho si esto no funciona.

4^~9

Esto sería bastante obvio, pero probablemente nadie lo entendió porque los operadores bit a bit solo se agregaron en la versión 5.3; ideone.com solo tiene la versión 5.2.

Feersum
fuente
Facepalm Pasé por alto los operadores bit a bit porque solo usan números enteros.
LegionMammal978
5

Python 2, histocrat, ≤16

[[[51002**3/6]]] 

La pista más importante es la promesa de que no funcionará en Python 3. ¿Qué ha cambiado en Python 3 ? El principal sospechoso es que el operador de división devuelve un floaten Python 3.

Así que supongo que la solución es de la forma ⌊α β / n⌋ = c = 22111101102001, ya que la exponenciación es la única forma corta de crear números enormes.

Si {α, β, n} realmente forma una solución, entonces (cn) 1 / β ≈ α debería estar muy cerca de un número entero. Por lo tanto, uso lo siguiente para intentar forzar la fuerza bruta {α, β} para cada n:

(* Mathematica *)
n=2; Sort[Table[{N[Abs[k - Round@k] /. k -> (22111101102001*n)^(1/b), 12], b}, {b, 2, 50}]]

(* Output: {{0.00262542213622, 7}, ...}

   The first number is the "quality" of the solution, lower is better.
   the second number is β.
   Thus α ≈ (nc)^(1/β) = 89
   But (89^7)/2 = 22115667447764, which is still far away from the answer.

*)

El resultado real sale rápidamente cuando n = 6.

kennytm
fuente
¡Bien hecho! Esa es la solución prevista, y sobre cómo esperaba que alguien lo resolviera (aunque no me di cuenta de antemano cuán dependiente de la plataforma era).
histocrat
4

MATLAB, StewieGriffin, ≤ 16

[36;87]*' |'*5

Huellas dactilares:

ans =
        5760       22320
       13920       53940
Tom Carpenter
fuente
¡Agradable! Alegro que te haya gustado :-) la forma en que lo hice: 5*'$W'.'*' |'.
Stewie Griffin
Estaba pensando en hacerlo mucho más difícil al multiplicar, por ejemplo, en .73lugar de 5, do +5o hacerlo una 3x3matriz, pero pensé que esto era más divertido. Podría haber hecho mucho con los tres bytes restantes.
Stewie Griffin
@StewieGriffin Nunca se ha encontrado .'antes, pero tiene mucho sentido: se preguntaba cómo transponer una cadena sin recurrir a los corchetes.
Tom Carpenter
4

Matlab, Luis Mendo, ≤16

Lo encontré, yay!

fix(peaks(9).^2)

No sabía que Octave también puede hacer esto.

Wauzl
fuente
¿Cómo? ¿Habías oído hablar de él peaks()?
lirtosiast
Sí tengo. Por peligro he estado jugando con peaks.
Wauzl
4

Python, spacemanjosh, ≤ 64

n=0;d=1;L=[]
exec("L+=[10/(100-n)**.5];n+=d;d+=2;"*10)
print(L)

Gloriosa calculadora simbólica inversa. No está bien golfizado, pero bueno, encaja.

Editar: lo jugué golf.

print([10/(100-n*n)**.5for n in range(10)])
Sp3000
fuente
4

JavaScript ES6, Cᴏɴᴏʀ O'Bʀɪᴇɴ, ≤128 bytes

var x=122,s='0037122342526683102122';for(var i=23;i<=505;i+=2)s+=(x+=i);s;

Dudo que esto sea correcto ya que no necesitaba cerca de 128 bytes, pero encontrar una secuencia repetitiva fue un desafío divertido.

SLuck49
fuente
Guau. Usé un método completamente diferente. ¿Eso todavía cuenta? : 3
Conor O'Brien el
@ CᴏɴᴏʀO'Bʀɪᴇɴ Usualmente lo hace. Tengo mucha curiosidad sobre el original y qué produce esos primeros 22 bytes, supongo que algo funky en el bucle init
SLuck49
Lo publicaré cuando tenga tiempo. Creo que es el piso de la función s * s - s / (5-s)
Conor O'Brien
4

Thue, ppperry, <= 64

0::=11
1::=22
2::=33
3::=44
4::=55
a::=bbb
b::=000
::=
aaaaaaa

Descompone 2016 en sus factores primos, esencialmente. 62 caracteres, así que supongo que esto es similar a lo que estabas buscando.

histocrat
fuente
Puede hacer 0 :: = 2222 para guardar algunos bytes.
lirtosiast
Sin embargo, parece un poco menos elegante.
histocrat
4

> <>, Sp3000, <= 8

'l(?; o>

El puntero de instrucciones se ajusta y suceden los siguientes pasos:

  • 'l(?; o>'empuja los valores ASCII de l(?; o>a la pila
  • l empuja el tamaño de la pila en la pila
  • (compare los dos elementos principales de la pila: size of stackyord('>')
  • ?; detiene el programa si el tamaño de la pila era mayor
  • omuestra el elemento superior de la pila como carácter (esto será siempre o)
  • > establece la dirección IP, aquí está sin operación
  • volvemos al primer paso

La salida es oooooooooooo.

Podemos obtener muchas salidas diferentes cambiando [space]a algo que empuje o explote en la pila y use otro personaje válido en lugar de >, que también puede empujar o explotar.

randomra
fuente
¡Agradable! Como referencia, tuve:'l=?;o*
Sp3000
4

CJam, Reto Koradi, ≤ 4

HJK#

Empuja 17 , luego 19 20 = 37589973457545958193355601 .

Pruébalo en línea.

Solo hay tantas cosas que puede hacer en cuatro bytes. Un número entero tan grande tenía que involucrar poderes o factoriales de alguna manera, y un factorial tendría ceros finales.

Dennis
fuente
Eso es correcto. Hoy me encargaré de la actualización oficial de la publicación.
Reto Koradi
4

Pyth <= 4, Dennis

ljyG

Esa es la longitud de la unión en las nuevas líneas de todos los subconjuntos del alfabeto.

Prueba de funcionamiento:

$ pyth -cd 'ljyG'
==================== 4 chars =====================
ljyG
==================================================
imp_print(Plen(join(subsets(G))))
==================================================
939524095

Descubrí que el número era 2^27 * 7 - 1una pista fuerte en la que se basa yG, que es 2^26elementos largos. Entonces supuse que tenía que convertirse en una cadena y su longitud impresa. Sin embargo, la única forma de hacerlo que se me ocurrió por un tiempo fue ``, repr. Entonces pensé j, que encaja perfectamente.

isaacg
fuente
4

C, tucuxi, ≤64

main(i){for(i=0;i<11000;++i)if(!(i&2*i))printf("1%d",!(i&1));}

Los resultados son todos 0 y 1, pero C no puede imprimir binarios directamente, por lo que es muy probable que estos sean resultados booleanos.

Hay más de 1 que 0, así que grabé las posiciones de 0 ( 3, 9, 13, 19, …), que resulta ser OEIS A075318 . Sin embargo, esto no es útil, no existe una fórmula simple para determinar dónde está un número en esta secuencia.

Pero notamos que hay números impares, por lo que quizás (x-1)/2 = {1, 4, 6, 9, 12, …}tenga más información útil. Y esto es A003622 .

A003622 se puede definir como "posiciones de 1 en A003849 ", que es exactamente lo que necesitamos descifrar aquí. Y A003849 se define como " A003714 mod 2", donde A003714 son simplemente todos los enteros que x & (2*x) == 0. Así tenemos la solución.

OEIS rox.

kennytm
fuente
realmente impresionante - nunca dejo de sorprenderme por los usuarios de este sitio
tucuxi
4

Dyalog APL, Dennis, ≤4

*⍨⍟8

Calcula ln (8) ^ ln (8). ¿StackExchange dejaría de convertir mis respuestas? Escribiré un montón de cosas aquí para que no se convierta en un comentario.

Lynn
fuente
Tenía 8*⍟⍟8pero no sabía sobre . Buen trabajo :)
Sp3000
3

Pegado, @quartata, ≤8

El siguiente programa Pyth :

^33 9

produce la salida deseada

46411484401953

Método de craqueo: busqué el número en Google.

lirtosiast
fuente
3

Pyth, xnor, ≤ 4

C`CG

CG(convertir la cadena "abc...z"del alfabeto de la base 256) es la forma típica de Pyth de generar un número realmente grande. Después de eso es solo stringify y convertir de base nuevamente.

Sp3000
fuente
3

Python 3, Mego, ≤128

(Utilizando Python 3.5.0, no probado en versiones anteriores. 105 98 bytes.)

import sys
a=sys.stdout
sys.stdout=None
from this import*
a.write(s.translate(s.maketrans(d))[4:])
kennytm
fuente
¡Muy bien! Lo hice en 94, vea a mi policía publicar el código.
Mego
3

Matlab / Octave, Wauzl, ≤16

"234"'*"567"

Usando la misma idea que la respuesta de Tom Carpenter

(Si no funcionó, intente esto :)

[50;51;52]*'567'
kennytm
fuente
@NaN Ver actualización. Ambos son ≤16 bytes y funcionan en ideone.
kennytm
Agradable. Tenía (1*'234')'*'567'en mente, porque tu primera respuesta no funciona en Matlab.
Wauzl