¿Se detendrá? (Ladrones)


46

Este es el hilo de los ladrones. El hilo de la policía está aquí .

Su desafío es descifrar el envío de un policía al encontrar una entrada que lo detenga. No tiene que averiguar por qué, o todas las entradas que hacen que se detenga si hay más de una, o la entrada que pretendía el policía, solo una entrada servirá.

Una vez que haya descifrado un envío, publique un enlace en un comentario o edítelo en la publicación del policía. También puede marcar su envío para un mod para editarlo en la publicación del policía. Además, publique la entrada utilizada y un enlace a la publicación del policía en una respuesta en este hilo. El ladrón que descifra la mayor cantidad de envíos gana.

Varias personas pueden publicar grietas en el mismo envío de policía, siempre que sean diferentes.

(Si SE convirtió su respuesta duplicada en un comentario, puede votar esta solicitud de función )


¿Está buscando presentaciones sin descifrar?

fetch("https://api.stackexchange.com/2.2/questions/135363/answers?order=desc&sort=activity&site=codegolf&filter=!.Fjs-H6J36vlFcdkRGfButLhYEngU&key=kAc8QIHB*IqJDUFcjEF1KA((&pagesize=100").then(x=>x.json()).then(data=>{var res = data.items.filter(i=>!i.body_markdown.toLowerCase().includes("cracked")).map(x=>{const matched = /^ ?##? ?(?:(?:(?:\[|<a href ?= ?".*?">)([^\]]+)(?:\]|<\/a>)(?:[\(\[][a-z0-9/:\.]+[\]\)])?)|([^, ]+)).*[^\d](\d+) ?\[?(?:(?:byte|block|codel)s?)(?:\](?:\(.+\))?)? ?(?:\(?(?!no[nt][ -]competing)\)?)?/gim.exec(x.body_markdown);if(!matched){return;}return {link: x.link, lang: matched[1] || matched[2], owner: x.owner}}).filter(Boolean).forEach(ans=>{var tr = document.createElement("tr");var add = (lang, link)=>{var td = document.createElement("td");var a = document.createElement("a");a.innerText = lang;a.href = link;td.appendChild(a);tr.appendChild(td);};add(ans.lang, ans.link);add(ans.owner.display_name, ans.owner.link);document.querySelector("tbody").appendChild(tr);});});
<html><body><h1>Uncracked Submissions</h1><table><thead><tr><th>Language</th><th>Author</th></tr></thead><tbody></tbody></table></body></html>


2
¿Significa diferentes entradas diferentes (digamos, todas las entradas que terminan en 2 descifran la publicación del policía, ¿pueden diferentes personas publicar diferentes números que terminan en 2?) O diferentes familias de entradas, o diferentes tipos de entradas?
Stephen

1
Varias personas pueden publicar grietas en el mismo envío de policía ... Defina diferente .
Dennis

Respuestas:


49

Malbolge, pomo de la puerta

Pruébelo en línea (¡Gracias Dennis !)

Entrada para Windows: F_⌠1234567890

Entrada en un sistema basado en Linux usando ISO-8559-1: F_ô1234567890

El núcleo de cómo funcionaba el programa Malbolge es que dependía de un comportamiento del intérprete Malbolge que causa un bucle infinito si encuentra alguna instrucción que no esté entre 33 y 126. El programa fue construido de tal manera que su entrada le permitiría modificar Una sola instrucción.

Modifiqué el intérprete para volcar el estado de la memoria del programa al comienzo de la ejecución y también para producir código fuente 'normalizado' que toma la forma de una lista de códigos operativos que se ejecutarán durante la ejecución del programa. Con esa información, podría (lentamente) determinar que, aunque el programa tomó 13 entradas, solo la primera y la tercera entradas realmente importaron.

Mirando el código normalizado y el volcado de memoria (y un toque de ayuda del depurador) ideé lo siguiente:

a = op (entrada 1, 29524)

b = op (entrada 3, a)

c = op (486, b)

d = op (c, 37)

e = d / 4 + d% 3 * 3 ^ 9

e debe estar entre 33 y 126

¿Dónde opestá el llamado tritwise "op" que se describe en la especificación? Con esta información, puede escribir un programa simple que repita las posibles entradas (0 a 255) y encuentre todas las soluciones que cumplan con los criterios anteriores. Encontré 2219 posibles soluciones, algunas de las cuales probablemente no serán soluciones de trabajo (no puede ingresar los caracteres requeridos). Específicamente, las entradas anteriores se basan en la solución:

(Input 1 = 70, Input 3 = 244)


No tengo el representante para comentar en la publicación de la policía. ¿Alguien podría hacer eso por mí?
KBRON111

44
Bienvenido a PPCG! ¡Buen trabajo! Creo que con esta grieta, pronto tendrás suficiente representante :)
Stephen

1
Comenté al otro lado. Y sí, excelente trabajo; ¡Casi esperaba que Malbolge durara la semana!
Veedrac

66
¡Buen trabajo! TIO usa UTF-8, pero al envolverlo en Bash, su crack aún se puede verificar. tio.run/… Parece que no necesitas nada más que F_ôpor cierto.
Dennis

1
Ahora puedo dormir de nuevo
Juan Tonina


13

JS (ES6), Juan Tonina

+0,-0

Tomó un poco de mirar Object.ispara encontrar. Básicamente, +0 === -0ya que los ===comprueba como números, y 0es finito, pero Object.isve +0y -0como objetos diferentes. Policía muy inteligente :)

Pruébalo en línea!


Ninja lo consiguió mientras estaba iniciando sesión. Dispara.
user3033745

Maldición, resuelto más rápido que el tiempo que pasé pensando en el código: D
Juan Tonina

11

Python, Siphor

class A:
    i = True
    def __eq__(self, a):
        self.i = not self.i
        return self.i

a = A()
f(a)

Simplemente redefinimos la igualdad para que se comporte exactamente como se requiere para que el programa finalice.


Aunque supongo que podría haber definido __eq__que raise...
g.rocket

Estaba a punto de presentarme con solo regresar 0: p
Jonathan Allan

@JonathanAllan ¿Cómo funciona eso?
g.rocket

1
Bastante seguro solo class A:__eq__=lambda s,o:0y f(A())hace el trabajo.
Jonathan Allan

1
Ah, sí, necesito la negación> _ <
Jonathan Allan


8

PHP, Sísifo

(-0[0)> deal with it=1

La función parse_str cambia los espacios y otros caracteres a guiones bajos. Si coloca un [usado para delimitador de matriz sin cerrar, lo cambia a un guión bajo pero tiene el efecto de no traducir los siguientes espacios (no sé por qué).

Pruébalo en línea!


WTF ?! Eso es una locura ...
Veedrac

7

JavaScript (Node.js), Adnan

[]y []parece funcionar Probé un montón de ellos null, incluyendo undefined, NaN...

[] >= [] && [] <= [] && [] != [] se evalúa como verdadero

Moraleja de la historia: JavaScript es raro .

Pruébalo en línea!


Sí, las matrices son solo objetos.
programmer5000

Y los objetos se convierten en cadenas para este tipo de comparaciones.
Conor O'Brien

7

JavaScript (ES7), Arnauld

Estándar

"8e7" es la solución

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = "8e7"

crack_me(key)
console.log("stopped :)")

Cortar a tajos

No es necesario calcular este número, podemos redefinir la lengthpropiedad

Esto se establece ~x/x.length**3!=-2962963enfalse

var crack_me = (x=0)=>{for(;~x/x.length**3!=-2962963;);}

var key = {toString:()=>"2962962",length:"1"}

crack_me(key)
console.log("stopped :)")

Prioridad de los operadores

~ bit a bit no es el primero

** exponentiation segundo

/ division tercero


6

Bash, Veedrac

LD_TRACE_LOADED_OBJECTS

Pruébalo en línea!

Desde la página del ld.so(8)manual:

LD_TRACE_LOADED_OBJECTS

Si se establece (a cualquier valor), hace que el programa enumere sus dependencias dinámicas, como si se ejecutara ldd(1), en lugar de ejecutarse normalmente.


¡Pensé que esto duraría más! Excelente trabajo.
Veedrac

1
@Veedrac: Supongo que dado que especificó bash, es poco probable que encuentre un enlace estático (por ejemplo, busybox?) /bin/yes, Pero eso es posible, en cuyo caso se ignoraría este entorno.
Peter Cordes

6

Mathematica, JungHwan Min

Unevaluated@Throw@"hammertime"

No tengo ni idea de si esta es la solución prevista, pero pasa una expresión que no se evalúa hasta que se hace referencia a ella como #dentro de la función, lo que hará que vuelva inmediatamente de la función sin realizar ninguna evaluación adicional. Puede ver que la función se llama realmente (en lugar de simplemente lanzar la excepción incluso antes de invocar la función) cambiando la función a:

#0[Print@"stop";#;$IterationLimit=∞]&

Lo que efectivamente imprimirá stopantes de lanzar el error.


¡Bingo! (En realidad iba por Unevaluated[Abort[]], pero lo mismo.)
JungHwan Min


5

Rubí

exit

Sin nueva línea. 3.send('exit')seguramente no es igual a 5, pero ejecuta Kernel#exit:

Inicia la terminación de la secuencia de comandos Ruby al generar la excepción SystemExit

Es posible llamar exitel 3 porque :

El módulo Kernel está incluido por la clase Object, por lo que sus métodos están disponibles en cada objeto Ruby [como métodos privados].

abort también funciona:

Termine la ejecución inmediatamente, efectivamente llamando a Kernel.exit (falso). Si se proporciona msg, se escribe en STDERR antes de finalizar.


5

JavaScript (Node.js) , programador 5000

Ya está roto, pero el mío es ligeramente diferente :) No tengo suficiente representante para comentar en la policía. También siéntase libre de editar para corregir el formato, mi primera publicación aquí.

Principalmente pongo __proto__igual a una función que arroja. Tomado de mirar la página de Mozilla para proto. (Lo siento, baja representación, no puedo publicar un enlace).

x = {}
let No = function () { throw 'halted' }
x.__proto__ = new No()
f = x=>{while(x.__proto__);}

Pruébalo en línea!

EDITAR: Tengo un representante, así que aquí está el enlace: Mozilla__proto__


Comenté sobre el policía por ti.
Stephen

1
¡Gracias! También gracias a todos por los ups, supongo que puedo comentar ahora!
Haumed Rahmani

1
Bienvenido a PPCG: D
Conor O'Brien


5

R, Jarko Dubbeldam

function(x)if(is.list(x))return(1)

La primera vez que contribuyes con algo, así que menciona cualquier error que haya cometido en el formato.

Estoy bastante seguro de que esto es válido. Solo una nueva versión de is.list (), ¿verdad?


Por cierto, no tengo el representante para comentar sobre el original, por lo que agradecería una mano si es válida.
CriminallyVulgar

Comentado por ti.
TheLethalCoder

No es la solución prevista, pero funciona. Buen trabajo.
JAD

5

Javascript, programador 5000

Longitud máxima de la cuerda

Utiliza una cadena con una longitud inferior a la que admite su motor. Al agregar "h"a esta cadena, se genera un error. Pruébalo en línea!

function getAlmostMaxLenStr() {
  var prevBases = [];
  var base = "a";
  try {
    while(true) {
      prevBases.push(base);
      base += base;
    }
  } catch(e) {}
  for (var i = prevBases.length-1; i>=0; --i) {
    try {
      base += prevBases[i];
    } catch (e) {}
  }
  return base;
}
f(getAlmostMaxLenStr());

Bloque de origen cruzado

Muy inspirado por la respuesta de @ jadkik94 , pero funciona en todas partes. Crea un iframe de origen cruzado, luego pasa el .contentWindowde dicho iframe. Esto falla cuando la función intenta usar el valor debido a la seguridad de origen cruzado.

let f=x=>{
  try {
    console.log(x+"h"); // we don't want to lock up your browser, do we ;)
  } catch (e) { console.log("Halted!\n",e); }
}
let iframe=document.createElement("iframe");
const url = location.host.indexOf("google") === -1 ? "https://google.com" : "https://stackexchange.com";
iframe.src=url;
iframe.onload=a=>f(iframe.contentWindow);
document.body.appendChild(iframe);

Valor primitivo

Variante de las .toString()respuestas: esto solo se usa en su toPrimitivelugar. Devuelve un objeto como valor primitivo, que Javascript no sabe cómo manejar (por lo que arroja un error). Pruébalo en línea!

f({
  [Symbol.toPrimitive](){return {}}
});

Buen trabajo, pero aún no es la solución prevista! ¡Muy inteligente!
programmer5000

4

Node.js, Adnan

{}y / {}o cualquier 2 objetos son las dos entradas. Ni siquiera entiendo cómo funciona esto.

Aquí está la increíble lógica de comparación de objetos de JS:

console.log({} == {});
console.log({} === {});
console.log({} > {});
console.log({} < {});
console.log(!!{});

console.log({} >= {});
console.log({} <= {});


Sí, esa era la solución prevista :)
Adnan


4

Javascript (NO node.js) , programador 5000

Esto no se puede agregar porque crea un objeto que no tiene toString porque un nuevo Setno tiene prototipos inherentes Object.

entrada:

new Set()

Pruébalo en línea!


Esta fue probablemente la solución prevista, de ahora en adelante lo guardaré en la bolsa de mi cabeza: P
Stephen

Lo siento, esto no parece funcionar para mí. Pruébalo en línea!
Haumed Rahmani

@HaumedRahmani agregó un botón de prueba en línea. Solía ​​mono araña, no babel.
Grant Davis

No es la solución prevista, ¡pero buen trabajo!
programmer5000



4

Python 2, Foon

__import__("os")._exit(0)

Lo que dice en la lata, básicamente.

Pruébalo en línea.


Curiosamente, en TIO este tiempo de espera para mí; bajo Windows (específicamente con winpty python inputbad.py y pegando en la línea), sale como se desea ... y sí, no es sorprendente que mi schtict explotara el bit "input under Python 2 eval eval under the hood"
Foon

@Foon Hmm, está funcionando bien en TIO para mí. Ver enlace en respuesta.
Veedrac

Extraño ... Debo haber presionado play y luego escribí la entrada en mi enlace TIO y no me di cuenta
Foon

Estoy bastante seguro de que esto grietas cada presentación pitón ..
enderland

@enderland Solo si evalúan su aporte, que la mayoría de ellos no.
Veedrac


4

Python 3, Siphor

Esto fue divertido. Necesitamos pasar el type(x) != strcheque, por lo que necesitamos controlar el valor de retorno de type(). Tenemos que anular el __class__atributo y reemplazarlo con un objeto personalizado, que se extienda type, que tiene el __ne__método reemplazado por uno que siempre devuelve falso. Esto hace que pase la verificación de tipo, pero la búsqueda fallará porque ono es un str.

class m(type):
    def __ne__(a,b):
        return False
class c:pass
o=c()
o.__class__=m("",(c,),{})
f(o)

Bienvenido al sitio! :)
DJMcMayhem

4

C #, TheLethalCoder

System.Nullable`1[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]

O cualquier otra clase anulable.



3

JS (ES6)

"   "

Cualquier personaje con un código menor que 10 debería funcionar; He usado un tabpersonaje arriba, que SE convierte en espacios.



Lo sentimos :( además, creo que necesitarías citas a su alrededor para que sea una cadena
Stephen

@ programmer5000, así que veo :(
Shaggy

No hay problema, @StepHen; Naturaleza del juego. Tomé las citas como implícitas, pero las editaré.
Shaggy

@Shaggy No sé cuál es el fallo, pero f(<tab>)es una sintaxis válida (entrada vacía) y tendríamos que diferenciar entre f(1)y de f("1")todos modos
Stephen



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.