คำเตือน : โปรแกรมเหล่านี้เป็นระเบิดโคลน (รูปแบบของการทิ้งระเบิดแบบอันตรายน้อย แต่ยังคงอันตราย); เป็นเช่นนี้ไม่ได้ทำงานกับพวกเขาในระบบการผลิตโดยไม่ต้อง Sandboxing หรือข้อ จำกัด ของทรัพยากร Clone bombs สร้างเธรดในลูป (ตรงข้ามกับ fork bombs, ซึ่งสร้างโพรเซสในลูป), ดังนั้นคุณสามารถหยุดพวกมันได้ง่ายๆโดยการฆ่าโพรเซสที่มีปัญหา (ทำให้พวกมันอันตรายน้อยกว่า fork fork) กำจัด); แต่พวกเขาจะผูก CPU ส่วนใหญ่ของคุณจนกว่าคุณจะจัดการทำเช่นนั้น (หรือจนกว่าโปรแกรมจะชนะและออกตามธรรมชาติด้วยตัวเอง) การขอให้ระบบปฏิบัติการของคุณ จำกัด จำนวนหน่วยความจำและเวลา CPU ที่โปรแกรมเหล่านี้อนุญาตให้ใช้ควรสร้างสภาพแวดล้อมที่ปลอดภัยสำหรับการทดสอบ
Java (OpenJDK 8) , 65 60 ไบต์ (โดยมีการดัดแปลงเล็กน้อยกับ wrapper)
Thread x=Thread.currentThread();new Thread(x::stop).start();
ลองออนไลน์!
ต้องใช้ทั้งกรณีของในคำถามที่จะเปลี่ยนไปcatch (Exception …)
catch (Throwable …)
ในทางทฤษฎีแล้วควรมีความปลอดภัยมากขึ้นไม่น้อยไปกว่านี้ แต่จะช่วยให้การแก้ปัญหานี้เป็นไปได้
ฉันบันทึก 5 ไบต์ในเวอร์ชันแรกของคำตอบนี้โดยใช้การอ้างอิงเมธอดมากกว่าแลมบ์ดา
Java 4, 104 ไบต์ (ไม่ได้ทดสอบควรทำงานกับ wrapper ต้นฉบับ)
final Thread x=Thread.currentThread();new Thread(){public void run(){x.stop(new Exception());}}.start();
ลองออนไลน์! (ลิงก์ไปที่การนำไปใช้ของ Java 8 ดังนั้นจะไม่ทำงาน)
การใช้คุณสมบัติที่ได้ถูกลบออกจากรุ่นที่ทันสมัยของ Java Exception
ก็เป็นไปได้ในการแก้แม้กระทั่งรุ่นของปริศนาที่ต้องใช้นั้น น่าจะเป็นอย่างน้อย (ตอนนี้ Java 4 นั้นเก่ามากและฉันจำไม่ได้ว่าฟีเจอร์ใดที่มันทำและไม่มีในขณะที่สามารถเห็นได้ว่ามีฟีเจอร์ใน Java จำนวนน้อยกว่ามากในตอนนั้น lambdas ดังนั้นฉันต้องสร้างชั้นใน)
คำอธิบาย
โซลูชันส่วนใหญ่สำหรับคำถามนี้อยู่ใน C # (ร่วมกับโซลูชัน Java ที่โกงผ่านการใช้วงเล็บเหลี่ยมที่ไม่สมดุลเป็นรูปแบบการฉีดโค้ดและโซลูชัน Perl ซึ่งไม่ได้อยู่ใน Java ด้วย) ดังนั้นฉันคิดว่ามันจะคุ้มค่าที่จะลองดูว่าปริศนานี้สามารถแก้ไขได้ "ถูกต้อง" ใน Java เช่นกัน
โปรแกรมทั้งสองเหมือนกันอย่างมีประสิทธิภาพ (ดังนั้นความจริงที่ว่าโปรแกรมแรกทำงานให้ฉันมั่นใจสูงว่าโปรแกรมที่สองจะทำงานเกินไปเว้นแต่ฉันจะใช้คุณสมบัติที่ไม่ใช่ Java-4 โดยไม่ตั้งใจThread#stop
ถูกเลิกใช้ใน Java 5)
ของ Java Thread#stop
วิธีการใช้งานได้เบื้องหลังโดยทำให้โยนเข้าไปในกระทู้ที่มีปัญหาได้ การโยนได้เพื่อจุดประสงค์คือThreadDeath
( Error
โดยเฉพาะเนื่องจากคนมักจะพยายามยกเว้นข้อผิดพลาดและนักออกแบบของ Java ไม่ต้องการให้เกิดขึ้น) แม้ว่ามันจะช่วยให้คุณสามารถโยนอะไรก็ได้ (หรือคุ้นเคยกับบางจุดหลังจาก API เป็น ออกแบบโดยนักออกแบบของจาวาตระหนักว่านี่เป็นความคิดที่ไม่ดีอย่างไม่น่าเชื่อและลบวิธีการในการโต้แย้งออกทันที แน่นอนว่าแม้กระทั่งเวอร์ชั่นที่ThreadDeath
มีการดำเนินการที่ค่อนข้างเสี่ยงซึ่งคุณสามารถรับประกันได้เล็กน้อย (ตัวอย่างเช่นมันช่วยให้คุณสามารถไขปริศนานี้ได้ซึ่งเป็นสิ่งที่ "ไม่ควร" เป็นไปได้) ดังนั้นคุณจึงไม่ควร ใช้มัน แต่ใน Java 8 มันยังใช้งานได้
โปรแกรมนี้ทำงานโดยการวางไข่เธรดใหม่และขอให้บังคับให้โยนข้อยกเว้นกลับเข้าไปในเธรดหลัก หากเราโชคดีมันจะทำอย่างนั้นในช่วงเวลาที่เราอยู่นอกcatch
บล็อกด้านใน(เราไม่สามารถหลบหนีcatch
บล็อกด้านนอกได้จนกว่าโปรแกรมจะจบลงเพราะมีลูปอยู่รอบ ๆ ) เนื่องจากเราได้เพิ่มการวนซ้ำอย่างสะดวกแล้วจึงเป็นการประหยัดแบบไบต์โดยใช้การวนซ้ำนั้นเพื่อให้เราสามารถสร้างเธรดได้โดยหวังว่าหนึ่งในนั้นจะเข้าจังหวะที่ถูกต้องในที่สุด โดยปกติดูเหมือนว่าจะเกิดขึ้นภายในไม่กี่วินาที
(หมายเหตุ TIO: เวอร์ชันปัจจุบันของ TIO ค่อนข้างมีแนวโน้มที่จะฆ่าโปรแกรมนี้ในช่วงต้นของการดำเนินการสันนิษฐานว่าเป็นเพราะกระทู้ทั้งหมดที่ถูกสร้างขึ้นมันสามารถทำงานกับ TIO แต่ไม่ได้ทำงานได้อย่างน่าเชื่อถือดังนั้นมักจะต้องพยายามสองสามครั้ง รับผลลัพธ์ "คุณชนะ!")