Polyquine adalah quine dan polyglot. 1 Anda harus menulis quine yang valid setidaknya dalam dua bahasa yang berbeda. Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.
1 Aku mengarangnya. Atau lebih tepatnya, Geobits melakukannya . Tampaknya, dia juga bukan yang pertama .
Aturan untuk Quines
Hanya quine sejati yang diterima. Artinya, Anda perlu mencetak seluruh kode sumber kata demi kata ke STDOUT, tanpa :
- membaca kode sumber Anda, secara langsung atau tidak langsung.
- mengandalkan lingkungan REPL yang hanya mengevaluasi dan mencetak setiap ekspresi yang Anda berikan.
- mengandalkan fitur bahasa yang hanya mencetak sumber dalam kasus tertentu.
- menggunakan pesan kesalahan atau STDERR untuk menulis semua atau sebagian quine. (Anda dapat menulis sesuatu ke STDERR atau menghasilkan peringatan / kesalahan non-fatal selama STDOUT adalah quine yang valid dan pesan kesalahan bukan bagian dari itu.)
Selanjutnya, kode Anda harus mengandung string literal.
Aturan untuk Polyglots
Dua bahasa yang digunakan harus berbeda. Khususnya:
- Itu tidak boleh versi yang berbeda dari bahasa yang sama (misalnya Python 2 vs Python 3).
- Mereka tidak boleh dialek yang berbeda dari bahasa yang sama (misalnya Pascal vs Delphi).
- Satu bahasa mungkin bukan bagian dari yang lain (misalnya C vs C ++).
Jawaban:
CJam / GolfScript, 34 byte
Hitungan byte berisi linefeed baris, karena program tidak akan menjadi quine tanpanya.
Sementara CJam dan GolfScript sangat mirip dalam beberapa aspek, ada banyak perbedaan. Untuk membuat ini menjadi polyquine "jujur", saya memutuskan untuk mengandalkan perbedaan sebanyak mungkin. Kecuali untuk sintaksis blok dan string (yang dibagi dengan bahasa oh begitu banyak yang lain), tidak ada bagian kode yang mencapai persis sama di kedua bahasa.
Interpreter GolfScript online memiliki bug; program ini hanya bekerja dengan penerjemah resmi.
Contoh dijalankan
Bagaimana cara kerjanya (CJam)
Bagaimana cara kerjanya (GolfScript)
CJam / GolfScript, 12 byte
Solusi Cheaty yang menghindari perbedaan bahasa sebanyak mungkin.
Cobalah online:
Bagaimana cara kerjanya (CJam)
Bagaimana cara kerjanya (GolfScript)
sumber
C # / Java, 746 byte
Saya menggunakan properti yang karakter di Jawa dapat ditulis sebagai urutan unicode identik. Jika kami memiliki
A
instruksi untuk kompiler C # danB
instruksi untuk Java, kami dapat menggunakan fragmen kode berikut:Itu akan "dikenali" dengan cara berikut dengan C #:
Dan dengan cara berikut oleh Java:
Karena
\u000A
is line break,\u002F
is/
dan\u002A
is*
in Java.Jadi polyglot-quine terakhir adalah:
Namun, ukurannya terlalu besar karena verbositas bahasa.
Kompilasi tersedia di ideone.com: C # , Java .
sumber
Python 3 dan JavaScript, 134 byte
Ini usaha saya (terakhir?):
Mungkin bisa bermain golf sedikit lebih, terutama jika ada yang tahu cara yang lebih baik untuk mendapatkan tanda kutip tunggal dalam JavaScript.
Rebus, programnya terlihat seperti ini:
The
eval()
fungsi akan mengevaluasi ekspresi dalam kedua bahasa. Jadi string panjang dieksekusi:Ini membagi string panjang dengan spasi dan mengevaluasi substring yang diindeks oleh
2%-4
. JavaScript akan menjalankan substring ketiga (2 % -4 == 2
) dan Python yang terakhir kedua (2 % -4 == -2
), karena operator modulo mereka berperilaku berbeda untuk negatif.Sisa string diabaikan dalam kedua bahasa. JavaScript berhenti di
//
, sementara Python melihatnya sebagai pembagian integer dan berhenti di#
.Jadi JavaScript mencetak kode sumber ke konsol di sini:
Dan Python di sini:
Keduanya memanfaatkan bagian akhir dari string, yang merupakan templat program:
sumber
a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"])
. Diuji dalam JavaScript tetapi tidak dalam python ... tetapi harus berfungsi.a.split(1)
.q=unescape("%27")
Ruby / Perl / PHP, 52
Salinan kata demi kata dari Christopher Durr Quine Perl karya .
Ini adalah penyalahgunaan aturan. Ruby dan Perl jelas bukan bahasa yang sama, Perl juga bukan subset dari Ruby (sebagian besar quine Perl yang terhubung tidak bekerja di Ruby, misalnya). Tapi Ruby dirancang agar bisa terlihat sangat mirip Perl jika Anda menginginkannya, dan ini sering terjadi ketika bermain golf.
sumber
-R
dan Anda tidak memerlukan tag skrip. php.net/manual/en/features.commandline.options.phpBash / GolfScript, 73
Ada spasi tambahan di masing-masing dari 3 baris pertama.
Bash / GolfScript, 78
sumber
PHP / Perl - 171
Jalankan dengan:
The
php
kode benar-benar berjalan (tidak hanya mencetak sendiri).sumber
Bash / Ruby,
10482Versi yang lebih lama:
Bash / Ruby, 128 tanpa perilaku yang tidak ditentukan
sumber
<<a
di Ruby berfungsi seperti Bash, tetapi mengembalikan string Saya tidak menulis program Ruby sebelumnya. Saya baru saja menemukan bahasa acak dengan fitur ini.<<word
mengembalikan string yang ditutup oleh garis dengan satuword
.reticular / befunge-98, 28 bytes [tidak bersaing]
Coba reticular! Coba sebelum 98!
Apa pun di antara
;
s di befunge diabaikan, dan!
melompat ke dalam segmen di antara;
s untuk reticular. Jadi, reticular melihat:Befunge melihat:
sumber
Ruby / Mathematica, 225 byte
Ini adalah polyquine saya yang sangat bagus (yang berfungsi sebagai contoh dan pembuktian konsep):
Bagian pertama didasarkan pada quine Ruby ini dan pada dasarnya adalah:
Penugasan string persis sama dalam Mathematica. Ini
puts s%s
ditafsirkan sebagai produk dari 4 simbol :,puts
strings
,%
(hasil REPL terakhir atauOut[0]
jika itu ekspresi pertama yang Anda evaluasi) dan lainnyas
. Tentu saja itu sama sekali tidak berarti, tetapi Mathematica tidak peduli dan;
menekan output apa pun, jadi ini hanya diproses secara diam-diam. Kemudian#
buat sisa baris komentar untuk Ruby sementara Mathematica melanjutkan.Adapun kode Mathematica, bagian terbesarnya, adalah untuk mensimulasikan pemrosesan string format Ruby tanpa menggunakan string literal.
FromCharacterCode@{37,112}
adalah%p
danFromCharacterCode@{37,112}
sekarang%%
. Yang pertama akan diganti dengan string itu sendiri, (di manaInputForm
menambahkan tanda kutip) yang terakhir dengan satu%
. HasilnyaPrint
ed. Tangkapan terakhir adalah bagaimana menghadapinya#
di depan. Ini adalah simbol Mathematica untuk argumen pertama dari fungsi murni (anonim). Jadi apa yang kita lakukan adalah kita membuat semua itu fungsi murni dengan menambahkan&
dan segera memanggil fungsi dengan argumen , yang Mathematica lagi hanya menelan terlepas dari hal apa yang dikembalikan oleh fungsi.1
. Prepending a1
ke fungsi panggilan "mengalikan" hasilnya dengan1
sumber
> <> dan CJam, 165 byte
Untuk CJam, program dimulai dengan string multi-line literal. Ini lolos dengan
`
, dan kemudian menggunakan quine standar untuk mencetak kode quine, serta komentar tambahan.Ke> <>, yang pertama
"
memulai string literal yang melewati seluruh baris pertama, mendorong setiap karakter ke stack. Setelah itu, spasi tambahan (dibuat karena input sedang diisi) dihapus, dan kemudian tumpukan dibalik. Setiap karakter dalam tumpukan (yaitu seluruh baris pertama) adalah output, dan kemudian bergerak ke baris kedua.Baris kedua pada dasarnya melakukan hal yang sama, kecuali bahwa itu di arah yang berlawanan, sehingga Anda tidak perlu membalikkan tumpukan. (Saya tetap melakukannya, karena saya harus menghapus spasi tambahan.)
Akhirnya, bergerak ke baris ketiga. Satu-satunya perbedaan utama adalah bahwa Anda harus melewati blok CJam, yang dilakukan dengan menggunakan
.
Kutipan tunggal menangkap seluruh baris (sekali lagi, mundur), dan kemudian itu adalah output.sumber
C / PHP,
266304300282241203 + 10 byte+10 byte karena mengkompilasi dalam C memerlukan flag kompiler GCC
-Dfunction=
.Cara kerjanya (dalam PHP):
<?php
HTML.//
bukan komentar dalam HTML, jadi hanya dicetak.main
dideklarasikan sebagai fungsi dengan variabela
.printf
mencetak carriage return (untuk mengganti yang sudah dicetak//
) dan kemudian kode sumber, menggunakan metode quining C / PHP standar.#if 0
diabaikan oleh PHP.main($a)
menginisialisasi variabel kosonga
. (Sebelumnya digunakanerror_reporting(0)
untuk mengabaikan kesalahan yang disebabkan oleh panggilanmain()
)#endif
juga diabaikan oleh PHP.Cara kerjanya (dalam C):
//<?php
adalah komentar single-line, sehingga diabaikan.function
kunci diabaikan karena argumen kompiler baris perintah-Dfunction=
.$
. (Ini menyelamatkan hari.)printf
mencetak carriage return (tidak berguna dalam contoh ini) dan kemudian kode sumber, menggunakan metode quining C / PHP standar.#if 0
mengabaikan semuanya sampaiendif
, jadi PHP dapat memanggilmain
.#endif
mengakhiri blok "abaikan aku".sumber
Wumpus / > <> / Befunge-98 28 byte
Cobalah di Wumpus! , Coba di> <>! , Cobalah di Befunge-98!
Bagaimana itu bekerja:
Kode Wumpus:
> <> Kode:
Kode Befunge-98:
sumber
05AB1E / 2sable, 14 byte, tidak bersaing
Cobalah online! (05AB1E)
Cobalah online! (2sable)
2sable berasal dari 05AB1E dan mirip, tetapi memiliki perbedaan besar.
Mengejar baris baru.
sumber
C / TCL, 337 byte
sumber
C / Vim 4.0, 1636 byte
Berisi karakter kontrol.
Vim Anda perlu memiliki set berikut:
sumber
C / Lisp, 555 byte
Baris pertama sengaja kosong.
sumber
Perl / Javascript (SpiderMonkey), 106 byte
Coba Perl secara online!
Coba JavaScript online!
Penjelasan
Data quine disimpan dalam
$_
kedua bahasa dan kemudianeval
ed, yang merupakan prosedur standar di Perl. Saya memilih SpiderMonkey pada TIO karena memilikiprint
fungsi, tetapi ini dapat dengan mudah porting ke browser untuk + 20 byte (tambahkaneval("print=alert");
ke awal$_
definisi s).Perl melihat data yang disimpan dalam
$_
daneval
s seperti biasa. Karena+[]
benar di Perl,'
disimpan$q
melalui string-XOR darih
danO
. Trik terakhir adalah dalam panggilan keprint
tempat bagian pertama untuk JavaScript menggunakan+
, yang dalam Perl memperlakukan semua item sebagai angka, dan menambahkan hingga0
, maka kita menggunakan||
operator untuk mengembalikan apa yang sebenarnya kita inginkan(q($_),"=$q$_$q;",q(eval($_)))
yang setara dengan"\$_=$q$_$q;eval(\$_)"
.Dalam JavaScript,
+[]
pengembalian0
, sehingga kita sebutunescape("%27")
ke toko'
di$q
(sayangnya,atob
doesm't ada pada SpirderMonkey ...). Dalam panggilan keprint
, karena+
merupakan operator gabungan dalam JavaScript, blok pertama membangun output yang diinginkan dan bagian kedua setelah||
diabaikan.Terima kasih atas komentar Patrick Roberts untuk
unescape
triknya!Perl / JavaScript (Peramban), 108 byte
Coba Perl secara online!
Penjelasan
Kami menyimpan data quine
$_
dalam kedua bahasa dan kemudianeval
, yang merupakan prosedur standar di Perl.Perl melihat data yang disimpan dalam
$_
daneval
s seperti biasa. Theeval
dalam$_
dijalankan dan gagal untuk mengurai, tapi karena itueval
, tidak error.printf
kemudian disebut, dengan string yang dikutip tunggalq()
, dengan`
sebagai pembatas, karena hanya menggunakan`
akan menghasilkan perintah yang dieksekusi di shell, maka untuk penggunaan pertama$q
, karena+[]
benar di Perl,'
disimpan$q
melalui stringwise-XOR darih
danO
.Dalam JavaScript,
eval
blok dalam$_
set up fungsiq
, yangreturn
s argumen sebagaiString
dan aliasconsole.log
untukprintf
, karenaconsole.log
format string sepertiprintf
di Perl. Ketikaprintf
dipanggil+[]
kembali0
, maka kami memanggilatob
untuk men'
- decode dan menyimpan$q
.sumber
Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bytes
Verifikasi online!
Berdasarkan pembaruan saya untuk jawaban ini , saya pikir saya akan mencoba dan mengoptimalkan kode yang mencetak permutasi yang berbeda, tetapi akhirnya menambahkan di Bash, yang menambahkan lebih banyak byte. Meskipun ini lebih dioptimalkan daripada upaya pertama saya (disimpan lebih dari 300 byte) saya yakin masih bisa di-golf lebih lanjut.
Alternatif Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bytes
Verifikasi online!
Sedikit lebih dekat dengan pendekatan awal saya, tetapi pengulangan argumen untuk
printf
masih gila. Menggunakan argumen posisi sebagai gantinya membuat ini hanya berfungsi di Chrome dan sulit untuk bekerja di PHP juga karena$s
di%1$s
interpolasi, tetapi bisa menghemat banyak byte, mungkin menggunakan kombinasi dari dua pendekatan ...sumber
C / dc, 152 byte
Memanfaatkan komentar, ya!
sumber
Perl 5 / Ruby / PHP / JavaScript (Browser), 153 byte
Coba Perl secara online!
Coba Ruby online!
Coba PHP online!
sumber