เป้าหมายของการท้าทายนี้คือการส่งออก (ในที่สุด) ทุกโปรแกรมการหยุดชะงักที่เป็นไปได้ในภาษาที่คุณเลือก ในตอนแรกสิ่งนี้อาจฟังดูเป็นไปไม่ได้ แต่คุณสามารถทำสิ่งนี้ได้ด้วยตัวเลือกการสั่งการอย่างระมัดระวัง
ด้านล่างเป็นแผนภาพ ASCII เพื่อแสดงให้เห็นถึงสิ่งนี้ ให้คอลัมน์แสดงหมายเลขของทุกโปรแกรมที่เป็นไปได้ (แต่ละโปรแกรมเป็นจำนวน จำกัด ของสัญลักษณ์จากตัวอักษร จำกัด ) ให้แต่ละแถวแสดงถึงขั้นตอนเอกพจน์ในการดำเนินการของโปรแกรมนั้น การX
แทนการดำเนินการที่กระทำโดยโปรแกรมนั้นในขั้นตอนนั้น
step# p1 p2 p3 p4 p5 p6
1 X X X X X X
2 X X X X X
3 X X X X
4 X X X X
5 X X X
6 X X
7 X X
8 X X
9 X X
∞ X X
อย่างที่คุณบอกโปรแกรม 2 และ 4 ไม่หยุด หากคุณต้องดำเนินการครั้งละหนึ่งครั้งคอนโทรลเลอร์ของคุณจะติดอยู่ในลูปไม่สิ้นสุดนั่นคือโปรแกรม 2 และไม่เคยออกโปรแกรม 3 และอื่น ๆ
คุณใช้วิธีการประกบกันแทน ตัวอักษรแสดงถึงลำดับการดำเนินการที่เป็นไปได้สำหรับ 26 ขั้นตอนแรก *
s เป็นสถานที่ที่โปรแกรมที่ได้หยุดและเอาท์พุท .
s เป็นขั้นตอนที่ยังไม่ได้รับการดำเนินการเลย
step# p1 p2 p3 p4 p5 p6
1 A C F J N R V
2 B E I M Q * Z
3 D H * P U
4 G L T Y
5 K O X
6 * S .
7 W .
8 . .
9 . .
∞ . .
ข้อกำหนดสำหรับภาษาเป้าหมาย
ภาษาเป้าหมาย (ภาษาที่ถูกตีความขนาน) ต้องเป็นทัวริงสมบูรณ์ นอกจากนั้นมันอาจเป็นภาษาใด ๆที่ทัวริงสมบูรณ์รวมถึงทัวริงย่อยที่สมบูรณ์ของภาษาที่มีขนาดใหญ่กว่ามาก คุณมีอิสระที่จะตีความสิ่งต่างๆเช่นกฎของระบบแท็กแบบวงกลม คุณยังได้รับอนุญาตให้สร้างภาษาเพื่อทดสอบตราบใดที่คุณสามารถแสดงให้เห็นว่าทำไมภาษาทัวริงถึงสมบูรณ์
ตัวอย่างเช่นหากคุณเลือกทดสอบ brainfuck วิธีที่ดีที่สุดคือทดสอบ[]-+<>
เซ็ตย่อยเนื่องจากอินพุตไม่ได้รับการสนับสนุนและเอาต์พุตถูกทิ้ง (ดูด้านล่าง)
เมื่อพูดถึงโปรแกรม "คอนโทรลเลอร์" (ที่คุณเล่นกอล์ฟ) ไม่มีข้อกำหนดพิเศษ มีข้อ จำกัด ด้านภาษาปกติ
วิธีสร้างรายการโปรแกรมที่ไม่มีที่สิ้นสุด
ภาษาโปรแกรมส่วนใหญ่สามารถแสดงเป็นชุดของสัญลักษณ์จากตัวอักษรที่ จำกัด ในกรณีนี้มันค่อนข้างง่ายที่จะระบุรายการของทุกโปรแกรมที่เป็นไปได้เพื่อเพิ่มความยาว ตัวอักษรที่คุณใช้ควรเป็นตัวแทนของความต้องการของภาษาเป้าหมาย ในกรณีส่วนใหญ่ ASCII นี้สามารถพิมพ์ได้ หากภาษาของคุณรองรับ Unicode เป็นคุณสมบัติเพิ่มเติมคุณไม่ควรทดสอบชุดอักขระ Unicode ที่เป็นไปได้รวมกันแค่ ASCII หากภาษาของคุณใช้อย่างเดียว[]-+<>
อย่าทดสอบชุดอักขระ ASCII แบบ "ความคิดเห็น" ที่หลากหลาย ภาษาเช่น APL จะมีตัวอักษรพิเศษของตัวเอง
หากอธิบายภาษาของคุณได้ดีที่สุดในวิธีที่ไม่ใช่ตัวอักษรบางตัวเช่น Fractran หรือ Turing Machines แสดงว่ามีวิธีการอื่นที่ถูกต้องพอ ๆ กันในการสร้างรายการโปรแกรมที่ใช้ได้ทั้งหมด
การตีความรายการโปรแกรมที่กำลังเติบโต
ส่วนสำคัญของความท้าทายนี้คือการเขียนล่ามแบบขนานสำหรับรายการที่เพิ่มขึ้นของโปรแกรม มีขั้นตอนพื้นฐานบางประการสำหรับสิ่งนี้:
- เพิ่มจำนวนโปรแกรม จำกัด ลงในรายการ
- ตีความแต่ละรายการในรายการเป็นระยะเวลาที่แน่นอน สิ่งนี้สามารถทำได้โดยการทำหนึ่งขั้นตอนการสอนสำหรับแต่ละ บันทึกสถานะทั้งหมด
- ลบโปรแกรมการยกเลิก / การขว้างผิดพลาดทั้งหมดออกจากรายการ
- เอาต์พุตโปรแกรม * ที่หยุดอย่างหมดจด
- เพิ่มโปรแกรมเพิ่มเติมลงในรายการ
- จำลองแต่ละโปรแกรมในขณะเดียวกันก็ยกการทำงานของโปรแกรมรุ่นเก่าที่ค้างไว้
- ลบโปรแกรมการยกเลิก / การขว้างผิดพลาดทั้งหมดออกจากรายการ
- เอาต์พุตโปรแกรม * ที่หยุดอย่างหมดจด
- ทำซ้ำ
* คุณควรส่งออกเฉพาะโปรแกรมที่หยุดอย่างหมดจด ซึ่งหมายความว่าไม่มีข้อผิดพลาดทางไวยากรณ์หรือข้อยกเว้นที่ไม่ได้ถูกโยนทิ้งในระหว่างการดำเนินการ โปรแกรมที่ขออินพุตควรถูกยกเลิกโดยไม่ส่งสัญญาณออกมา หากโปรแกรมสร้างผลลัพธ์คุณไม่ควรยกเลิกมันเพียงแค่โยนออกไป
กฎเพิ่มเติม
- คุณต้องไม่วางไข่เธรดใหม่เพื่อให้มีโปรแกรมที่ถูกทดสอบเนื่องจากนี่จะเป็นการลดภาระการทำงานแบบขนานไปยังโฮสต์ OS / ซอฟต์แวร์อื่น ๆ
- แก้ไข: เพื่อปิดช่องโหว่ในอนาคตคุณไม่ได้รับอนุญาตให้
eval
(หรือฟังก์ชั่นที่เกี่ยวข้อง) เป็นส่วนหนึ่งของรหัสโปรแกรมที่ทดสอบ คุณสามารถeval
codeblock จากรหัสของล่าม (คำตอบ BF-in-Python ยังคงใช้ได้ภายใต้กฎเหล่านี้) - นี่คือรหัสกอล์ฟ
- ภาษาที่คุณเขียนไม่จำเป็นต้องเป็นภาษาเดียวกับภาษาที่คุณกำลังทดสอบ / ส่งออก
- คุณควรถือว่าหน่วยความจำที่มีอยู่นั้นไม่ได้ จำกัด
- เมื่อพิสูจน์ความสมบูรณ์ของทัวริงคุณอาจสมมติว่าอินพุตถูกเข้ารหัสในโปรแกรมและเอาต์พุตสามารถอ่านได้จากสถานะภายในของโปรแกรม
- หากโปรแกรมของคุณแสดงผลออกมาเองมันอาจผิดหรือเป็นรูปหลายเหลี่ยม
"If your program outputs itself, it is probably wrong or a polyglot."