Tuliskan Semiquine

10

Misalkan Anda memiliki 2 bahasa, Adan B. String sadalah semiquine di Adan Bjika memenuhi kondisi berikut:

  1. sadalah quine dalam bahasa A.
  2. sadalah polyglot di dalam Adan B.
  3. Output dari menjalankan ssebagai Bprogram adalah string yang berbeda s', yang merupakan quine in B.

Tujuan dari tantangan ini adalah untuk menulis semiquine dalam dua bahasa yang berbeda. Ini adalah , 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, `12adalah 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.

Mego
sumber
Apakah blok salinan ESMin diizinkan?
lirtosiast
@ThomasKwa Saya tidak terbiasa dengan ESMin, jadi bisakah Anda memberi saya ikhtisar singkat?
Mego
Ada perintah untuk memulai blok salinan, yang mendapatkan kode sumber dari semua yang melewatinya. Saya pikir bahasa golf JS lain mungkin memiliki satu juga.
lirtosiast
@ThomasKwa Itu tidak akan diizinkan di bawah aturan pertama dalam aturan quine (tidak membaca kode sumber, secara langsung atau tidak langsung).
Mego
1
@Downgoat Selama tidak melanggar aturan lain, tentu saja. Keanehan yang menyalahgunakan adalah jenis tujuan dari situs ini :)
Mego

Jawaban:

6

GolfScript + Fission , 19 18 byte

{".~
'!+OR"
2<}.~

Diperlukan linefeed tambahan.

Ini adalah quine sejati di GolfScript. Cobalah online!

Dalam Fisi itu mencetak

'!+OR"

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 string

".~
'!+OR"

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

Martin Ender
sumber
6

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:

s="'";d='"';n='print("s="+d+s+d+";d="+s+d+s+";n="+s+n+s+";eval(n)")';eval(n)

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:

s = "'"; d =' "'; n =' print (" s = "+ d + s + d +"; d = "+ s + d + s +"; n = "+ s + n + s +" ; eval (n) ") '; eval (n)

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 mana printmenulis ke output standar.) Kedua bahasa dihasilkan s'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 aslinya slagi. 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
2

Vitsy (safe mode) dan Y, 9 byte, tidak bersaing.

' Ugrd3*Z

Di Vitsy, ini adalah quine. Di Y, ini mencetak Ugrd3*Z'; ketika dijalankan, ini mencetak Ugrd3*Z', yang merupakan quine di Y. Y postdates pertanyaannya, namun.

Apa yang dilihat Vitsy:

 ' Ugrd3*Z
 '         Heyyyy a string! Let's do this!
  ........ Capturing a string! Oh, not done? Hm, let's go back to the start.
 '         There we go.
           (space) ...
   U       (no op)
    g      use count, disabled in safe mode
     r     reverse stack
      d3*  push a '
         Z print it all!

Apa yang Y lihat:

' Ugrd3*Z
'         Push a space.
  U       Wrap around and capture.
   g      Print that. (Nothing else is printed.)
Conor O'Brien
sumber
1
Perhatikan bahwa ini hanya berfungsi dalam mode Aman, atau, lebih tepatnya, ia memiliki beberapa ... efek samping yang tidak diinginkan dalam mode tidak aman.
Addison Crump
1

CJam + GolfScript, 9 byte

"0$p"
0$p

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.

jimmy23013
sumber