Advertencia : estos programas son bombas clónicas (una especie de forma de bomba tenedor menos peligrosa pero aún peligrosa); como tal, no los ejecute en un sistema de producción sin sandboxing o límites de recursos . Las bombas clónicas crean hilos en un bucle (a diferencia de las bombas de horquilla, que crean procesos en un bucle), por lo que puede detenerlas simplemente matando el proceso en cuestión (haciéndolas mucho menos peligrosas que las bombas de horquilla, lo que puede ser muy difícil de manejar). aclarar); pero probablemente atarán la mayor parte de su CPU hasta que logre hacerlo (o hasta que el programa gane y salga naturalmente por sí mismo). Pedirle a su sistema operativo que establezca límites en la cantidad de memoria y tiempo de CPU que estos programas pueden usar debería crear un entorno seguro en el que probarlos.
Java (OpenJDK 8) , 65 60 bytes (con una ligera modificación en el contenedor)
Thread x=Thread.currentThread();new Thread(x::stop).start();
Pruébalo en línea!
Requiere que ambas instancias de catch (Exception …)
la pregunta se cambien a catch (Throwable …)
. En teoría, esto debería ser más seguro, no menos, pero permite que esta solución sea posible.
Ahorré 5 bytes en la primera versión de esta respuesta mediante el uso de una referencia de método en lugar de una lambda.
Java 4, 104 bytes (no probado, debería funcionar con el contenedor original)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
Pruébalo en línea! (el enlace va a una implementación de Java 8, por lo tanto no funcionará)
Usando características que se han eliminado de las versiones modernas de Java, es posible resolver incluso la versión del rompecabezas que requiere un Exception
. Probablemente, al menos. (Java 4 es muy antiguo por ahora y no puedo recordar qué características tenía y no contenía. Como se puede ver, había muchas menos características en Java en ese momento y, por lo tanto, era más detallado; no teníamos lambdas, así que tuve que crear una clase interna).
Explicaciones
La mayoría de las soluciones a esta pregunta están en C # (junto con una solución Java que engaña mediante el uso de corchetes desequilibrados como una forma de inyección de código, y una solución Perl que tampoco está en Java). Así que pensé que valdría la pena intentar mostrar cómo este rompecabezas también se puede resolver "correctamente" en Java.
Ambos programas son efectivamente idénticos (por lo tanto, el hecho de que el primer programa funcione me da mucha confianza en que el segundo programa también funcionaría, a menos que accidentalmente haya usado una característica que no sea Java-4; Thread#stop
fue desaprobada en Java 5).
El Thread#stop
método de Java funciona, detrás de escena, al hacer que se arroje un elemento arrojable al hilo en cuestión. Lo que se puede usar para ese propósito es ThreadDeath
(y Error
, específicamente, porque la gente a menudo trata de ocultar las excepciones y los diseñadores de Java no querían que eso sucediera), aunque le permite lanzar cualquier cosa (o solía hacerlo; en algún momento después de que la API fue diseñado, los diseñadores de Java se dieron cuenta de que esta era una idea increíblemente mala y eliminaron la versión del método que toma los argumentos directamente). Por supuesto, incluso la versión que arroja ThreadDeath
es una operación bastante arriesgada sobre la que puede hacer pocas garantías (por ejemplo, le permite resolver este rompecabezas, algo que "no debería" ser posible), por lo que no debe hacerlo úsalo, pero a partir de Java 8, todavía funciona.
Este programa funciona generando un nuevo hilo y pidiéndole que arroje una excepción al hilo principal. Si tenemos suerte, lo hará en un momento dado cuando estemos fuera del catch
bloque interno (no podemos escapar del catch
bloque externo hasta que finalice el programa, porque hay un bucle a su alrededor). Debido a que ya tenemos el bucle convenientemente agregado, es un ahorro de bytes simplemente usar ese bucle para permitirnos seguir creando subprocesos, con la esperanza de que uno de ellos finalmente llegue al momento correcto. Esto normalmente parece suceder en un par de segundos.
(Nota de TIO: la versión actual de TIO está bastante inclinada a matar este programa al principio de su ejecución, presumiblemente debido a todos los hilos que se están creando. Puede funcionar en TIO, pero no funciona de manera confiable, por lo que a menudo se requieren algunos intentos para obtén la salida "¡Ganaste!")