ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>ab*1'3:*2+*0pnd3*:::::::::::::::1'3:*3+*0p1'3:*5+*0p1'3:*d+*0p1'3:*f+*0p1'3:*fa++*0p1'3:*fd++*0p1'4'3*f-*0p1'4'3*7-*0p1'4'3*5-*0p6:*:*4-1p6:*:*4+1p6:*:*8+1p6:*:*a+1p6:*:*8+2p6:*:*f1++2p6:*:*f3++2pn75*1-:1'3:*4+*0p6:*:*f2++2pnaa*:::::::::::::::::1'3:*6+*0p1'3:*7+*0p1'3:*f1++*0p1'3:*f2++*0p1'3:*fe++*0p1'3:*ff++*0p1'4'3*e-*0p1'4'3*d-*0p1'4'3*4-*0p1'4'3*3-*0p6:*:*3-1p6:*:*2-1p6:*:*b+1p6:*:*c+1p6:*:*9+2p6:*:*a+2p6:*:*f4++2p6:*:*f5++2pn67*::::::::::1'3:*8+*0p1'3:*a+*0p1'3:*f4++*0p1'3:*f5++*0p1'4'3*f-5-*0p1'4'3*c-*0p1'4'3*2-*0p6:*:*1-1p6:*:*d+1p6:*:*b+2p6:*:*f6++2pna5*::1'3:*9+*0p1'3:*f3++*0p6:*:*1pn68*:::::1'3:*b+*0p1'3:*f8++*0p1'4'3*f-2-*0p1'4'3*9-*0p1'4'3*1+*0p6:*:*f7++2pne8*:::::::1'3:*c+*0p1'3:*f9++*0p1'4'3*f-1-*0p1'4'3*8-*0p1'4'3*2+*0p6:*:*f2++1p6:*:*f+2p6:*:*f8++2pnf4*:1'3:*e+*0p1'4'3*3+*2pn77*::::1'3:*f6++*0p1'4'3*f-4-*0p6:*:*f1++1p6:*:*c+2p6:*:*e+2pnb4*1-::1'3:*f7++*0p6:*:*f+1p6:*:*d+2pnf4*1-::1'3:*fb++*0p6:*:*7+2p1'3:*1+*2pnf4*2-1'3:*fc++*0pn95*:::1'4'3*f-3-*0p1'4'3*a-*0p1'4'3**0p6:*:*1+1pn87*1'4'3*b-*0pnac*2-:1'4'3*6-*0p1'4'3*3+*0pnf4*3-1'4'3*1-*0pn88*2-6:*:*5-1pnc9*1-6:*:*2+1pnb4*:6:*:*3+1p6:*:*6+1pn88*6:*:*9+1pnd4*1-6:*:*e+1pnc8*2-:1'3:**1p1'3:**2pnd7*2+6:*:*4+2pn75*6:*:*6+2pn>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
ลองออนไลน์!
การทำเช่นนี้เป็นสิ่งที่แย่ที่สุด
วิธีการทำงาน:
โปรแกรมนี้เป็นชุดของข้อความสั่งที่ประกอบโปรแกรม B รอบ ๆ ตัวเองซึ่งจะพิมพ์ครึ่งหนึ่งของไบต์ต้นทางที่เลื่อนไปสองครั้ง
โปรแกรมนี้เป็นโปรแกรมขนาด 1300 ไบต์จำนวน 2 ชุดดังนั้นจึงมั่นใจได้ว่าโปรแกรมขนาด 1300 ไบต์ทั้งหมดจะถูกเรียกใช้โดยรวม
คำอธิบายที่ดีกว่า:
Quine Befunge-98 ทุกอันจำเป็นต้องมีสัญลักษณ์ดังกล่าว@
หรือq
และ,
ปัญหา : ไม่มีสัญลักษณ์เหล่านี้เป็นจุดเริ่มต้นที่ดีโดยเฉพาะตั้งแต่สิ้นสุดโปรแกรม@
และq
สิ้นสุดลงทันที
วิธีแก้ไข : กำจัดอักขระเหล่านั้นในซอร์สโค้ด
ปัญหา : อย่างไร
วิธีแก้ไข : ใช้p
คำสั่ง (ใส่) เพื่อแก้ไขซอร์สโค้ดเพื่อรวมอักขระที่ต้องการซึ่งจะพิมพ์ประกอบด้วยซอร์สโค้ดที่เลื่อนไปหนึ่งไบต์และไม่ใช้g
คำสั่งที่โกง
ปัญหา : (ถอนหายใจเมื่อไหร่จะสิ้นสุด)
คำสั่ง put จะแสดงค่า 3 ค่าn x y
ซึ่งกำหนดตัวอักษร, x-coord, y-coord แต่เมื่อการเริ่มต้นของค่าเหล่านี้ถูกแบ่งครึ่งแล้วมันสามารถเขียนอักขระที่ไม่ดีในซอร์สโค้ดเริ่มต้น สำหรับ quining
การแก้ไข : (อันสุดท้ายที่ฉันสัญญา)
ใช้สำเนาซอร์สโค้ด 2 ชุดอันหลังเป็น "แก้ไขข้อผิดพลาด" ซึ่งจะแก้ไขปัญหาอื่นโดยไม่ตั้งใจซึ่งก็คือคำสั่งใส่ (คำสั่ง p + ค่าเริ่มต้นคงที่) ซึ่งจะแบ่งครึ่ง ไม่ได้รับการดำเนินการนี้ได้รับการแก้ไขโดยมี 2 สำเนาของแต่ละคำสั่ง สิ่งสุดท้ายที่ต้องทำคือเราจะสร้างซอร์สโค้ดทั้งหมดให้ครึ่งหนึ่งได้อย่างไร
ตอบ :
นี่คือหลักฐานที่แสดงให้เห็นว่าทำไมสำเนาสองชุดของสตริงไบต์เลื่อน == สำเนาสำเนาสตริงไบต์เลื่อนสองชุด นั่นหมายความว่าเราสามารถใช้รหัสครึ่งหนึ่งเลื่อนไบต์แล้วพิมพ์สองครั้ง (หรือใช้รหัสครึ่งเปลี่ยนไบต์พิมพ์พิมพ์ทำซ้ำ [นั่นคือสิ่งที่เกิดขึ้นจริง])
วิธีการใช้งาน : สมมติว่า 0123456789abcdef เป็นแหล่งที่มา
Befunge Pseudocode:
0123456789abcv;;"123456789abcdef" < go this way <--
>PS'0, repeat 2x ^
PS หมายถึง Print Stack (ไม่ใช่คำสั่งจริง) เรากดครึ่งหนึ่งของซอร์สโค้ดย้อนกลับบนสแต็กโดยใช้""
จากนั้นเราพิมพ์สแต็กจากนั้นเราดึงข้อมูล ( '
คำสั่ง) อักขระตัวแรก0
ที่เราย้ายไปด้านหน้า'
และพิมพ์ครั้งสุดท้ายซึ่งเป็นสาเหตุของการเปลี่ยนไบต์แล้วเราทำซ้ำวงจร อีกครั้งเพื่อพิมพ์สำเนาที่สอง เทคนิคหนึ่งที่ต้องจัดการคือสัญลักษณ์ภายในซอร์สซึ่งอาจทำให้เกิดปัญหาได้หากเราเขียนมันในขณะที่รันซอร์สโค้ดฉันหลีกเลี่ยงสิ่งนี้โดยการเพิ่มข้อความสั่งที่เพิ่มเติมซึ่งดูแลมันจากภายนอก
สิ่งนี้ทำให้โค้ดมีลักษณะดังนี้:
คำอธิบาย :
ไฮไลต์สีเขียว: รหัสที่ดูแลการเพิ่มตัวอักษรลงในแหล่งที่มา
ตัวอักษรสีเทา (probs ทัศนวิสัยไม่ดีขออภัย): รหัสที่ได้รับการเพิ่มด้วยรหัสสีเขียว
ไฮไลท์สีแดง: รหัสที่ย้ายอักขระแรกของรหัสต้นฉบับครึ่งหลังลงในพื้นที่สีน้ำเงิน .
สีน้ำเงินไฮไลต์: ดูไฮไลท์สีแดงไฮไลท์
สีส้ม: รหัสที่ทำให้แน่ใจว่าเรายกเลิกหลังจากที่เราเขียนสำเนา 2 ไบต์เลื่อนโดยวาง@
คำสั่ง (ยุติ) ลงในพื้นที่สีเหลือง
ลูกศรควรจะทำให้ชัดเจนยิ่งขึ้นว่าการไหลของรหัสเป็นไปอย่างไร
ที่นี่มาส่วนที่ยากครั้งสุดท้ายเมื่อ:
ที่ไหนทารกรหัสที่มามาจากไหน?
คำตอบสั้น ๆ : C # Magic
คำตอบแบบยาว: 100 ตัวอย่างโค้ด Befunge ที่สร้างขึ้นด้วยมือที่คอมไพล์ด้วยรหัส C # ฉันเขียนด้วยตนเอง initializers คงที่ประมาณ 100 (ชิ้นส่วนของรหัส befunge ที่ดันจำนวนหนึ่งเพื่อสแต็ค) ด้วยมือแล้วใช้โปรแกรม C # ที่กำหนดเองเพื่อรวบรวมลงในผลลัพธ์ Befunge 1300 ไบต์ซึ่งฉันคัดลอกวางสองครั้งและทำให้สุดท้าย โปรแกรม.
คุณยังอยู่หรือเปล่า ขอบคุณมากสำหรับการอ่าน! (หรือเลื่อนไปจนสุด)
ฉันหวังว่ามุขตลกของฉันจะสนุกและไม่น่ารำคาญ
หมายเหตุ: ไม่มีคำสั่งใส่ในรหัสนี้สร้างคำสั่ง ag ซึ่งจะเป็นการโกง
แก้ไข: ฉันได้ตรวจสอบรหัสโดยใช้รหัส Javascript ต่อไปนี้ใน TIO โดยใช้เครื่องมือสำหรับนักพัฒนา
setInterval(()=>{document.getElementById("code").value =
document.getElementById("output").value;
document.getElementById("run").click();}, 2000);