สามควายซึ่งกันและกัน


23

งาน

ในความท้าทายนี้งานของคุณคือการเขียนโปรแกรมสามโปรแกรมที่ก่อให้เกิดระบบที่คล้ายกันซึ่งกันและกัน ขอเรียกโปรแกรมA, และB Cหากโปรแกรมใดโปรแกรมหนึ่งได้รับซอร์สของโปรแกรมอื่นเป็นอินพุตโปรแกรมนั้นจะส่งออกซอร์สของโปรแกรมที่สาม ตัวอย่างเช่นถ้าAจะได้รับBเป็น input Cมันจะออกผลลัพธ์ หากโปรแกรมจะได้รับแหล่งที่มาของตัวเองเป็น input เขาจะเอาท์พุทสามสาย"three", "mutual"และ"quines"(ไม่ทราบราคา) ในทุกกรณีพวกเขาอาจส่งออกขึ้นบรรทัดใหม่อีกหนึ่งบรรทัด สำหรับอินพุตอื่นโปรแกรมอาจทำอะไรก็ได้รวมถึงข้อขัดข้อง

ตัวอย่าง

ตัวอย่างเช่นสมมติว่ารหัสแหล่งที่มาของA, BและCมีaSdf, และghJk zxcVจากนั้นโปรแกรมควรปฏิบัติดังนี้

Source Input  Output
--------------------
aSdf   aSdf   three
aSdf   ghJk   zxcV
aSdf   zxcV   ghJk
ghJk   aSdf   zxcV
ghJk   ghJk   mutual
ghJk   zxcV   aSdf
zxcV   aSdf   ghJk
zxcV   ghJk   aSdf
zxcV   zxcV   quines

กฎและการให้คะแนน

การแก้ปัญหาA, BและCสามารถเป็นได้ทั้งฟังก์ชั่นหรือโปรแกรมเต็ม แต่พวกเขาจะต้องเป็นอิสระอย่างสมบูรณ์: ไม่มีรหัสที่ใช้ร่วมกันที่ได้รับอนุญาต มีช่องโหว่มาตรฐานและกฎ quineดังนั้นโปรแกรมจึงไม่สามารถเข้าถึงซอร์สโค้ดของตนเองได้ไม่ว่าด้วยวิธีใด

คะแนนของคุณคือการนับไบต์รวมA, BและCคะแนนที่ต่ำกว่าการเป็นดีกว่า


"ไม่มีรหัสที่อนุญาตให้ใช้ร่วมกัน" หมายความว่าอะไร? พวกเขามีส่วนที่คล้ายกันหรือไม่? (สิ่งนี้จะทำให้การตอบคำถามในจาวายากเนื่องจากโปรแกรมส่วนใหญ่มีpublic static void mainบางส่วน) หรือว่าคุณไม่สามารถเขียนฟังก์ชั่นที่เรียกโดยทั้งสามได้
Paŭlo Ebermann

@ PaŭloEbermannมันหมายถึงโปรแกรมหลัง: โปรแกรมทั้ง 3 โปรแกรมควรทำงานได้ด้วยตนเอง
Zgarb

คำตอบ:


16

CJam, 165 147 114 108 99 99 ไบต์

2 _ri^_q+@"quinesmutualthree"6/=?
1 _ri^_q+@"quinesmutualthree"6/=?
3 _ri^_q+@"quinesmutualthree"6/=?

ขอบคุณ @ MartinBüttnerสำหรับคำแนะนำที่ช่วยประหยัด 48 ไบต์!

ลองใช้ออนไลน์ในล่าม CJam

การตรวจสอบ

$ cat A
2 _ri^_q+@"quinesmutualthree"6/=?
$ cat B
1 _ri^_q+@"quinesmutualthree"6/=?
$ cat C
3 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam A < A
three
$ cjam A < B
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam A < C
1 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam B < A
3 _ri^_q+@"quinesmutualthree"6/=?
$ cjam B < B
mutual
$ cjam B < C
2 _ri^_q+@"quinesmutualthree"6/=?
$ 

$ cjam C < A
1 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < B
2 _ri^_q+@"quinesmutualthree"6/=?
$ cjam C < C
quines

ความคิด

ชุด{0, 1, 2, 3}เป็นกลุ่มภายใต้การดำเนินการ^ (ไบนารีเอกสิทธิ์เฉพาะบุคคล OR) ซึ่งแต่ละองค์ประกอบเป็นสิ่งที่ตรงกันข้าม

หากทั้งสามโปรแกรมนั้นเหมือนกันยกเว้นตัวอักษรตัวแรก (องค์ประกอบของ{0, 1, 2, 3} ) เราสามารถแยกแยะและพิมพ์ได้อย่างง่ายดาย:

  • เราเริ่มต้นด้วยการ XORING ตัวเลขที่จุดเริ่มต้นของรหัสที่มาและการป้อนข้อมูล

  • หากผลลัพธ์อยู่ใน0แหล่งที่มาและการจับคู่อินพุต

    ดังนั้นเราพิมพ์หนึ่งในสามคำที่เลือกโดยหลักทั่วไปนี้

  • หากผลลัพธ์ไม่ใช่0 แสดงว่าเป็นองค์ประกอบของ{1, 2, 3}ที่ไม่ได้อยู่ในแหล่งที่มาหรือในอินพุต

    ดังนั้นเราพิมพ์มันตามด้วยส่วนที่เหลือของอินพุต

มันทำงานอย่างไร

2                                  e# Push the number N on the stack.
  _                                e# Push a copy.
    r                              e# Read a token from STDIN, i.e., the input up
                                   e# to and excluding the next whitespace char.
     i                             e# Cast to integer.
      ^                            e# XOR it with the copy of N. Result: X
       _                           e# Push a copy of the result.
        q+                         e# Append the rest of the input.
          @                        e# Rotate N on top of the stack.
           "quinesmutualthree"6/   e# Push ["quines" "mutual" "three"].
                                =  e# Select the word at index N.
                                 ? e# If X is non-zero, select the modified input;
                                   e# otherwise, select the word.

2
ว้าวฉันอ่านคำถามแล้วคิดว่า "ไม่มีใครคิดหาคำตอบสำหรับเรื่องนี้" จากนั้นฉันดูถูกและเห็นคำตอบจากเดนนิส (ใครอีก?) +1!
เลเวลริเวอร์เซนต์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.