นักปั่นรถยนต์ออนควิน


11

ทำควิน แต่ด้วยการบิด

คำให้การ

ควินพิมพ์รหัส แต่ใส่ตัวอักษรตัวแรกในตอนท้าย
(คุณสามารถทำย้อนกลับ แต่รวมถึงบันทึกย่อนั้นในคำตอบของคุณ)
ผลลัพธ์นั้นจะต้องเป็นโปรแกรมซึ่งเป็นวิธีการแก้ปัญหา

ตัวอย่าง: สมมติว่ารหัสของคุณfoobarทำงานอยู่oobarfซึ่งจะส่งคืนซึ่งจะเป็นอีกโปรแกรมที่ถูกต้อง

foobar -> oobarf
oobarf -> obarfo
obarfo -> barfoo
barfoo -> arfoob
arfoob -> rfooba
rfooba -> foobar

กฎระเบียบ

  • รหัสของคุณจะต้องไม่เป็นเอาท์พุทของรุ่นของรหัสของคนอื่นที่ค่อนข้างชัดเจนว่าขโมย
  • รหัสของคุณจะต้องยาวเกิน 2 ตัวอักษร (รหัสย่อนั้นไม่สนุก)
  • รหัสของคุณต้องมีอักขระที่แตกต่างกันอย่างน้อยสองตัว (เช่น: +++ไม่ถูกต้อง)

เกณฑ์การให้คะแนน

ในฐานะนักท้าทายรหัสที่สั้นที่สุดจะเป็นผู้ชนะ


2
นั่นคือสิ่งที่ทำให้ปวดหัว
Dom Hastings

3
@DomHastings คุณมีเวลาหลายเดือนในการโพสต์
mbomb007

2
@ IQuick143 ฉันคิดว่า> ตัวละคร 2 ตัวเป็นข้อกำหนดที่ดีสำหรับเหตุผลที่คุณกล่าว
dylnan

5
นี่จะนับเป็น 'ควินหมูที่หมุนได้' หรือไม่? ; p
Kevin Cruijssen

3
@ mbomb007 การค้นหาภาษาที่เป็นไปได้คือส่วนหนึ่งของความท้าทาย
IQuick 143

คำตอบ:


19

Befunge-98 (PyFunge) , 2,600 ไบต์

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 สำเนาของแต่ละคำสั่ง สิ่งสุดท้ายที่ต้องทำคือเราจะสร้างซอร์สโค้ดทั้งหมดให้ครึ่งหนึ่งได้อย่างไร

ตอบ :
รูปภาพมูลค่า 1,000 คำที่พวกเขาพูด  จากนั้นพวกเขาก็ทำ Piet

นี่คือหลักฐานที่แสดงให้เห็นว่าทำไมสำเนาสองชุดของสตริงไบต์เลื่อน == สำเนาสำเนาสตริงไบต์เลื่อนสองชุด นั่นหมายความว่าเราสามารถใช้รหัสครึ่งหนึ่งเลื่อนไบต์แล้วพิมพ์สองครั้ง (หรือใช้รหัสครึ่งเปลี่ยนไบต์พิมพ์พิมพ์ทำซ้ำ [นั่นคือสิ่งที่เกิดขึ้นจริง])

วิธีการใช้งาน : สมมติว่า 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);

ฉันหวังเป็นอย่างยิ่งว่าจะได้รับคำอธิบายอย่างเต็มที่ แต่ดูเหมือนว่าจะเป็นความสำเร็จและสมควรได้รับความโปรดปรานอย่างแน่นอน!
นาธาเนียล

1
@Nathaniel มีคำอธิบายแบบเต็มหวังว่าคุณจะชอบมัน! : D
IQuick 143

1
ส่วนที่เกี่ยวกับการจัดการกับpข้อโต้แย้งที่ไม่ถูกต้องนั่นคืออัจฉริยะ
leo3065

@ leo3065 ขอบคุณ :)
IQuick 143

@lQuick แน่นอนฉันทำ!
นาธาเนียล
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.