Interquine - Dua program yang saling output dalam satu lingkaran

29

Program A mengeluarkan kode program B saat dijalankan, dan B menampilkan sumber A.

Persyaratan:

  • Hanya satu bahasa di kedua program
  • Program berbeda. Satu program yang menghasilkan sendiri tidak memenuhi syarat.
  • Kedua program tidak kosong, atau paling tidak panjangnya 1 byte. Mengejar baris baru di sumber dan keluaran diabaikan
  • stdin ditutup Jangan membaca apa pun (jadi Anda tidak bisa membaca sumbernya dan memanipulasinya). Output menuju ke stdout.
    Sunting: stdin terhubung ke /dev/null. Anda dapat memesannya ditutup jika diklarifikasi.
  • Jangan gunakan randomfungsi.

Tambahan:

  • Berikan penjelasan jika memungkinkan

Skor adalah total panjang . Mengejar baris baru tidak masuk hitungan jika tidak memengaruhi program.

iBug
sumber
8
Terkait
Martin Ender
5
"Jangan menggunakan fungsi acak."? Apa maksudmu? Fungsi yang menghasilkan angka acak?
Tn. Xcoder
Saya cukup yakin Anda tidak benar-benar berarti stdin ditutup. Ini meledakkan beberapa lingkungan ketika stdin menjadi duplikat dari file yang dibuka pertama kali. Bagaimanapun, jika Anda tidak memperbaikinya saya akan menyalahgunakannya.
Joshua

Jawaban:

18

CJam , 13 + 13 = 26 byte

{sYZe\"_~"}_~

Cobalah online!

Keluaran

{sZYe\"_~"}_~

Penjelasan

{       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.
}_~

Karena e\komutatif dalam operan kedua dan ketiga, program lain melakukan hal yang sama, bertukar Zdan Ykembali ke urutan semula.

Martin Ender
sumber
17

CJam ,11 + 13 = 24 11 + 12 = 23 byte

"N^_p"
N^_p

Cobalah online!

Output:

"N^_p
"
N^_p

Outputnya memiliki 13 byte, tetapi:

Mengejar baris baru tidak masuk hitungan jika tidak memengaruhi program.

Jadi saya mengubah ruang menjadi baris baru untuk mengambil keuntungan dari itu.

Ini didasarkan pada quine terpendek CJam terpendek:

"_p"
_p

Dan N^untuk xor string dengan baris baru, yang menambahkan baris baru jika tidak ada baris baru, dan menghapusnya jika ada, untuk string yang setiap karakter unik.

Saya pikir saya telah melihat quine itu dalam pertanyaan quine, tetapi saya tidak dapat menemukannya.

jimmy23013
sumber
+1 untuk memiliki dua program berukuran berbeda, tidak seperti semua jawaban lain sejauh ini. Sunting: segera setelah saya dapat memilih lagi .. mencapai batas suara terakhir>.>
Kevin Cruijssen
Baik untuk panjangnya berbeda.
iBug
"Kurasa aku sudah melihat quine itu di pertanyaan quine, tapi aku tidak bisa menemukannya." Itu hanya disebutkan dalam jawaban GolfScript.
Martin Ender
12

RProgN 2 , 3 + 3 = 6 byte

Program pertama:

0
1

Cobalah online!

Program kedua:

1
0

Cobalah online!

Terima kasih pada Martin Ender .

Erik the Outgolfer
sumber
7
Anda dapat menyimpan dua byte dengan berpindah bahasa: tio.run/##Kyooyk/P0zX6/9@Ay/D/fwA
Martin Ender
@ MartinEnder Ooh benar aku lupa RProgN 2 menunjukkan perilaku seperti itu ... tapi aku tak tahu apakah masih buggy itu.
Erik the Outgolfer
11
Saya tidak tahu apa-apa tentang RProgN kecuali bahwa perilaku ini ada.
Martin Ender
@MartinEnder Penulis RProgN di sini, tanyakan apakah Anda perlu sesuatu yang diklarifikasi!
ATaco
@ ASaco Yah, saya akan meminta Anda untuk mengklarifikasi downvote tapi saya tidak berpikir Anda bisa ...
Erik the Outgolfer
6

C, 95 + 95 = 190 byte

Terima kasih kepada @immibis karena telah menghemat 16 * 2 byte!

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);}

Cobalah online!

Output:

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);}

Cobalah online!

Output yang mana:

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);}
Steadybox
sumber
1
Mengapa tidak selalu menyebutnya C selalu, dan andalkan saya berubah untuk membuat program berbeda? C lebih pendek dari% c
user253751
@immibis Ya, Anda benar, itu sudah cukup.
Steadybox
5

Javascript, 67 + 67 = 134 byte

Program 1:

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

Program 2:

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

Ini berdasarkan jawaban Herman Lauenstein terhadap Tri-interquine

Javascript (Kode sumber bertuliskan tidak valid), 75 + 75 = 150 61 + 61 = 122 58 + 58 = 116 50 + 50 = 100 byte

menyimpan 20 byte berkat Tushar, 6 byte berkat Craig Ayre, dan menyimpan 16 byte berkat kamoroso94

Program 1:

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

Program 2:

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

Swap 1s dengan 0s dan sebaliknya. Mereka berdua melakukan hal yang sama, hanya menghasilkan keluaran yang berbeda karena kode sumber mereka.

SuperStormer
sumber
1
Mari kita simpan beberapa byte. f.toString()=> (''+f), (0|1)=> 0|1, (a,b)=> amenghasilkanf=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
Tushar
Anda dapat menggunakan parameter yang tidak digunakan untuk menyimpan beberapa byte f=_=>dan menghapus paren dari callback ganti seperti yang disarankan @Tushar:a=>+!+a
Craig Ayre
Ganti "f="+(f+"")dengan ("f="+f)-3 byte.
kamoroso94
Ganti /0|1/gdan /1|0/gdengan 0dan 1masing-masing untuk -5 byte.
kamoroso94
Apakah Anda menjalankannya? Ini berfungsi seperti ini f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f().
kamoroso94
4

Python 2, 63 + 63 = 126 byte

Cobalah online

Program pertama:

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

output:

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

Program kedua:

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

Output:

A='A=%r;print A[:23]%%A+A[29:35]23:29]';print A[:23]%A+A[23:29]
Possum Mati
sumber
4

JavaScript ( JsShell ), 35 + 34 = 69 byte

1:

(f=x=>print(`(f=${f})(${-x})`))(-1)

2:

(f=x=>print(`(f=${f})(${-x})`))(1)
tsh
sumber
3

Mathematica, 43 + 44 = 87 byte

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

dan

(Print[#1[#0[#1, -#2]]] & )[HoldForm, -(-1)]
alephalpha
sumber
Mengujinya di komputer saya dan output yang kedua hanya memiliki -1pada akhirnya, tidak -1 1.
numbermaniac
@numbermaniac Saya menulis kode-kode ini di antarmuka berbasis teks. Tampaknya mereka tidak berfungsi di notebook.
alephalpha
3

asmutils sh, 16 + 16 byte, menyalahgunakan aturan "stdin is closed".

#!/bin/sh
tr x y

Karena stdin ditutup dan sh akan membuka skripnya ke gagang pertama yang tersedia (alih-alih memindahkannya ke gagang bernomor tinggi seperti cangkang modern), tr akhirnya membaca dari salinan skrip tanpa pernah membukanya.

Interquine ini mampu payload tetapi memasukkan payload itu sulit.

Selain itu, versi asli ini menyalahgunakan beberapa bug gila di kernel kuno yang saya gunakan pada masa itu. (Saya tidak tahu ada apa dengan kernel itu - saya menemukan kemudian bahwa itu juga memiliki nomor utama dan kecil yang berbeda untuk perangkat.) Jika Anda memperbaiki perubahan ABI yang melanggar asmutils interquine masih tidak akan berfungsi. Saya lupa apakah asmutils sh memiliki exec atau tidak, tetapi jika ya, ini adalah versi modern:

exec dd skip=0 | tr x y

Ini menyalahgunakan bug yang disengaja di asmutils dd; ia memiliki optimasi kinerja yang dipanggil llseek untuk dilewati jika bisa, tetapi untuk menyimpan byte melewati SEEK_SET daripada SEEK_CUR. Ini menghasilkan sampah pada stderr tetapi interquine pada stdout. Asmutils dd tidak memiliki opsi untuk menekan spam stderr.

Joshua
sumber
Apakah ini akan berfungsi jika stdin di terhubung /dev/null? Ngomong-ngomong, kerja bagus!
iBug
@ iBug: Tidak. Bergantung sepenuhnya pada stdin tertutup dan fakta bahwa asmutils sh tidak terkait dengan libc dan jadi tidak mewarisi kode perbaikan otomatis di libc.
Yosua
Apakah Anda memerlukannya #!/bin/sh?
CalculatorFeline
@ CalculatorFeline: itu tergantung pada ketepatan definisi Anda tentang sesuatu yang lain.
Joshua
Secara umum, shebang tidak dihitung, jadi ini akan menjadi 6 byte.
CalculatorFeline
1

Gangguan Umum, 58 karakter

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

... atau 24 karakter jika Anda tidak keberatan dengan asumsi *print-circle*secara global disetel ke T:

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

Representasi dicetak dari kode dibaca sebagai struktur siklik, di mana #1#menunjuk kembali ke sel kontra berikut #1=. Kami mengutip program sehingga tidak dieksekusi. Karena *print-circle*T, REPL dengan hati-hati memancarkan variabel pembaca seperti itu selama pencetakan; inilah yang dicetak oleh kode di atas, dan mengembalikan:

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

Ketika kami mengevaluasi kode di atas, ia mencetak:

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

Jika Anda ingin tetap menggunakan nilai default untuk *print-circle*, yaitu NIL dalam implementasi yang sesuai, maka Anda harus mengubah variabel untuk sementara:

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

Di dalam tubuh LET, kita mencetak sesuatu dengan *print-circle*menjadi T. Jadi kita memperoleh:

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

Seperti yang Anda lihat, program baru tidak rebind *print-circle*, tetapi karena kami menggunakan write, yang merupakan fungsi tingkat rendah yang dipanggil oleh print, kami dapat memberikan argumen tambahan seperti :circle. Kode kemudian berfungsi seperti yang diharapkan:

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

Namun, Anda perlu menjalankan program di atas sebagai skrip, bukan di dalam REPL, karena meskipun Anda mencetak sesuatu sambil menjaga struktur melingkar, keduanya writedan printjuga mengembalikan nilai yang sedang dicetak; dan dalam REPL default, nilainya juga sedang dicetak, tetapi di luar konteks dinamis di mana *print-circle*T.

coredump
sumber
1

> <> , 16 + 16 = 32 byte

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

dan

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

Cobalah online!

Ini bekerja dengan menggunakan lompatan dalam program, lompatan program pertama akan melewati kebalikan dari tumpukan (jika membalik tumpukan itu akan menjadi quine). Program kedua tidak melewatkan kebalikannya tetapi jika sudah terbalik oleh aliran program maka itu akan membuat yang asli.

Kode ini akan berakhir dengan kesalahan.

Pelican teal
sumber
1

RProgN 2 , 7 + 7 = 14 byte

Saya ingin mencoba memamerkan penggunaan RProgN yang lebih baik, daripada hanya menyalahgunakan pesanan cetak ...

1
«\1\-

dan...

0
«\1\-

Dijelaskan

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.

Karena ini mencetak tumpukan terbalik, konstanta baru dicetak pertama, kemudian versi stringif fungsi dicetak.

Cobalah online!

ATaco
sumber
1

LOGO , 65 + 66 = 131 byte

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] 1]

dan

apply [(pr ? ` [[,? ,-?2]] )] [[apply [(pr ? ` [[,? ,-?2]] )]] -1]
pengguna202729
sumber
1

Python 3, 74 + 74 = 148 byte

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

dan

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

Saya juga tidak mengerti

aaay aaay
sumber
1

> <> , 12 + 12 = 24 byte

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

dan

':c-!|o|!*d3

Cobalah online!

Kedua program menggunakan string pembungkus literal untuk menambahkan kode ke stack, kemudian menghasilkan 'perintah melalui metode yang berbeda. Saat mencetak tumpukan itu mendorong kode mundur, namun 'tetap di depan. Ada beberapa variasi yang menghasilkan '; 3d*, d3*, 00g, :c-Ketika dipasangkan dengan 3d*dan :9-ketika dipasangkan dengan 00g.

Solusi yang terlalu mirip dengan posting, di Befunge-98 selama 13 * 2 byte

"2+ck, @,kc+2
Jo King
sumber
0

Javascript (ES6), 36 + 36 = 72 byte

Program 1:

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

Program 2:

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

Program-program ini bekerja dengan mengkloning diri mereka sendiri dan mengganti 5dengan 4dan 4dengan5

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)
)())

Herman L.
sumber
2
Karena ini ditandai quine , inilah yang biasanya dianggap sebagai "curang curang", karena membaca sumbernya sendiri. Tidak yakin apa keputusan OP tentang hal itu, tetapi biasanya tidak diizinkan.
Stephen
0

Klein , 26 24 byte

<:3+@+3<:"

Cobalah online!

Penjelasan

Ini berfungsi sama dengan Klein Quine saya , di mana ia mencetak sumber mundur diikuti oleh ", yang terakhir lolos dengan menjadi palindromic, jadi yang perlu kita lakukan adalah membuatnya non-palindromic tanpa merusak fungsinya. Dengan beralih <dan :kami dapat melakukan ini tanpa mengganggu fungsionalitas.

Wisaya Gandum
sumber