เพิ่มบรรทัดใหม่เพื่อความชัดเจน:
(a(:^)*(!()):#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>(0)(!()){:^}(1)(){:^}(2)(:*){:^}(
3)(::**){:^}(4)(:*:*){:^}(5)(::*:**){:^}(6)(:*::**){:^}(7)(::*::***){:^}(8)(:*:*:*){:^}(9)(
::**::**){:^}R^^S):^
ฉันให้ข้อ จำกัด ที่ตัวเองต้องอ่านจาก STDIN มากกว่าจากด้านบนของสแต็กเหมือนกับคำตอบ Underload ฉันยังใช้การป้อนทศนิยมที่เหมาะสมซึ่งทำขึ้นส่วนใหญ่ของรหัส
คำอธิบาย:
ฉันห่อโปรแกรมขึ้นมาในควินกระดาษห่อ: และ(a(:^)*
):^
ซึ่งหมายความว่ารหัสทั้งหมดที่อยู่ในชุดคลุม quine จะมีรหัสต้นฉบับของโปรแกรมที่ด้านล่างของสแต็ก
เพื่อที่จะแปลงตัวเลขให้เป็นเลขคริสตจักรปกติฉันใช้เทคนิคการแทนที่แต่ละหลักด้วยรหัสเพื่อคูณด้วย 10 และเพิ่มตัวเลขนั้น:
0 -> (::*:**:*)*
1 -> (::*:**:*)*(:)~*(*)*
2 -> (::*:**:*)*(::)~*(**)*
3 -> (::*:**:*)*(:::)~*(***)*
มีการทำซ้ำหลายครั้งที่นี่ดังนั้นให้จัดทำมันลงในโปรแกรมย่อยที่จะนำตัวเลขของศาสนจักรจากด้านบนสุดของสแต็คและใช้มันเพื่อสร้าง "หลักสตริง:"
:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*
ฉันใส่สิ่งนี้ลงในสภาพแวดล้อมใหม่เพื่อให้สามารถเข้าถึงได้อย่างรวดเร็ว:
#(}:(:)~^a((::*:**:*)*)~*(~*)*~(*)~^a*(*)*{)>
R
ตอนนี้ฉันสามารถสร้างรหัสทดแทน R
ใช้องค์ประกอบด้านบนของสแต็กเพื่อสร้างตารางการค้นหาเพื่อแทนที่สตริงจาก STDIN ด้วยรหัส Betaload มันทำงานได้เช่นนี้:
()
(0)(code for 0)
(1)(code for 1)
(2)(code for 2)
...
R
อย่างไรก็ตามเราสามารถใช้โปรแกรมย่อยที่เราสร้างขึ้นเพื่อสร้างส่วนรหัส:
(0)(!()){:^}
(1)(){:^}
(2)(:*){:^}
(3)(::**){:^}
...
เมื่อR
ถูกเรียกใช้มันจะแปลงอินพุตเป็นชุดโปรแกรมย่อยที่สร้างตัวเลขของศาสนจักร เมื่อโปรแกรมย่อยนี้ถูกดำเนินการมันจะสร้างตัวเลขของศาสนจักรในองค์ประกอบถัดไปของสแต็ก (0 ซึ่งวางลงก่อนหน้านี้) ซึ่งหมายความว่าหลังจากR^
นั้นค่าสูงสุดบนสแต็กจะเป็นตัวเลขของศาสนจักร จากนั้นเรา^
อีกครั้งเพื่อใช้ตัวเลขของศาสนจักรกับองค์ประกอบสุดท้ายในสแต็ค (ซอร์สโค้ดของโปรแกรม) เพื่อรับคำตอบ
สนุกจริง: ฉันมี MD สำหรับการส่งนี้มาหลายเดือนแล้ว ฉันเก็บไว้หลังจากเข้าใจผิดคำถาม (ซึ่งฉันไม่สามารถหาได้อีกต่อไป) ฉันต้องขุดมันขึ้นมาจากถังรีไซเคิลเพื่อโพสต์ที่นี่