Interquine - สองโปรแกรมที่แสดงผลออกมาเป็นวง


29

โปรแกรม A เอาท์พุทโค้ดของโปรแกรม B เมื่อทำงานและ B เอาต์พุตของแหล่ง A

ที่ต้องการ:

  • เพียงหนึ่งภาษาในทั้งสองโปรแกรม
  • โปรแกรมต่างกัน โปรแกรมหนึ่งที่ออกเองไม่มีสิทธิ์ได้รับ
  • ทั้งสองโปรแกรมไม่ว่างเปล่าหรือมีความยาวอย่างน้อย 1 ไบต์ ขึ้นบรรทัดใหม่ในทั้งแหล่งที่มาและเอาท์พุทจะถูกละเว้น
  • stdin ถูกปิด อย่าอ่านอะไรเลย (ดังนั้นคุณไม่สามารถอ่านต้นฉบับและปรับเปลี่ยนได้) เอาต์พุตไปที่ stdout
    แก้ไข: stdin /dev/nullเชื่อมต่อกับ คุณสามารถสั่งซื้อได้ถ้าปิด
  • ห้ามใช้randomฟังก์ชั่น

เพิ่มเติม:

  • ให้คำอธิบายถ้าเป็นไปได้

คะแนนเป็นความยาวรวม การขึ้นบรรทัดใหม่จะไม่นับหากไม่มีผลกับโปรแกรม



5
"อย่าใช้ฟังก์ชั่นแบบสุ่ม"? คุณหมายถึงอะไร ฟังก์ชั่นที่ส่งออกตัวเลขสุ่ม?
Mr. Xcoder


ฉันค่อนข้างแน่ใจว่าคุณไม่ได้หมายความว่า stdin ถูกปิด สิ่งนี้จะระเบิดสภาพแวดล้อมบางอย่างเมื่อ stdin กลายเป็นไฟล์ที่ซ้ำกันของไฟล์ที่เปิดครั้งแรก อย่างไรก็ตามถ้าคุณไม่แก้ไขฉันจะใช้มันในทางที่ผิด
Joshua

คำตอบ:


18

CJam , 13 + 13 = 26 bytes

{sYZe\"_~"}_~

ลองออนไลน์!

เอาท์พุท

{sZYe\"_~"}_~

คำอธิบาย

{       e# Standard quine framework, leaves a copy of the block on the stack
        e# for the block itself to process.
  s     e# Stringify the block.
  YZe\  e# Swap the characters at indices 2 and 3, which are Y and Z themselves.
  "_~"  e# Push the "_~" to complete the quine.
}_~

เนื่องจากe\มีการสับเปลี่ยนในตัวถูกดำเนินการที่สองและสามของโปรแกรมอื่น ๆ ที่เหมือนกันอย่างแน่นอนการแลกเปลี่ยนZและYกลับสู่ลำดับเดิม


17

CJam ,11 + 13 = 24 11 + 12 = 23 ไบต์

"N^_p"
N^_p

ลองออนไลน์!

ขาออก:

"N^_p
"
N^_p

ผลลัพธ์มี 13 ไบต์ แต่:

การขึ้นบรรทัดใหม่จะไม่นับหากไม่มีผลกับโปรแกรม

ดังนั้นฉันจึงเปลี่ยนช่องว่างเป็นบรรทัดใหม่เพื่อใช้ประโยชน์จากสิ่งนั้น

มันขึ้นอยู่กับ quine ที่เหมาะสมของ CJam ที่สั้นที่สุด:

"_p"
_p

และN^คือการ xor สตริงที่มีการขึ้นบรรทัดใหม่ซึ่งเพิ่มขึ้นบรรทัดใหม่หากไม่มีการขึ้นบรรทัดใหม่และลบออกหากมีสำหรับสตริงที่อักขระแต่ละตัวไม่ซ้ำกัน

ฉันคิดว่าฉันเคยเห็นควินินในคำถามควินิน แต่ฉันหามันไม่เจอ


+1 สำหรับการมีโปรแกรมขนาดแตกต่างกันสองรายการซึ่งแตกต่างจากคำตอบอื่น ๆ ทั้งหมด แก้ไข: ทันทีที่ฉันสามารถลงคะแนนได้อีกครั้ง .. ถึงขีด จำกัด การโหวตล่าสุด>.>
Kevin Cruijssen

ดีสำหรับความยาวที่แตกต่าง
iBug

"ฉันคิดว่าฉันเคยเห็นควินินในคำถามควินิน แต่ฉันหามันไม่เจอ" มันถูกกล่าวถึงในคำตอบ GolfScript เท่านั้น
Martin Ender

12

RProgN 2 , 3 + 3 = 6 ไบต์

โปรแกรมแรก:

0
1

ลองออนไลน์!

โปรแกรมที่สอง:

1
0

ลองออนไลน์!

-2 ขอบคุณที่มาร์ตินเอนเดอร์


7
คุณสามารถบันทึกสองไบต์ด้วยการสลับภาษา: tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Martin Ender

@MartinEnder Ooh ถูกต้องฉันลืม RProgN 2 จัดแสดงพฤติกรรมดังกล่าว ... btw ฉันไม่ทราบว่าถ้ามันยังคงเป็นรถ
Erik the Outgolfer

11
ฉันไม่รู้อะไรเลยเกี่ยวกับ RProgN ยกเว้นว่าพฤติกรรมนี้มีอยู่
Martin Ender

@MartinEnder ผู้เขียน RProgN ที่นี่เพียงแค่ถามว่าคุณต้องการอะไรที่ชัดเจน!
ATaco

@ ATaco ดีฉันได้ขอให้คุณชี้แจง downvote แต่ฉันไม่คิดว่าคุณจะสามารถ ...
Erik the Outgolfer

6

C, 95 + 95 = 190 ไบต์

ขอบคุณ @immibis สำหรับการบันทึก 16 * 2 ไบต์!

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

ลองออนไลน์!

ขาออก:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=0^1;printf(s,34,s,34,i);}

ลองออนไลน์!

ผลลัพธ์ใด:

char*s="char*s=%c%s%c;main(i){i=%d^1;printf(s,34,s,34,i);}";main(i){i=1^1;printf(s,34,s,34,i);}

1
ทำไมไม่เพียงแค่เรียกมันว่า C เสมอและพึ่งพาฉันเปลี่ยนเพื่อทำให้โปรแกรมแตกต่างกันอย่างไร C สั้นกว่า% c
user253751

@immibis ใช่คุณพูดถูก
Steadybox

5

Javascript, 67 + 67 = 134 ไบต์

โปรแกรมที่ 1:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=0))

โปรแกรมที่สอง:

alert(eval(c="`alert(eval(c=${JSON.stringify(c)},n=${+!n}))`",n=1))

สิ่งนี้มีพื้นฐานมาจากคำตอบของ Herman Lauenstein ต่อ Tri-interquine

Javascript (รหัสที่มาอ่านไม่ถูกต้อง), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 ไบต์

บันทึกไว้ 20 ไบต์ด้วย Tushar, ขอบคุณ 6 ไบต์จาก Craig Ayre และบันทึกไว้ 16 ไบต์ด้วย kamoroso94

โปรแกรมที่ 1:

f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()

โปรแกรมที่สอง:

f=_=>alert(("f="+f).replace(1,a=>+!+a)+";f()");f()

สลับ 1s ด้วย 0s และในทางกลับกัน พวกเขาทั้งสองทำสิ่งเดียวกันเพียงแค่สร้างเอาต์พุตที่ต่างกันเนื่องจากซอร์สโค้ด


1
ลองบันทึกสองสามไบต์ f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> aส่งผลให้f=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar

คุณสามารถใช้พารามิเตอร์ที่ไม่ได้ใช้เพื่อบันทึกสองสามไบต์f=_=>และลบ parens ออกจากการเรียกกลับที่แทนที่ตามที่ @Tushar แนะนำ:a=>+!+a
Craig Ayre

แทนที่"f="+(f+"")ด้วย("f="+f)-3 ไบต์
kamoroso94

แทนที่/0|1/gและ/1|0/gด้วย0และ1ตามลำดับสำหรับ -5 ไบต์
kamoroso94

คุณเรียกใช้หรือไม่ f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()การทำงานเช่นนี้
kamoroso94

4

Python 2, 63 + 63 = 126 ไบต์

ลองออนไลน์

โปรแกรมแรก:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]

เอาท์พุท:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

โปรแกรมที่สอง:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[29:35]

ขาออก:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]


3

Mathematica, 43 + 44 = 87 bytes

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -1 1]

และ

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]

ทดสอบบนคอมพิวเตอร์ของฉันและการส่งออกของหนึ่งวินาทีเท่านั้นมีที่สิ้นสุดไม่ได้-1 -1 1
numbermaniac

@numbermaniac ฉันเขียนโค้ดเหล่านี้ในส่วนต่อประสานข้อความ ดูเหมือนว่าพวกเขาจะไม่ทำงานในสมุดบันทึก
alephalpha

3

asmutils sh, 16 + 16 bytes, ละเมิดกฎ "stdin is closed"

#!/bin/sh
tr x y

เนื่องจาก stdin ถูกปิดและ sh จะเปิดสคริปต์ไปยังหมายเลขอ้างอิงที่พร้อมใช้งานครั้งแรก (แทนที่จะย้ายไปยังหมายเลขอ้างอิงที่มีหมายเลขสูงเช่นที่ทันสมัย ​​shells ทำ), tr สิ้นสุดการอ่านจากสำเนาของสคริปต์โดยไม่ต้องเปิด

Interquine นี้มีความสามารถในการบรรจุข้อมูล แต่การใส่ในที่บรรทุกนั้นเป็นเรื่องที่ยุ่งยาก

นอกจากนี้เวอร์ชั่นดั้งเดิมนี้ยังละเมิดข้อผิดพลาดบางอย่างที่บ้าคลั่งในเคอร์เนลโบราณที่ฉันใช้ในสมัยนั้น (ฉันไม่รู้ว่าเกิดอะไรขึ้นกับเคอร์เนลนั้น - ฉันค้นพบในภายหลังว่ามันมีหมายเลขหลักและรองสำหรับอุปกรณ์ต่าง ๆ เช่นกัน) ถ้าคุณแก้ไขการเปลี่ยนแปลง ABI ที่ทำลาย asmutils interquine จะไม่ทำงาน ฉันลืมว่า asmutils sh มี exec หรือไม่ แต่ถ้ามันเป็นเช่นนี้เป็นรุ่นที่ทันสมัย:

exec dd skip=0 | tr x y

นี่เป็นการละเมิดข้อผิดพลาดโดยเจตนาใน asmutils dd; มันมีการปรับประสิทธิภาพให้เหมาะสมซึ่งเรียกใช้ llseek เพื่อข้ามหากทำได้ แต่เพื่อบันทึกไบต์มันจะผ่าน SEEK_SET แทนที่จะเป็น SEEK_CUR ซึ่งส่งผลให้ขยะใน stderr แต่ interquine ใน stdout Asmutils dd ไม่มีตัวเลือกในการยับยั้งสแปม stderr


จะใช้งานได้หรือไม่หาก stdin เชื่อมต่อกับ/dev/nullแทนหรือไม่ อย่างไรก็ตามงานดี!
iBug

@iBug: ไม่ ขึ้นอยู่กับ stdin อย่างเต็มที่และความจริงที่ว่า asmutils sh ไม่ได้เชื่อมโยงกับ libc และดังนั้นจึงไม่ได้รับรหัสซ่อมรถยนต์ใน libc
Joshua

คุณต้องการ#!/bin/sh?
CalculatorFeline

@CalculatorFeline: ขึ้นอยู่กับความถูกต้องของคำนิยามของคุณในสิ่งอื่น
Joshua

โดยทั่วไป shebangs จะไม่ถูกนับดังนั้นนี่จะเป็น 6 ไบต์
CalculatorFeline


1

เสียงกระเพื่อมสามัญ 58 ตัวอักษร

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

... หรือ 24 ตัวอักษรหากคุณไม่คิดว่า*print-circle*จะถูกตั้งค่าเป็นT:

#1=(print '(write '#1#))

การพิมพ์รหัสแทนจะถูกอ่านเป็นโครงสร้างแบบวงกลมซึ่ง#1#ชี้ไปที่เซลล์ข้อเสียที่ตาม#1=มา เราเสนอราคาโปรแกรมเพื่อไม่ให้ดำเนินการ เนื่องจาก*print-circle*เป็น T ดังนั้น REPL จะปล่อยตัวแปรตัวอ่านดังกล่าวในระหว่างการพิมพ์ นี่คือสิ่งที่โค้ดข้างต้นพิมพ์ออกมาและคืนค่า:

#1=(write '(print '#1#)) 

เมื่อเราประเมินโค้ดข้างต้นมันจะพิมพ์:

#1=(print '(write '#1#))

หากคุณต้องการที่จะยึดติดกับค่าเริ่มต้นสำหรับ*print-circle*ซึ่งเป็น NIL ในการใช้งานที่สอดคล้องคุณจะต้องเชื่อมโยงตัวแปรชั่วคราว:

#1=(let((*print-circle* t))(print'(write '#1# :circle t)))

ภายในเนื้อความของ LET เราพิมพ์สิ่งต่าง ๆ ด้วย*print-circle*การเป็น T ดังนั้นเราจึงได้รับ:

#1=(write
    '(let ((*print-circle* t))
       (print '#1#))
    :circle t) 

ที่คุณสามารถดูโปรแกรมใหม่ไม่ rebind *print-circle*แต่เนื่องจากเราจะใช้writeซึ่งเป็นฟังก์ชั่นในระดับต่ำที่เรียกว่าโดยเราสามารถส่งผ่านอาร์กิวเมนต์เพิ่มเติมเช่นprint :circleรหัสนั้นทำงานตามที่คาดไว้:

#1=(let ((*print-circle* t))
     (print '(write '#1# :circle t)))

อย่างไรก็ตามคุณต้องดำเนินการโปรแกรมด้านบนเป็นสคริปต์ไม่ใช่ใน REPL เพราะแม้ว่าคุณจะพิมพ์สิ่งต่าง ๆ ในขณะที่ดูแลโครงสร้างแบบวงกลมทั้งคู่writeและprintส่งคืนค่าที่พิมพ์ และใน REPL เริ่มต้นค่าจะถูกพิมพ์ด้วยเช่นกัน แต่อยู่นอกบริบทแบบไดนามิกที่*print-circle*เป็น T


1

> <> , 16 + 16 = 32 ไบต์

":1-}80.r   !#o#

และ

#o#!   r.08}-1:"

ลองออนไลน์!

วิธีนี้ใช้งานได้โดยใช้การกระโดดในโปรแกรมการกระโดดครั้งแรกของโปรแกรมจะข้ามการย้อนกลับของสแต็ก (ถ้าสลับกลับสแต็ก โปรแกรมที่สองไม่ได้ข้ามการย้อนกลับ แต่เป็นการย้อนกลับโดยการไหลของโปรแกรมแล้วมันจะสร้างต้นฉบับ

รหัสนี้จะสิ้นสุดในข้อผิดพลาด


1

RProgN 2 , 7 + 7 = 14 ไบต์

ฉันต้องการที่จะแสดงให้เห็นถึงการใช้งาน RProgN ที่ดีขึ้นมากกว่าเพียงแค่ใช้คำสั่งพิมพ์ที่ไม่เหมาะสม ...

1
«\1\-

และ...

0
«\1\-

อธิบาย

1   # Push the constant, 1. (Or 0, depending on the program)

«\1\-
«       # Define a function from this to the matching », in this case there isn't any, so define it from this to the end of the program, then continue processing.
 \      # Flip the defined function under the constant.
  1\-   # Get 1 - Constant.

เนื่องจากสิ่งนี้พิมพ์สแต็กคว่ำค่าคงที่ใหม่จะถูกพิมพ์ก่อนจากนั้นจึงพิมพ์ฟังก์ชันที่เป็นสตริง

ลองออนไลน์!



1

Python 3, 74 + 74 = 148 ไบต์

a='a=%r;b=%r;print(b%%(b,a))';b='b=%r;a=%r;print(a%%(a,b))';print(b%(b,a))

และ

b='b=%r;a=%r;print(a%%(a,b))';a='a=%r;b=%r;print(b%%(b,a))';print(a%(a,b))

ฉันก็ไม่เข้าใจเหมือนกัน


1

> <> , 12 + 12 = 24 ไบต์

'3d*!|o|!-c:

และ

':c-!|o|!*d3

ลองออนไลน์!

โปรแกรมทั้งสองใช้สตริงการตัดตามตัวอักษรเพื่อเพิ่มรหัสลงในสแต็กจากนั้นสร้าง'คำสั่งผ่านวิธีการต่างๆ เมื่อพิมพ์สแต็กมันจะดันรหัสไปข้างหลังอย่างไรก็ตาม'อยู่ที่ด้านหน้า มีหลายรูปแบบที่ผลิต';3d*, d3*, 00g, :c-เมื่อจับคู่กับ3d*และ:9-เมื่อจับคู่กับ00gเมื่อจับคู่กับ

โซลูชันที่คล้ายกันมากเกินไปในการโพสต์ใน Befunge-98 สำหรับ 13 * 2 ไบต์

"2+ck, @,kc+2

1

สแตกซ์ , 18 + 20 = 38 ไบต์

"Vn|^34bL"Vn|^34bL

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

"Vn|^34bL
"Vn|^34bL

เรียกใช้และแก้ไขข้อบกพร่องออนไลน์!

คำอธิบาย

เพิ่มเพื่อความสมบูรณ์ คำตอบ CJam ของพอร์ต @ @ jimmy23013 สลับการขึ้นบรรทัดใหม่โดยใช้ set xor


0

Javascript (ES6), 36 + 36 = 72 ไบต์

โปรแกรม 1:

f=n=>('f='+f).replace(/4|5/g,n=>n^1)

โปรแกรม 2:

f=n=>('f='+f).replace(/5|4/g,n=>n^1)

โปรแกรมเหล่านี้ทำงานโดยการโคลนตัวเองและแทนที่5ด้วย4และ4ด้วย5

console.log((
    f=n=>('f='+f).replace(/4|5/g,n=>n^1)
)())
console.log((
    f=n=>('f='+f).replace(/5|4/g,n=>n^1)
)())


2
เนื่องจากนี่คือแท็กควินนี่คือสิ่งที่มักจะได้รับการพิจารณาว่าเป็น "การโกงควินิน" เนื่องจากมันจะอ่านแหล่งที่มาของตัวเอง ไม่แน่ใจว่าการตัดสินใจของ OP นั้นคืออะไร แต่มักจะไม่ได้รับอนุญาต
Stephen

0

ไคลน์ , 26 24 ไบต์

<:3+@+3<:"

ลองออนไลน์!

คำอธิบาย

งานนี้เหมือนกัน Klein Quine ของฉันซึ่งมันพิมพ์ต้นฉบับไปด้านหลังตามด้วย a ", อันสุดท้ายก็หายไปได้ด้วยการเป็น Palindromic ดังนั้นสิ่งที่เราต้องทำก็คือทำให้มันไม่ใช่ Palindromic โดยไม่ทำลายการทำงานของมัน ด้วยการสลับ<และ:เราสามารถทำสิ่งนี้ได้โดยไม่รบกวนการทำงาน


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