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.



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.


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.


+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 .


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

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.


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]

4

JavaScript ( JsShell ), 35 + 34 = 69 byte

1:

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

2:

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

3

Mathematica, 43 + 44 = 87 byte

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

dan

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

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.


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.


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.


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!


1

LOGO , 65 + 66 = 131 byte

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

dan

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

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


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


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


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.


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.