Misalkan Anda memiliki 2 bahasa, A
dan B
. String s
adalah semiquine di A
dan B
jika memenuhi kondisi berikut:
s
adalah quine dalam bahasaA
.s
adalah polyglot di dalamA
danB
.- Output dari menjalankan
s
sebagaiB
program adalah string yang berbedas'
, yang merupakan quine inB
.
Tujuan dari tantangan ini adalah untuk menulis semiquine dalam dua bahasa yang berbeda. Ini adalah kode-golf , sehingga kode terpendek menang, dengan jawaban paling awal digunakan sebagai tiebreak.
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.)
Selain itu, kode sumber Anda tidak boleh murni terdiri dari literal (apakah itu string literal, literal numerik, dll.) Dan / atau NOP. Misalnya, `12
adalah polyglot dalam Jelly dan Pyth, tetapi dalam Jelly itu adalah NOP dan numerik literal, jadi itu tidak valid.
Setiap output yang tidak dapat ditekan (seperti pemberitahuan hak cipta, pesan startup / shutdown, atau feed garis trailing) dapat diabaikan dalam output demi validitas quine.
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).
- Itu tidak harus dialek berbeda dari bahasa yang sama (misalnya Pascal vs Delphi).
- Satu bahasa mungkin bukan subset dari yang lain (misalnya C vs C ++ 1 ).
- Satu bahasa mungkin bukan turunan sepele dari yang lain (misalnya Matlab vs Oktaf 2 , brainfuck vs boolfuck vs TinyBF vs ShadyAsFuck vs semua turunan brainfuck sepele lainnya).
Aturan Lain-Lain
- Anda mungkin tidak menerima input dari STDIN (atau sumber lainnya). Jika bahasa pilihan Anda harus mengambil input, maka input tersebut harus kosong (string kosong, disalurkan dari
/dev/null
, dll.), Atau output dari program tidak boleh bergantung pada input. - Untuk tantangan ini, Anda harus menulis program yang lengkap. Membutuhkan kode tambahan untuk menjalankan solusi tidak diizinkan (seperti menetapkan dan memanggil fungsi lambda yang ditentukan dalam solusi).
1: Ya saya tahu bahwa C sebenarnya bukan subset dari C ++. Cukup dekat untuk dianggap satu untuk tujuan polyglots, jadi saya menghitungnya untuk tantangan ini.
2: Seperti poin 1 di atas, meskipun Oktaf secara teknis tidak 100% kompatibel dengan Matlab, ia dirancang agar kompatibel, dan cukup dekat sehingga memungkinkan polyglot Matlab / Oktaf akan meremehkan tantangan.
Jawaban:
GolfScript + Fission ,
1918 byteDiperlukan linefeed tambahan.
Ini adalah quine sejati di GolfScript. Cobalah online!
Dalam Fisi itu mencetak
yang merupakan quine sejati dalam Fission . Cobalah online!
Penjelasan
Di GolfScript, apa pun bentuknya
adalah quine selama
...
meninggalkan string dengan".~"
di stack. The.
duplikat blok, sehingga ada satu salinan yang akan dicetak di akhir, dan~
mengeksekusi itu, sehingga kita dapat menggunakan isinya untuk mencetak.~
sendiri. Dalam hal ini, blok mendorong stringdan kemudian memotongnya dengan dua karakter pertama dengan
2<
.Program Fission benar-benar bekerja persis sama dengan quine itu sendiri , karena baris pertama dan ketiga sepenuhnya diabaikan oleh program.
sumber
Ruby + (JavaScript atau Python 3), 76 byte
Ini adalah tantangan lain yang dapat diselesaikan dengan menggunakan bahasa favorit saya yang baru, subset yang hampir umum dari Ruby, JavaScript, dan Python 3; dan mengingat bahwa kami belum memiliki jawaban dalam bahasa eksoteris, dan banyak orang suka melihat solusi bahasa non-golf, saya pikir saya akan berkontribusi satu. Bahkan lebih baik, jawaban yang sama memecahkan tantangan dalam berbagai cara pada saat yang bersamaan.
Inilah
s
:Ini adalah quine di Ruby. Ini bukan quine dalam JavaScript atau Python 3; jika Anda menjalankannya dalam salah satu bahasa tersebut, outputnya
s'
memiliki baris tambahan, dan karenanya berbeda:Namun,
s'
adalah polyglot quine di JavaScript dan Python 3! (Seperti biasa bagi saya, saya menggunakan implementasi Badak JavaScript, baik untuk kenyamanan (karena berjalan dari baris perintah daripada membutuhkan browser), dan karena memiliki perpustakaan standar yang aneh di manaprint
menulis ke output standar.) Kedua bahasa dihasilkans'
sebagai hasil dari menjalankan kedua program.Sebagai bonus, program ini juga memecahkan masalah secara terbalik. Jika Anda memutuskan untuk menjalankan
s'
di Ruby, itu akan mencetak program aslinyas
lagi. Dengan demikian,s'
adalah jawaban yang valid (tetapi sedikit lebih lama, pada 77 byte) untuk pertanyaan itu.Pada titik ini, saya hampir mulai berpikir "perbedaan dalam apakah atau tidak output berakhir dengan baris baru yang cukup untuk menghitung dua program sebagai berbeda" harus dianggap sebagai celah standar, mengingat bahwa ini tampaknya menjadi set bahasa kedua (di luar GolfScript / CJam terkenal) di mana dimungkinkan untuk melakukan trik.
sumber
Vitsy (safe mode) dan Y, 9 byte, tidak bersaing.
Di Vitsy, ini adalah quine. Di Y, ini mencetak
Ugrd3*Z'
; ketika dijalankan, ini mencetakUgrd3*Z'
, yang merupakan quine di Y. Y postdates pertanyaannya, namun.Apa yang dilihat Vitsy:
Apa yang Y lihat:
sumber
CJam + GolfScript, 9 byte
Ini adalah quine di CJam. Dalam GolfScript, itu output sendiri dengan baris baru, yang merupakan quine di GolfScript.
Saya tidak yakin apakah CJam harus dianggap sebagai turunan sepele dari GolfScript. Tapi saya pikir mereka sangat berbeda dan setidaknya tidak sepele.
sumber