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 ditutupJangan 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
random
fungsi.
Tambahan:
- Berikan penjelasan jika memungkinkan
Skor adalah total panjang . Mengejar baris baru tidak masuk hitungan jika tidak memengaruhi program.
Jawaban:
CJam , 13 + 13 = 26 byte
Cobalah online!
Keluaran
Penjelasan
Karena
e\
komutatif dalam operan kedua dan ketiga, program lain melakukan hal yang sama, bertukarZ
danY
kembali ke urutan semula.sumber
CJam ,
11 + 13 = 2411 + 12 = 23 byteCobalah online!
Output:
Outputnya memiliki 13 byte, tetapi:
Jadi saya mengubah ruang menjadi baris baru untuk mengambil keuntungan dari itu.
Ini didasarkan pada quine terpendek CJam terpendek:
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.
sumber
RProgN 2 , 3 + 3 = 6 byte
Program pertama:
Cobalah online!
Program kedua:
Cobalah online!
Terima kasih pada Martin Ender .
sumber
C, 95 + 95 = 190 byte
Terima kasih kepada @immibis karena telah menghemat 16 * 2 byte!
Cobalah online!
Output:
Cobalah online!
Output yang mana:
sumber
Javascript, 67 + 67 = 134 byte
Program 1:
Program 2:
Ini berdasarkan jawaban Herman Lauenstein terhadap Tri-interquine
Javascript (Kode sumber bertuliskan tidak valid),
75 + 75 = 15061 + 61 = 12258 + 58 = 11650 + 50 = 100 bytemenyimpan 20 byte berkat Tushar, 6 byte berkat Craig Ayre, dan menyimpan 16 byte berkat kamoroso94
Program 1:
Program 2:
Swap 1s dengan 0s dan sebaliknya. Mereka berdua melakukan hal yang sama, hanya menghasilkan keluaran yang berbeda karena kode sumber mereka.
sumber
f.toString()
=>(''+f)
,(0|1)
=>0|1
,(a,b)
=>a
menghasilkanf=()=>("f="+(''+f).replace(/0|1/g,a=>a==0?1:0)+";f()");f()
f=_=>
dan menghapus paren dari callback ganti seperti yang disarankan @Tushar:a=>+!+a
"f="+(f+"")
dengan("f="+f)
-3 byte./0|1/g
dan/1|0/g
dengan0
dan1
masing-masing untuk -5 byte.f=_=>alert(("f="+f).replace(0,a=>+!+a)+";f()");f()
.Python 2, 63 + 63 = 126 byte
Cobalah online
Program pertama:
output:
Program kedua:
Output:
sumber
JavaScript ( JsShell ), 35 + 34 = 69 byte
1:
2:
sumber
Mathematica, 43 + 44 = 87 byte
dan
sumber
-1
pada akhirnya, tidak-1 1
.asmutils sh, 16 + 16 byte, menyalahgunakan aturan "stdin is closed".
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:
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.
sumber
/dev/null
? Ngomong-ngomong, kerja bagus!#!/bin/sh
?Underload , 32 + 32 = 64 byte
Cobalah online!
Cobalah online!
sumber
Gangguan Umum, 58 karakter
... atau 24 karakter jika Anda tidak keberatan dengan asumsi
*print-circle*
secara global disetel keT
: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:Ketika kami mengevaluasi kode di atas, ia mencetak:
Jika Anda ingin tetap menggunakan nilai default untuk
*print-circle*
, yaitu NIL dalam implementasi yang sesuai, maka Anda harus mengubah variabel untuk sementara:Di dalam tubuh LET, kita mencetak sesuatu dengan
*print-circle*
menjadi T. Jadi kita memperoleh:Seperti yang Anda lihat, program baru tidak rebind
*print-circle*
, tetapi karena kami menggunakanwrite
, yang merupakan fungsi tingkat rendah yang dipanggil olehprint
, kami dapat memberikan argumen tambahan seperti:circle
. Kode kemudian berfungsi seperti yang diharapkan:Namun, Anda perlu menjalankan program di atas sebagai skrip, bukan di dalam REPL, karena meskipun Anda mencetak sesuatu sambil menjaga struktur melingkar, keduanya
write
danprint
juga mengembalikan nilai yang sedang dicetak; dan dalam REPL default, nilainya juga sedang dicetak, tetapi di luar konteks dinamis di mana*print-circle*
T.sumber
> <> , 16 + 16 = 32 byte
dan
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.
sumber
RProgN 2 , 7 + 7 = 14 byte
Saya ingin mencoba memamerkan penggunaan RProgN yang lebih baik, daripada hanya menyalahgunakan pesanan cetak ...
dan...
Dijelaskan
Karena ini mencetak tumpukan terbalik, konstanta baru dicetak pertama, kemudian versi stringif fungsi dicetak.
Cobalah online!
sumber
LOGO , 65 + 66 = 131 byte
dan
sumber
Python 3, 74 + 74 = 148 byte
dan
Saya juga tidak mengertisumber
> <> , 12 + 12 = 24 byte
dan
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 dengan3d*
dan:9-
ketika dipasangkan dengan00g
.Solusi yang terlalu mirip dengan posting, di Befunge-98 selama 13 * 2 byte
sumber
Stax , 18 + 20 = 38 byte
Jalankan dan debug online!
Jalankan dan debug online!
Penjelasan
Ditambahkan untuk kelengkapan. Port dari jawaban CJam @ jimmy23013. Mengalihkan baris baru menggunakan set xor.
sumber
Javascript (ES6), 36 + 36 = 72 byte
Program 1:
Program 2:
Program-program ini bekerja dengan mengkloning diri mereka sendiri dan mengganti
5
dengan4
dan4
dengan5
sumber
Klein ,
2624 byteCobalah 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.sumber
Pari / GP , 36 + 36 = 72 byte
Cobalah online!
Cobalah online!
sumber