Cetak Potongan Poliglot

22

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 47akan ÈFGuntuk bahasa A dan ├êFGuntuk 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 XYmerupakan output yang valid di keduanya, tetapi YZjuga valid dalam B, Anda dapat memilih XYsebagai output untuk A dan YZsebagai output untuk B, sehingga Anda dapat mengklaim keduanya dalam skor Anda ( tetapi Anda tidak dapat mengklaim XYkedua bahasa karena aturan di atas).
  • 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 adalah print('foo'), dan print('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.
Mego
sumber
2
Aturan kedua hingga terakhir terdengar seperti kita perlu membuktikan bahwa tidak mungkin untuk mem-golf quine yang dihasilkan lebih jauh dengan serangkaian penghapusan lainnya. Apakah itu disengaja?
Martin Ender
Terkait
Martin Ender
Bagaimana Anda mendefinisikan "penghapusan" dalam kasus bahasa yang perintahnya tidak 8 bit panjang? Apakah Anda menghapus dari sumber perintah pada suatu waktu, atau byte pada suatu waktu?
@ MartinEnder, itikad baik dapat diasumsikan. Kecuali seseorang menemukan quine pendek yang dapat dibentuk dari polyglot, jawabannya dipercaya sah.
Mego
@ ais523 Semuanya dilakukan pada level byte.
Mego

Jawaban:

11

GolfScript + CJam + Fission 2 + Jelly , 4 bahasa, 24 byte, skor 2,667

Mari kita mulai dengan hex dump:

00000000:  3322 3024 700a 2721 2b4f 5222 0a3c 3024 700a 6523 7fff cccc

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

3"0$p
'!+OR"
<0$p
e#<DEL>ÿÌÌ

Di mana <DEL>karakter kontrol 0x7f.

Di Jelly, ini dianggap berada di halaman kode Jelly sendiri, di mana ia terlihat seperti ini sebagai gantinya:

3"0$p½'!+OR"½<0$p½e#¶”ṘṘ

GolfScript

Pada ebaris terakhir adalah variabel yang tidak dikenal dan #komentar keluar dari sisa baris, jadi ini dicetak

"0$p"
0$p

dengan linefeed trailing. Ini adalah versi poliglotot GolfScript / CJam dari quine standar:

".p"
.p

Coba polyglot. | Coba quine.

CJam

Di sini, e#komentar di luar baris terakhir, jadi hampir identik, ini dicetak

"0$p"
0$p

tanpa linefeed tambahan.

Coba poliglot | Coba quine.

Pembelahan

Fission hanya melihat baris kedua yang merupakan quine Fission standar, sehingga ia mencetak

'!+OR"

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:

3"0$p½'!+OR"½<0$p½e#
”ṘṘ

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 3pertama 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.

Martin Ender
sumber
9

> <> + Python, 2 bahasa, 51 46 byte, skor ~ = 0,16 0,17

Karena belum ada jawaban, saya akan mulai dengan yang sederhana

#.09;!?lo}*2+2f"
_='_=%r;print _%%_';print _%_

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

Leo
sumber
1
Sedikit adaptasi pada jawaban> <> dapat menghemat beberapa byte: - # "~ r10gol?!; 60. |!
Teal pelican
@Tealpelican Terima kasih telah mengingatkan saya pada penggunaan .! Saya mengadaptasi quine saya menggunakan pendekatan ini, meskipun saya lebih suka untuk menjaga string tetap terbalik (karena ini menghemat byte) dan untuk menghindari menggunakan g(karena itu dapat diartikan sebagai "membaca kode sumber")
Leo
Itu poin yang cukup adil untuk tidak menggunakan g. Setelah melihat dan sedikit memikirkannya, Anda dapat menguranginya lebih jauh dengan menggunakan # (ascii 35) dari tumpukan untuk mendapatkan "like; # .09;! Lo? -1"
Teal pelican
7

JavaScript + Python 2 + Japt, 3 bahasa, 132 byte, skor ~ = 0,205

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"""
console.log(S,uneval(S))//""";print S%S

Ini mencetak

S="S=%s;console.log(S,uneval(S))";console.log(S,uneval(S))

dalam JavaScript (hanya di Firefox),

S='S=%r;print S%%S';print S%S

dalam Python 2, dan

`i96d)p2`i96d)p2

di Japt. ( Uji secara online! )

JavaScript

Inilah yang dilihat JavaScript:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A
console.log(S,uneval(S))

Baris pertama adalah no-op karena Atidak digunakan dengan cara apa pun. Baris kedua set Ske string S=%s;console.log(S,uneval(S)), dan yang ketiga mencetaknya setelah mengganti %sdengan unevalrepresentasi ed dari S(hanya Sdibungkus dengan tanda kutip). Hasilnya adalah quine dalam JavaScript.

Python

Ini pada dasarnya yang dilihat Python:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S"
print S%S

Baris pertama adalah no-op; satu-satunya bagian yang penting adalah A=1pada akhirnya. Ini berubah Amenjadi angka sehingga divisi integer A//2pada baris kedua tidak menimbulkan kesalahan.

Baris kedua sebagian besar cara yang sama, kecuali ia mengatur Ske string S=%r;print S%%S. Baris ketiga mencetak Ssetelah mengganti %rdengan representasi mentah S(hanya Sdibungkus dengan tanda kutip tunggal). Hasilnya adalah quine di Python 2.

Japt

Ini adalah kode JavaScript yang dilihat penerjemah Japt:

A="`i96d)p2`i96d)p2";1//2;A=1
S="S=%s;console.log(S,uneval(S))";A//2;S="S=%r;print S%%S";"","\nconsole.log(S,uneval(S))//","";.p("r".i("n".t(),S%S))

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:

A="`i96d)p2`i96d)p2";1
S="S=%s;console.log(S,uneval(S))";A

Baris pertama ditetapkan Ake quine Japt, dan set kedua Ske bagian dari quine JS. Namun di Japt, hanya ekspresi terakhir yang dikirim ke output; ini A, jadi outputnya `i96d)p2`i96d)p2.

Produksi ETH
sumber
Apa uneval? Tidak bekerja untuk saya
Cyoce
@Cyoce developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… Ini hanya berfungsi di Firefox.
ETHproduk
3

Jolf +> <>, skor = 2 ** 3/15 = 0,533 ....

"r0:g>o<
"Q«Q«

Sedang berupaya menambahkan bahasa lain untuk ini.

Rɪᴋᴇʀ
sumber
2

> <>, Python 2 dan 3, 3 bahasa, 107 byte, skor = 27/107 ~ = 0,252

#o<}-1:"
a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

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:

_='_=%r;print _%%_';print _%_

Pertama, untuk membuatnya kompatibel dengan Python 2 dan Python 3, saya mengubah printpernyataan menjadi pemanggilan fungsi, dan menambahkan ruang ekstra yang akan berguna nanti:

_='_=%r;print (_%%_)';print (_%_)

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 dievaluasi Truedalam Python 2, tetapi Falsedalam Python 3:

1/1is 1

Untuk membuat keluaran berbeda antara kedua bahasa, saya perlu menghapus tanda kurung pertama dan terakhir dalam printpanggilan (itu sebabnya saya membutuhkan ruang sebelumnya - tanpa ruang, itu tidak akan menjadi printpernyataan yang valid dalam Python 2) . Jadi, saya perlu memodifikasi quine harness seperti:

a=1/1is 1;b="(_%(_,b))"[a:-a|9];_='a=1/1is 1;b="(_%%(_,b))"[a:-a|9];_=%r;print %s';print (_%(_,b))

Ekspresi a:-a|9mengevaluasi ke 0:9Python 2 dan 1:-1Python 3. Dengan demikian, badalah "(_%(_,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.

Mego
sumber
1

Python 2 + Retina, 2 bahasa, 55 byte, skor = 2 ^ 3/55 ≈ 0,145

Saya menggunakan $nbukannya menjaga mereka berdua ASCII yang valid.

S='S=%r;print S%%S';print S%S#|
#$n\(*S1`$n\(*S1`
#\`#

Python , Retina

Python:

S='S=%r;print S%%S';print S%S

Retina:


\(*S1`
\(*S1`
mbomb007
sumber
0

> <> + Pyke + Python 2, 81 byte, skor = 3 ** 3/81 ~ 0.333

"""r00gol?!;60.
a=%r;print a%%a"""#);"34.Cp\D\Es"DEp00/
a=__doc__[-15:]
print a%a

Saya sudah mencoba melakukan sesuatu yang berbeda dengan semua bahasa.

> <> melihat:

"""r00gol?!;60.

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:

"34.Cp\D\Es"DEp00/

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!

Biru
sumber