Biasanya, poliglot dibuat sedemikian rupa sehingga setiap bahasa dapat mengabaikan bagian kode yang ada untuk bahasa lain, dengan membungkusnya dalam string literal, menggunakan sintaksis komentar, atau trik serupa lainnya.
Tujuan Anda adalah menulis polyglot di mana output untuk setiap bahasa adalah kode dari polyglot yang menghasilkan output itu. Secara khusus, output harus dibangun dari kode polyglot dengan hanya penghapusan, dan itu harus menjadi quine dalam bahasa yang diberikan.
Aturan
- Hanya quine yang diperbolehkan (tidak membaca kode sumber, tidak mengambil input, output harus ke STDOUT atau alternatif terdekat jika STDOUT bukan pilihan, dan program harus terdiri dari lebih dari sekadar literal yang dicetak secara implisit).
- Karena bahasa yang berbeda dapat menggunakan penyandian yang berbeda, byte mentah adalah yang penting di sini. Misalnya, jika bahasa A menggunakan UTF-8 dan bahasa B menggunakan CP437, kode (hex)
C3 88 46 47
akanÈFG
untuk bahasa A danÈFG
untuk bahasa B. - Semua output harus berbeda (sekali lagi, membandingkan byte mentah). Ini menghindari komplikasi dengan mencoba membatasi versi bahasa minor - jika dua bahasa menggunakan bagian kode yang sama untuk melakukan hal yang sama, Anda tidak dapat mengklaim keduanya.
- Jika Anda memiliki dua bahasa A dan B sehingga
XY
merupakan output yang valid di keduanya, tetapiYZ
juga valid dalam B, Anda dapat memilihXY
sebagai output untuk A danYZ
sebagai output untuk B, sehingga Anda dapat mengklaim keduanya dalam skor Anda ( tetapi Anda tidak dapat mengklaimXY
kedua bahasa karena aturan di atas).
- Jika Anda memiliki dua bahasa A dan B sehingga
- Semua output harus sesingkat mungkin. Misalnya, jika kode Anda adalah
print('foo')#something
, untuk Python 3 (mengabaikan fakta bahwa outputnya tidak benar), kode yang Anda perlu hasilkan adalahprint('foo')
, danprint('foo')#
tidak akan diizinkan. Jika ada beberapa string dengan panjang yang sama (minimal) yang menghasilkan output yang benar, Anda dapat memilih salah satu dari mereka. - Kiriman harus berupa polyglot setidaknya dalam 2 bahasa.
- Skor Anda akan diberikan oleh
(number of programming languages with distinct outputs)**3/(total byte size of polyglot)
. Skor tertinggi menang. Jika dua pengajuan mencapai skor yang sama, pengajuan yang mencapai skor itu akan menang terlebih dahulu.
Jawaban:
GolfScript + CJam + Fission 2 + Jelly , 4 bahasa, 24 byte, skor 2,667
Mari kita mulai dengan hex dump:
Untuk GolfScript, CJam dan Fission 2, kami menafsirkan ini dalam beberapa pengkodean byte-tunggal yang kompatibel dengan ASCII seperti ISO 8859-1 (pengkodean yang tepat tidak terlalu penting, karena bahasa tetap menetapkan operator untuk karakter ASCII):
Di mana
<DEL>
karakter kontrol0x7f
.Di Jelly, ini dianggap berada di halaman kode Jelly sendiri, di mana ia terlihat seperti ini sebagai gantinya:
GolfScript
Pada
e
baris terakhir adalah variabel yang tidak dikenal dan#
komentar keluar dari sisa baris, jadi ini dicetakdengan linefeed trailing. Ini adalah versi poliglotot GolfScript / CJam dari quine standar:
Coba polyglot. | Coba quine.
CJam
Di sini,
e#
komentar di luar baris terakhir, jadi hampir identik, ini dicetaktanpa linefeed tambahan.
Coba poliglot | Coba quine.
Pembelahan
Fission hanya melihat baris kedua yang merupakan quine Fission standar, sehingga ia mencetak
Saya tidak dapat memberikan tautan online untuk polyglot di sini, karena TIO mengirim file ke Fission sebagai UTF-8, tetapi Fission membaca sumber byte demi byte, yang membuat baris terakhir terlalu lama. Namun, saya telah menguji ini secara lokal dengan file yang disandikan ISO 8859-1 (di mana baris terakhir memiliki panjang yang sama dengan yang kedua), untuk mengonfirmasi bahwa ini berfungsi.
Coba quine.
Jeli
Pilcrow adalah alias untuk umpan baris di Jelly, jadi sumbernya setara dengan:
Semua kecuali baris terakhir dari program Jelly adalah "tautan pembantu" (yaitu fungsi) yang dapat diabaikan kecuali jika dipanggil, asalkan valid secara sintaksis. Ini sebenarnya alasan yang
3
pertama datang dalam program CJam dan GolfScript, karena kalau tidak,"
tidak dapat diuraikan dalam Jelly.Kalau tidak, karena fungsi tidak dipanggil, program ini setara dengan hanya baris kedua, yang merupakan quine Jelly standar.
Coba polyglot. | Coba quine.
sumber
> <> + Python, 2 bahasa,
5146 byte, skor ~ =0,160,17Karena belum ada jawaban, saya akan mulai dengan yang sederhana
Cobalah untuk > <> dan Python
Untuk> <> baris pertama adalah quine (# mencerminkan, "menempatkan seluruh baris pada stack, lalu kita dorong 34 (charcode for") dan mencetak semuanya), eksekusi tidak pernah bergerak darinya, sehingga secara efektif mengabaikan sisa dari Kode.
Untuk Python, baris pertama adalah komentar, sedangkan yang kedua adalah quine (pendekatan standar dalam python, menggunakan substitusi string dengan string yang sama dengan kedua argumen).
sumber
.
! Saya mengadaptasi quine saya menggunakan pendekatan ini, meskipun saya lebih suka untuk menjaga string tetap terbalik (karena ini menghemat byte) dan untuk menghindari menggunakang
(karena itu dapat diartikan sebagai "membaca kode sumber")JavaScript + Python 2 + Japt, 3 bahasa, 132 byte, skor ~ = 0,205
Ini mencetak
dalam JavaScript (hanya di Firefox),
dalam Python 2, dan
di Japt. ( Uji secara online! )
JavaScript
Inilah yang dilihat JavaScript:
Baris pertama adalah no-op karena
A
tidak digunakan dengan cara apa pun. Baris kedua setS
ke stringS=%s;console.log(S,uneval(S))
, dan yang ketiga mencetaknya setelah mengganti%s
denganuneval
representasi ed dariS
(hanyaS
dibungkus dengan tanda kutip). Hasilnya adalah quine dalam JavaScript.Python
Ini pada dasarnya yang dilihat Python:
Baris pertama adalah no-op; satu-satunya bagian yang penting adalah
A=1
pada akhirnya. Ini berubahA
menjadi angka sehingga divisi integerA//2
pada baris kedua tidak menimbulkan kesalahan.Baris kedua sebagian besar cara yang sama, kecuali ia mengatur
S
ke stringS=%r;print S%%S
. Baris ketiga mencetakS
setelah mengganti%r
dengan representasi mentahS
(hanyaS
dibungkus dengan tanda kutip tunggal). Hasilnya adalah quine di Python 2.Japt
Ini adalah kode JavaScript yang dilihat penerjemah Japt:
Seperti yang Anda lihat, sebagian besar sama dengan jawaban JavaScript, dengan satu pengecualian utama: dua baris terakhir digabungkan. Akibatnya, inilah yang sebenarnya dilihat oleh penerjemah:
Baris pertama ditetapkan
A
ke quine Japt, dan set keduaS
ke bagian dari quine JS. Namun di Japt, hanya ekspresi terakhir yang dikirim ke output; iniA
, jadi outputnya`i96d)p2`i96d)p2
.sumber
uneval
? Tidak bekerja untuk sayaJolf +> <>, skor = 2 ** 3/15 = 0,533 ....
Sedang berupaya menambahkan bahasa lain untuk ini.
sumber
> <>, Python 2 dan 3, 3 bahasa, 107 byte, skor = 27/107 ~ = 0,252
Cobalah online: Python 2 , Python 3 , > <>
Output Python 3 adalah baris kedua dengan tepat, dan output Python 2 adalah quine ini . Output> <> adalah baris pertama.
Penjelasan
Program ini didasarkan dari quine Python 2 klasik:
Pertama, untuk membuatnya kompatibel dengan Python 2 dan Python 3, saya mengubah
print
pernyataan menjadi pemanggilan fungsi, dan menambahkan ruang ekstra yang akan berguna nanti:Selanjutnya, saya membutuhkan cara untuk membedakan Python 2 dari Python 3. Salah satu cara paling sederhana adalah dengan mengambil keuntungan dari fakta bahwa
/
pembagian integer di Python 2, tetapi pembagian float di Python 3. Dengan demikian, kode berikut ini dievaluasiTrue
dalam Python 2, tetapiFalse
dalam Python 3:Untuk membuat keluaran berbeda antara kedua bahasa, saya perlu menghapus tanda kurung pertama dan terakhir dalam
print
panggilan (itu sebabnya saya membutuhkan ruang sebelumnya - tanpa ruang, itu tidak akan menjadiprint
pernyataan yang valid dalam Python 2) . Jadi, saya perlu memodifikasi quine harness seperti:Ekspresi
a:-a|9
mengevaluasi ke0:9
Python 2 dan1:-1
Python 3. Dengan demikian,b
adalah"(_%(_,b))"
di Python 3, tetapi dalam Python 2 karakter pertama dan terakhir yang dibuang, meninggalkan_%(_,b)
. Dan dengan modifikasi itu, polyglot valid untuk tantangan ini.Seperti yang disarankan oleh Teal pelican, quine> <>
#o<}-1:"
dapat ditambahkan dengan cukup mudah, berkat fakta yang#
memulai komentar satu baris dengan Python. Cukup dengan menambahkannya dan baris baru menambahkan bahasa lain dan meningkatkan skor hampir sepuluh kali lipat.sumber
Python 2 + Retina, 2 bahasa, 55 byte, skor = 2 ^ 3/55 ≈ 0,145
Saya menggunakan
$n
bukannya¶
menjaga mereka berdua ASCII yang valid.Python , Retina
Python:
Retina:
sumber
> <> + Pyke + Python 2, 81 byte, skor = 3 ** 3/81 ~ 0.333
Saya sudah mencoba melakukan sesuatu yang berbeda dengan semua bahasa.
> <> melihat:
Ini adalah sedikit modifikasi dari standar> <> quine untuk menggunakan string yang dikutip tiga kali di awal. Ini memungkinkan kutipan tiga akhir untuk Python berada pada baris yang berbeda.
Cobalah online!
Pyke melihat:
Saya belum membuat quine di Pyke sebelumnya dan karenanya harus memikirkan satu. Saya menggunakan teknik quining tradisional untuk membuat string dan kemudian mengevaluasi dengan sendirinya sebagai input. Catatan agar ini berfungsi tanpa dampak visual, peringatan harus dinonaktifkan. Kesalahan dengan pembagian dengan kesalahan 0 pada langkah pembuatan.
Coba di sini! Atau hanya bagian quine.
Python melihat:
Semuanya. Python menggunakan semua kode untuk menghasilkan kuenya. Saya memutuskan untuk menanamkan bagian quine di docstring (meskipun pada akhirnya akan menghemat byte untuk dihapus tapi saya pikir itu keren). Ini modifikasi dari teknik quining standar.
Cobalah online!
sumber