Ostrzeżenie : te programy to bomby klonujące (rodzaj mniej niebezpiecznej, ale wciąż niebezpiecznej formy bomby widelcowej); jako takie nie uruchamiaj ich w systemie produkcyjnym bez piaskownicy lub limitów zasobów . Klonowane bomby tworzą nici w pętli (w przeciwieństwie do bomb rozwidlających, które tworzą procesy w pętli), dlatego możesz je zatrzymać, po prostu zabijając dany proces (czyniąc je znacznie mniej niebezpiecznymi niż bomby widelcowe, co może być bardzo trudne oczyścić); ale najprawdopodobniej będą wiązać większość procesora, dopóki tego nie zrobisz (lub dopóki program nie wygra i nie wyłączy się sam). Poproszenie systemu operacyjnego o ograniczenie ilości pamięci i czasu procesora, z których te programy mogą korzystać, powinno stworzyć bezpieczne środowisko do ich testowania.
Java (OpenJDK 8) , 65 60 bajtów (z niewielką modyfikacją opakowania)
Thread x=Thread.currentThread();new Thread(x::stop).start();
Wypróbuj online!
Wymaga zmiany obu wystąpień catch (Exception …)
pytania catch (Throwable …)
. Teoretycznie powinno to być bardziej bezpieczne, nie mniej, ale umożliwia to rozwiązanie.
Zapisałem 5 bajtów w pierwszej wersji tej odpowiedzi, używając odwołania do metody zamiast lambda.
Java 4, 104 bajty (nieprzetestowane, powinien działać z oryginalnym opakowaniem)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
Wypróbuj online! (link prowadzi do implementacji Java 8, więc nie będzie działać)
Korzystając z funkcji, które zostały usunięte z nowoczesnych wersji Javy, możliwe jest rozwiązanie nawet wersji układanki, która wymaga Exception
. Prawdopodobnie przynajmniej. (Java 4 jest już bardzo stara i nie pamiętam, jakie funkcje ona zawierała, a których nie zawierała. Jak widać, w Javie było wtedy o wiele mniej funkcji i dlatego była bardziej szczegółowa; nie mieliśmy lambdas, więc musiałem stworzyć wewnętrzną klasę.)
Objaśnienia
Większość rozwiązań tego pytania jest w języku C # (wraz z rozwiązaniem Java, które oszukuje za pomocą niezrównoważonych nawiasów jako formy wstrzykiwania kodu, oraz rozwiązaniem Perla, które również nie jest w Javie). Pomyślałem więc, że warto spróbować pokazać, jak tę zagadkę można rozwiązać „poprawnie” również w Javie.
Oba programy są w rzeczywistości identyczne (stąd fakt, że pierwszy program działa, daje mi dużą pewność, że drugi program również zadziała, chyba że przypadkowo użyłem funkcji innej niż Java-4; Thread#stop
został wycofany w Javie 5).
Thread#stop
Metoda Javy działa za kulisami, powodując wrzucenie rzucanego przedmiotu do wątku. Rzucanie przeznaczone do tego celu jest ThreadDeath
( Error
szczególnie dlatego, że ludzie często próbują uchwycić wyjątki, a projektanci Javy nie chcieli, aby tak się działo), chociaż pozwala to na rzucanie czegokolwiek (lub przywykło; w pewnym momencie po API był zaprojektowane, projektanci Javy zdali sobie sprawę, że był to niesamowicie zły pomysł i usunęli wersję metody, która przyjmuje argumenty wprost). Oczywiście nawet wersja, która rzuca, ThreadDeath
jest dość ryzykowną operacją, na którą możesz zrobić kilka gwarancji (na przykład pozwala rozwiązać tę zagadkę, co „nie powinno być możliwe”), więc nie powinieneś użyj go, ale od wersji Java 8 nadal działa.
Ten program działa, odradzając nowy wątek i prosząc go, aby siłą wrzucił wyjątek z powrotem do głównego wątku. Jeśli będziemy mieli szczęście, zrobimy to w momencie, gdy znajdziemy się poza catch
blokiem wewnętrznym (nie możemy uciec z catch
bloku zewnętrznego , dopóki program się nie skończy, ponieważ wokół niego jest pętla). Ponieważ pętla została już dogodnie dodana, oszczędzanie bajtów polega na zwykłym użyciu tej pętli, aby umożliwić nam tworzenie wątków w nadziei, że jeden z nich ostatecznie osiągnie właściwy czas. Wydaje się, że dzieje się to zwykle w ciągu kilku sekund.
(Uwaga TIO: obecna wersja TIO jest skłonna zabić ten program na wczesnym etapie jego wykonywania, prawdopodobnie ze względu na wszystkie tworzone wątki. Może działać na TIO, ale nie działa niezawodnie, więc często potrzeba kilku prób, aby uzyskać wynik „Wygrałeś!”).