Uyarı : Bu programlar klon bombalarıdır (bir çeşit daha az tehlikeli ama yine de tehlikeli bir çatal bomba şekli); bu nedenle, bunları korumalı alan veya kaynak sınırları olmadan bir üretim sisteminde çalıştırmayın . Klon bombaları bir döngüde iplikler oluşturur (bir döngüde süreçler oluşturan çatal bombalarının aksine), böylece söz konusu işlemi öldürerek (onları çok zor olabilecek çatal bombalarından çok daha az tehlikeli hale getirerek) durdurabilirsiniz. temizle); ancak siz bunu yapmayı başarana kadar (veya program kendi kendine kazanıp çıkana kadar) işlemcinizin çoğunu bağlarlar. İşletim sisteminizden, bu programların kullanmasına izin verilen bellek ve CPU süresine sınır koymasını istemek, bunları test etmek için güvenli bir ortam oluşturmalıdır.
Java (OpenJDK 8) , 65 60 bayt (paketleyicide küçük bir değişiklikle)
Thread x=Thread.currentThread();new Thread(x::stop).start();
Çevrimiçi deneyin!
catch (Exception …)
Sorunun her iki örneğinin de değiştirilmesini gerektirir catch (Throwable …)
. Bu teorik olarak daha az değil daha güvenli olmalıdır , ancak bu çözümün mümkün olmasını sağlar.
Lambda yerine yöntem referansı kullanarak bu cevabın ilk versiyonu üzerine 5 bayt kazandım.
Java 4, 104 bayt (denenmemiş, orijinal sarıcı ile çalışmalıdır)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
Çevrimiçi deneyin! (bağlantı bir Java 8 uygulamasına gider, bu nedenle çalışmaz)
Java'nın modern sürümlerinden kaldırılan özellikleri kullanarak, bulmacanın gerektiren bir sürümünü bile çözmek mümkündür Exception
. Muhtemelen, en azından. (Java 4 şimdiye kadar çok eskidir ve hangi özellikleri içerdiğini ve içermediğini hatırlayamıyorum. Görüldüğü gibi Java'da çok daha az özellik vardı ve bu yüzden daha ayrıntılıydı; lambdas, bu yüzden bir iç sınıf yaratmak zorunda kaldım.)
açıklamalar
Bu sorunun çözümlerinin çoğu C # (bir kod enjeksiyon biçimi olarak dengesiz köşeli parantez kullanarak hile yapan bir Java çözümü ve Java'da olmayan bir Perl çözümü ile birlikte). Bu yüzden bu bulmacanın Java'da da "düzgün" olarak nasıl çözülebileceğini göstermeye değer olacağını düşündüm.
Her iki program da etkili bir şekilde aynıdır (bu nedenle, ilk programın işe yaraması gerçeği, yanlışlıkla Java-4 olmayan bir özellik kullanmadıkça ikinci programın da işe yarayacağına dair yüksek güven veriyor; Thread#stop
Java 5'te kullanımdan kaldırıldı).
Java'nın Thread#stop
yöntemi, sahnenin arkasında, atılabilir bir parçanın söz konusu konuya atılmasına neden olarak çalışır. Bu amaca yönelik atılabilir ThreadDeath
(bir Error
, özellikle insanlar genellikle istisnaları batırmaya çalıştığı ve Java tasarımcıları bunu olmasını istemediği için), ancak herhangi bir şey atmanıza izin verir (veya alışkın; API'den sonra bir noktada) Java'nın tasarımcıları bunun inanılmaz derecede kötü bir fikir olduğunu fark etti ve argümanları doğrudan alan yöntemin sürümünü kaldırdı). Tabii ki, fırlatan sürüm bile, ThreadDeath
birkaç garanti verebileceğiniz oldukça riskli bir işlemdir (örneğin, bu bulmacayı çözmenize izin verir, "mümkün olmaması gereken" bir şey), kullanın, ancak Java 8'den itibaren hala çalışıyor.
Bu program yeni bir iş parçacığı oluşturarak ve ana iş parçasına zorla bir istisna atmasını isteyerek çalışır. Eğer şanslıysak, bunu iç catch
bloğun dışında olduğumuz bir zamanda yapacağız ( catch
program bitene kadar dış bloktan kaçamayız , çünkü etrafında bir döngü var). Döngüyü zaten uygun bir şekilde eklediğimiz için, bir tanesi sonunda doğru zamanlamaya ulaşacağını umarak, iş parçacıkları oluşturmaya devam etmemize izin vermek için bu döngüyü kullanmak bayt tasarrufu sağlıyor. Bu normalde birkaç saniye içinde gerçekleşir.
(TIO notu: TIO'nun mevcut sürümü, muhtemelen tüm oluşturulan iş parçacıkları nedeniyle, bu programı yürütüldüğünde erken öldürmeye eğilimlidir. TIO üzerinde çalışabilir, ancak güvenilir bir şekilde çalışmaz, bu nedenle genellikle "Sen kazandın!" çıktısını al.)