Codegolf: Quine และ Antiquine


13

ความท้าทายนี้คล้ายกับMeta Quine ของคุณหรือไม่

ควินเป็นโปรแกรมที่สร้างตัวเองบน STDOUT ความท้าทายนี้คือการสร้างโปรแกรม A ซึ่งเมื่อ run สร้างโปรแกรม B บน STDOUT โปรแกรม B เมื่อ run สร้างโปรแกรม A บน STDOUT โปรแกรม A และ B จะต้องเขียนด้วยภาษาเดียวกัน คำถามที่เชื่อมโยงมีข้อ จำกัด A! = B. นั่นดูง่ายเกินไป ดังนั้นสำหรับคำถามนี้เรายืนยันว่า A และ B เป็นโบราณวัตถุโดยใช้กฎต่อไปนี้:

  1. โปรแกรม A และ B ไม่สามารถใช้อักขระเดียวกันใด ๆ บันทึกสำหรับช่องว่างและตัวคั่นคำสั่งและอักขระเครื่องหมายวรรคตอน
  2. โปรแกรม A และ B ต้องประกอบด้วยอักขระอย่างน้อยหนึ่งตัวที่ไม่ใช่ช่องว่างหรือตัวคั่นคำสั่งหรืออักขระเครื่องหมายวรรคตอน
  3. สำหรับวัตถุประสงค์ของกฎ 1 และ 2 คำว่า 'ช่องว่าง' ไม่รวมสัญลักษณ์หรือลำดับของสัญลักษณ์ใด ๆ ที่เป็นคำสั่งตัวดำเนินการหรือสัญลักษณ์ที่ตีความ (เมื่อเทียบกับตัวคั่น) ดังนั้นในภาษาของช่องว่างไม่มีช่องว่าง
  4. ตัวคั่นข้อความสั่งเป็นองค์ประกอบประโยคตามแบบแผนที่ใช้ภายในภาษาเพื่อแยกข้อความ ซึ่งจะรวมถึงการขึ้นบรรทัดใหม่ในไพ ธ อนหรือเซมิโคลอนใน Java, perl หรือ C
  5. อักขระเครื่องหมายวรรคตอนเป็นอักขระ ASCII ซึ่งเป็นค่าช่องว่างหรือใน POSIX ชั้นเรียนตัวอักษรคำ (เช่นการขีดเส้นใต้ไม่ได้เป็นเครื่องหมายวรรคตอนเพื่อวัตถุประสงค์นี้) - คือจะกลับมาจริงและก็ไม่ได้ispunct()_
  6. โปรแกรม A เมื่อทำงานต้องสร้างโปรแกรม (โปรแกรม B) บน STDOUT ของมันซึ่งเมื่อทำงานในทางกลับกันจะสร้างโปรแกรม A
  7. โปรแกรม A และ B ต้องเป็นภาษาการเขียนโปรแกรมเดียวกัน
  8. ภาษาการเขียนโปรแกรมที่ใช้จะต้องเป็นภาษาการเขียนโปรแกรม นอกจากว่าคุณจะทำดีอย่างอื่นฉันจะแนะนำให้ทัวริงสมบูรณ์
  9. อย่างน้อยหนึ่งใน A และ B จะต้องดำเนินการอย่างน้อยหนึ่งคำสั่งภายในภาษา

นี่คือรหัสกอล์ฟดังนั้นคำตอบที่สั้นที่สุดชนะคะแนนเป็นความยาวของโปรแกรม A เป็นไบต์ (เช่นความยาวของโปรแกรม B ไม่เกี่ยวข้อง)


คุณกรุณาเพิ่ม "เครื่องหมายวรรคตอน" ในรายการข้อยกเว้นในข้อแรกได้หรือไม่? มันเป็นไปไม่ได้ที่จะแก้ปัญหานี้ในหลาย ๆ ภาษา
FUZxxl

เกี่ยวข้องแต่อาจแตกต่างกันพอสมควร
Martin Ender

@FUZxxl ฉันอนุญาตให้ใช้เครื่องหมายวรรคตอน แต่ไม่รวมเครื่องหมายขีดล่าง
abligh

1
เพื่อจุดประสงค์ที่นี่มีAและaถือว่า "อักขระ" แตกต่างกันหรือไม่
HostileFork บอกว่าอย่าเชื่อถือ SE

1
มันจะดีกว่าถ้าคุณให้รายชื่อตัวละคร ASCII ที่ตรงกับกฎที่ 5
aditsu ออกเพราะ SE นั้นชั่วร้าย

คำตอบ:


5

GolfScript ขนาด 13 ไบต์

1{\~\".~"}.~

ผลลัพธ์คือ

-2{\~\".~"}.~

ซึ่งสร้างโปรแกรมเริ่มต้น

จำนวนไบต์ประกอบด้วย LF ต่อท้ายเนื่องจากผลลัพธ์ของเอาต์พุตจะมี

ลองออนไลน์

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

1       # Push 1.
{       # Start code block.
  \~\   # Apply logical NOT to the second topmost element of the stack.
  ".~"  # Push that string.
}       # End code block.
.~      # Duplicate the code block and execute the copy.

GolfScript พิมพ์เนื้อหาของสแต็คเมื่อมีการยกเลิก


โปรดอ่านคำแถลงปัญหาอีกครั้ง -Programs A and B may not use any of the same characters, save for whitespace and statement separators, and punctuation characters.
isaacg

1
ทุกอย่าง แต่1และ2เป็นเครื่องหมายวรรคตอน
เดนนิส

ตกลงกฎมีการเปลี่ยนแปลงตั้งแต่ฉันอ่านครั้งล่าสุด
isaacg

ใช่นั่นใช้งานได้ ฉันใช้ถ้อยคำเพื่อป้องกันช่องว่างที่ถูกใช้เป็นคำพูด แต่ลืมช่องโหว่เดียวกันจะมีเครื่องหมายวรรคตอน ดังนั้นช่องโหว่ที่ถูกแสวงหาประโยชน์ทางกฎหมาย
abligh

14

Pascal (731 ตัวอักษร)

โปรแกรม A:

program s;{$h+}uses sysutils;const p='program s;{$h+}uses sysutils;const p=';a='a';aa=''';';aaa='a=''';aaaa='''';aaaaa='begin write(lowercase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),''lower''+''c'',''tm''+''p'',[]),''up''+''c'',''lower''+''c'',[]),''tm''+''p'',''up''+''c'',[])+aa+aaaaa))end.';begin write(upcase(p+aaaa+p+aa+aaa+a+aa+a+aaa+aaaa+aa+aa+a+a+aaa+aaa+aaaa+aa+a+a+a+aaa+aaaa+aaaa+aa+a+a+a+a+aaa+stringreplace(stringreplace(stringreplace(stringreplace(aaaaa,aaaa,aaaa+aaaa,[rfreplaceall]),'lower'+'c','tm'+'p',[]),'up'+'c','lower'+'c',[]),'tm'+'p','up'+'c',[])+aa+aaaaa))end.

เอาท์พุตโปรแกรม B:

PROGRAM S;{$H+}USES SYSUTILS;CONST P='PROGRAM S;{$H+}USES SYSUTILS;CONST P=';A='A';AA=''';';AAA='A=''';AAAA='''';AAAAA='BEGIN WRITE(UPCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),''LOWER''+''C'',''TM''+''P'',[]),''UP''+''C'',''LOWER''+''C'',[]),''TM''+''P'',''UP''+''C'',[])+AA+AAAAA))END.';BEGIN WRITE(LOWERCASE(P+AAAA+P+AA+AAA+A+AA+A+AAA+AAAA+AA+AA+A+A+AAA+AAA+AAAA+AA+A+A+A+AAA+AAAA+AAAA+AA+A+A+A+A+AAA+STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(STRINGREPLACE(AAAAA,AAAA,AAAA+AAAA,[RFREPLACEALL]),'LOWER'+'C','TM'+'P',[]),'UP'+'C','LOWER'+'C',[]),'TM'+'P','UP'+'C',[])+AA+AAAAA))END.

เอาต์พุตโปรแกรม A


3
ฉันสนุกกับการใช้การแปลกรณี (mis)
abligh

11

ROT13 ( ไม่แข่งขันอีกต่อไปหลังจากอัปเดตกฎ )

ไม่แน่ใจว่านี่เป็นภาษาหรือไม่ แต่แน่นอนฉันไม่ได้ทำเรื่องท้าทาย โดยปกติคำตอบสำหรับยูทิลิตี้บางอย่างเช่นsedได้รับการยอมรับเช่นกัน อย่างไรก็ตามมันเป็นการเรียกใช้วิจารณญาณดังนั้นหากไม่นับฉันจะลบออก (มีการสนทนาเมตาที่ไหนสักแห่งในสิ่งที่นับเป็นภาษาหรือไม่แก้ไข: มีอยู่ตอนนี้ )

A

รอบระหว่างAและN:

~>> echo "A" | rot13
N
~>> echo "A" | rot13 | rot13
A

ฉันคิดว่ามันใช้งานไม่ได้เพราะ rot13 กำลังป้อนข้อมูลเพียงอย่างSTDINเดียวไม่ได้เรียกใช้งานโปรแกรม หากคุณกำลังเถียงว่ามันเป็นโปรแกรมที่มีความยาวเป็นศูนย์ที่ล้มเหลวในการตอบสนองการปกครอง 2. โปรแกรม (กับsed) sed -eเป็นสิ่งที่ผ่านใน หากสิ่งนี้เป็นที่ยอมรับก็catจะเป็นควินและtacจะเป็นควินและแอนทีค แต่ไม่มีอะไรคือการผลิตแหล่งที่มาเพื่อcat, หรือสำหรับเรื่องที่tac rot13
abligh

@abligh หาก rot13 ใช้ภาษาทำไมฉันต้องพิมพ์รหัสแหล่งที่มาสำหรับ rot13 นอกจากนี้ถ้าฉันเรียกใช้ Golfscript, Python หรืออะไรก็ตามฉันจะส่งซอร์สโค้ดไปที่มันผ่าน stdin หรือไฟล์ดังนั้นจึงไม่มีความแตกต่างเลย ในกรณีนี้ rot13 คือล่าม
Ingo Bürk

rot13เนื่องจากภาษาการเขียนโปรแกรมดูเหมือนจะไม่ตรงตามคำจำกัดความที่สมเหตุสมผลของ 'ภาษาการเขียนโปรแกรม' และมันไม่ได้แปลความหมายอะไรเลย ฉันจะแก้ไขคำถามเพื่อให้ชัดเจนยิ่งขึ้น
abligh

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