เขียนคำสั่งที่สาม quine


17

ความท้าทายนี้เป็นส่วนเสริมของ ' Golf a quine ร่วม '

ใช้ภาษาที่คุณเลือกสามภาษาสร้างโปรแกรมOuroborosลำดับที่สาม

นั่นคือในภาษา A ให้เขียนโปรแกรม pA ซึ่งเอาต์พุตโปรแกรม pB ในภาษา B โปรแกรม pB ควรเอาต์พุตโปรแกรม pC ในภาษา C ซึ่งจะส่งผลให้โปรแกรมดั้งเดิม pA เป็นภาษา A

ไม่มีสองภาษาใน A, B และ C สามารถเหมือนกันหรือเซ็ตย่อยหรือซูเปอร์เซ็ตของกันและกัน ไม่มี pA, pB หรือ pC ที่เหมือนกัน

ตัวอย่างเช่นโปรแกรม Haskell แสดงผลโปรแกรม Perl ซึ่งแสดงผลโปรแกรม Java ซึ่งแสดงผลโปรแกรม Haskell ดั้งเดิมจะใช้ได้

ในทางกลับกันโปรแกรม C # 4 ซึ่งแสดงผลโปรแกรม C # 3 ซึ่งแสดงผลโปรแกรม C # 2 นั้นไม่ถูกต้อง แม้แต่ Perl -> Ruby -> ชุด Bash ก็จะไม่ถูกต้องถ้าพูดว่าโปรแกรม Perl และโปรแกรม Ruby ก็เหมือนกัน

นี่คือรหัสกอล์ฟดังนั้นโปรแกรมที่สั้นที่สุดจะเป็นผู้ชนะ


2
สำหรับความสนใจ: กำเนิดควินร่วมกันซึ่งคุณสามารถระบุลำดับของภาษา
hammar

คำตอบ:


21

Python -> Perl -> Ruby, 48 ตัวอักษร

การปรับตัวของฉันคำตอบก่อนหน้า วิ่ง

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

ด้วย Python สร้างตัวอย่างของ Perl นี้

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

ซึ่งสร้างรหัสทับทิมต่อไปนี้

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

ซึ่งจะพิมพ์ตัวอย่างของ Python ต้นฉบับ:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical

13

Perl -> PHP -> HTML + JavaScript, 105 ตัวอักษร

ฉันต้องการทำให้ภาษาต่าง ๆ มีความหมายดังนั้นฉันจึงคิดว่าฉันจะเขียนสคริปต์ PHP ที่สร้างหน้า HTML ที่มี JavaScript สำหรับภาษาที่สามฉันเลือก Perl เพียงเพราะฉันชอบ Perl :)

บางคนอาจคิดว่าสี่ภาษานี้ แต่ฉันไม่ได้นับ HTML ว่าแยกต่างหากจาก JavaScript ที่นี่ - เป็นภาษามาร์กอัปไม่ใช่ภาษาโปรแกรม อย่างไรก็ตามต่อไปนี้เป็นสามเวอร์ชัน:

Perl (105 ตัวอักษร):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 ตัวอักษร):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 ตัวอักษร):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(ปล. ใช่ฉันรู้ว่าฉันสามารถทำให้ PHP เกือบเป็นเสียงเรียกเข้าได้เช่นเพียงแค่สร้างโค้ด HTML + JS ใน Perl และต่อท้าย<?phpแต่ก็รู้สึกเหมือนโกงมากเกินไปในโซลูชันนี้รหัสนั้นจริง ๆ แล้ว ประมวลผลใน PHP แทนที่จะเป็นเพียงการคัดลอกคำต่อคำ)


3

Underload → sed → Perl, 23 ไบต์

อาจลดความสามารถลงได้ด้วยตัวเลือกภาษาที่ดีกว่า เนื้อหาที่ไม่ใช่การแข่งขันเนื่องจากกฎ "โปรแกรม sed สามารถใช้บรรทัดว่างเปล่าเป็นอาร์กิวเมนต์" จะทำให้การแข่งขันสิ้นสุดลง

โปรแกรม Underload:

((iprint+q)Sa(:^)*aS):^

สร้างโปรแกรม sed:

iprint+q(((iprint+q)Sa(:^)*aS):^)

ซึ่งสร้างโปรแกรม Perl:

พิมพ์ Q + (((พิมพ์ Q +) Sa (: ^) * AS): ^)


(หมายเหตุ: มีบรรทัดใหม่ต่อท้ายสองบรรทัดที่นี่) ซึ่งสร้างโปรแกรม Underload เดิมอีกครั้ง:

((iprint+q)Sa(:^)*aS):^

จุดประสงค์หลักที่นี่คือการค้นหาภาษาที่มีสายอักขระแบบซ้อนได้ (เช่นคุณสามารถอ้างอิงข้อความได้โดยใส่ไว้ในตัวคั่นแทนที่จะต้องหลบหนี) Underload มี(), Perl มีq(), และในสตริงจะดำเนินต่อไปจนกระทั่ง whitespace (ซึ่งสามารถอยู่ได้โดยปริยายหากไม่มีช่องว่างในโปรแกรม) อาจมีภาษา esolang หรือการเล่นกอล์ฟที่นั่นด้วยคำสั่ง "พิมพ์ส่วนที่เหลือของบรรทัดปัจจุบันไม่ใช่ตามด้วยการขึ้นบรรทัดใหม่" ซึ่งจะเหมาะที่สุดที่นี่ แต่ฉันไม่ได้ใช้เวลาทั้งหมดที่กำลังมองหา คุณสามารถบันทึก 8 ไบต์ลบความยาวของคำสั่งในกรณีนั้น (เจลลี่เกือบใช้งานได้ แต่คำสั่งไม่ได้อ้างถึงนอกจากนี้มันยังเป็นการท้าทาย

คุณสามารถลดขนาดนี้เป็น22 ไบต์เช่นนี้:

((csay + Q) Sa (: ^) * AS): ^

(ด้วยการขึ้นบรรทัดใหม่หนึ่งบรรทัดเช่นไฟล์ข้อความปกติแทนที่จะเป็นศูนย์ที่ปกติคุณเล่นกอล์ฟ) อย่างไรก็ตามสิ่งนี้ต้องการล่าม Underload ที่ใช้ได้กับการขึ้นบรรทัดใหม่ว่าไม่ต้องใช้ op ลองใช้แบบออนไลน์! แต่ฉันคิดว่ามันเป็นการโพสต์ความท้าทาย

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