Haskell , 306 + 624 = 930 ไบต์
โปรแกรม 1: ฟังก์ชั่นนิรนามที่รับอาร์กิวเมนต์ดัมมี่และส่งคืนสตริง
(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"İĴİóđđđÝöÝâÝæÝääē××êääē××İēÀħđĮâħēĕóİóòòĮááħááđéêâéêēááĮÀħ""(\b c()->foldr(\a->map pred)b(show()>>c)`mappend`show(map(map fromEnum)$tail(show c):pure b))"
ลองออนไลน์!
โปรแกรม 2: q[[40,...]]
ในตอนท้ายเป็นฟังก์ชั่นนิรนามที่รับอาร์กิวเมนต์ดัมมี่และส่งคืนสตริง
z~z=[[['@','0'..]!!4..]!!z]
q[x,q]_=z=<<x++q++[34,34]++x
q[[40,92,98,32,99,40,41,45,62,102,111,108,100,114,40,92,97,45,62,109,97,112,32,112,114,101,100,41,98,40,115,104,111,119,40,41,62,62,99,41,96,109,97,112,112,101,110,100,96,115,104,111,119,40,109,97,112,40,109,97,112,32,102,114,111,109,69,110,117,109,41,36,116,97,105,108,40,115,104,111,119,32,99,41,58,112,117,114,101,32,98,41,41,34],[304,308,304,243,273,273,273,221,246,221,226,221,230,221,228,228,275,215,215,234,228,228,275,215,215,304,275,192,295,273,302,226,295,275,277,243,304,243,242,242,302,225,225,295,225,225,273,233,234,226,233,234,275,225,225,302,192,295]]
ลองออนไลน์!
ชุดอักขระ 1 (รวมช่องว่าง):
"$()-:>E\`abcdefhilmnoprstuw×ÝáâäæéêñòóöđēĕħĮİĴ
ชุดอักขระ 2 (รวมบรรทัดใหม่):
!'+,.0123456789<=@[]_qxz~
เนื่องจากชุดที่ 1 มีอักขระที่ไม่ใช่ ASCII เท่านั้นไบต์ UTF-8 ของพวกเขาจึงไม่รวมกัน
มันทำงานอย่างไร
โดยทั่วไปแล้วโปรแกรมที่ 1 จะเขียนด้วยนิพจน์แลมบ์ดาช่องว่างและวงเล็บการใช้ฟังก์ชันตัวอักษรและตัวเลขในตัวฟรีและมีข้อมูลควินินเป็นตัวอักษรสตริงในตอนท้าย
- รหัสหลักของโปรแกรม 1 จะถูกแปลงเป็นข้อมูลตัวอักษรแบบสตริงโดยล้อมรอบด้วยเครื่องหมายคำพูด
- ในการสนับสนุนสิ่งนี้แบ็กสแลชทุกครั้งจะถูกตามด้วย
a
หรือb
ซึ่งเป็นรูปแบบการหลบหนีที่ถูกต้องซึ่งผ่านshow
ไปมา
- อีกประโยชน์เล็ก ๆ ก็คือว่า
a
, b
และc
เป็นคนเดียวที่ต่ำกว่าตัวอักษรกรณีที่มีรหัส ASCII น้อยกว่า 100 บาทประหยัดในการเข้ารหัสตัวเลขที่ใช้โดยโปรแกรม 2
- การเข้ารหัสตัวอักษรสตริงของรหัสหลักของโปรแกรม 2 นั้นดูสับสนมากขึ้นโดยใช้ non-ASCII Unicode: อักขระทุกตัวมีการเพิ่ม 182 ลงในจุดโค้ดเพื่อให้แน่ใจว่าไม่มีการทับซ้อนกับอักขระดั้งเดิม
- 182 เคยเป็น 128 จนกระทั่งฉันรู้ว่าฉันสามารถใช้ความจริงที่ว่า 182 เป็นสองเท่าของความยาวของตัวอักษรสตริงสำหรับโค้ดของโปรแกรม 1 เพื่อลดการถอดรหัส (เป็นโบนัสโปรแกรม 2 สามารถใช้การขึ้นบรรทัดใหม่ได้)
โดยทั่วไปโปรแกรม 2 จะเขียนด้วยสมการฟังก์ชันระดับบนสุด (ยกเว้นนิรนามสุดท้าย) ตัวอักษรตัวอักษรและตัวเลขทศนิยมไวยากรณ์รายการ / ช่วงและตัวดำเนินการและมีข้อมูล quine เป็นรายการของInt
s ที่สิ้นสุด
- รหัสหลักของโปรแกรม 1 ถูกเข้ารหัสเป็นรายการของรหัสคะแนนพร้อมด้วยเครื่องหมายคำพูดคู่สุดท้าย
- รหัสหลักของโปรแกรม 2 ถูกเข้ารหัสเป็นรายการของรหัสจุดของตัวอักษรสตริงที่ใช้ในโปรแกรม 1 ซึ่งยังคงเพิ่มขึ้น 182
เกมส์โปรแกรม 1
b
และc
เป็นค่าของตัวอักษรสตริงสำหรับโปรแกรม 2 และ 1 ตามลำดับซึ่งกำหนดให้เป็นอาร์กิวเมนต์สุดท้ายของนิพจน์แลมบ์ดา ()
เป็นอาร์กิวเมนต์ดัมมี่เพียงเพื่อตอบสนองกฎ PPCG ที่โปรแกรมควรกำหนดฟังก์ชั่น
foldr(\a->map pred)b(show()>>c)
ถอดรหัสสตริงb
รหัสหลักของโปรแกรมที่ 2 โดยการใช้map pred
ไปจำนวนครั้งเท่ากับความยาวของหรือshow()>>c == c++c
182
tail(show c)
แปลงสตริงc
ให้เป็นรหัสแกนหลักของโปรแกรม 1 โดยมีเครื่องหมายอัญประกาศคู่สุดท้ายต่อท้าย
:pure b
b
รวมนี้ในรายการกับสตริง
map(map fromEnum)$
แปลงสตริงเป็นรายการของรหัสจุด
`mappend`show(...)
เรียงลำดับรายการผลลัพธ์ที่เกิดขึ้นเป็นลำดับและท้ายที่สุดจะผนวกเข้ากับรหัสหลักของโปรแกรม 2
เกมส์โปรแกรม 2
- ระดับบนสุด
z~z=[[['@','0'..]!!4..]!!z]
เป็นฟังก์ชั่นการแปลงรหัสชี้กลับไปที่ตัวอักษร (จำเป็นต้องเขียนเนื่องจากไม่มีอักขระทั้งหมดในtoEnum
)
z
อาร์กิวเมนต์จุดรหัสของมันจะถูกเรียกว่า เครื่องหมายความเกียจคร้าน~
ไม่มีผลในตำแหน่งนี้ แต่หลีกเลี่ยงอักขระเว้นวรรค
['@','0'..]
เป็นช่วงรายการก้าวถอยหลังเริ่มต้นที่รหัส ASCII 64 จากนั้นกระโดดลง 16 ขั้นในแต่ละขั้นตอน
- การนำ
!!4
ไปใช้กับสิ่งนี้จะทำให้\NUL
ตัวละคร
- การตัดคำที่อยู่ใน
[ ..]
ช่วงให้รายการของตัวละครทั้งหมดซึ่ง!!z
ดัชนี
- ในที่สุดตัวละครจะถูกห่อหุ้มด้วยรายการซิงเกิล นี้จะช่วยให้การทำแผนที่การทำงาน
z
มากกว่ารายการที่ใช้=<<
แทนการใช้งานไม่ได้และmap
<$>
- ระดับบนสุด
q[x,q]_=z=<<x++q++[34,34]++x
เป็นฟังก์ชั่นการสร้างโปรแกรม 1 จากรายการข้อมูลควิน
x
เป็นข้อมูลสำหรับแกนหลักของโปรแกรม 1 (รวมถึงเครื่องหมายคำพูดคู่สุดท้าย) และข้อมูลภายในq
คือข้อมูลที่ทำให้งงงวยสำหรับแกนหลักของโปรแกรม 2 _
เป็นอาร์กิวเมนต์ดัมมี่อื่นเพียงอย่างเดียวที่จะทำให้ฟังก์ชั่นนิรนามสุดท้ายเป็นเพียงฟังก์ชัน
x++q++[34,34]++x
เชื่อมต่อชิ้นส่วนรวมถึงเครื่องหมายคำพูดคู่สองตัวพร้อมรหัส ASCII 34
z=<<
สร้างโปรแกรม 1 โดยการแมปz
ผ่านการต่อข้อมูลเพื่อแปลงจากจุดโค้ดเป็นอักขระ
- สุดท้าย
q[[40,...]]
คือฟังก์ชั่นที่ไม่ระบุชื่อรวมq
กับข้อมูลควิน