Quine meta-polyglot

18

Dalam waktu saya di PPCG, saya perhatikan bahwa masalah quine dan masalah polyglot cukup populer. Juga, meta-solusi untuk masalah, yaitu skrip yang menghasilkan program yang merupakan solusi untuk masalah, cenderung mendapatkan banyak umpan balik positif dari masyarakat. Karena itu, saya telah menciptakan tantangan ini, yang mengimplementasikan ketiga ide ini.

Tugas Anda kemudian, pembaca dan penggemar , adalah membuat sesingkat mungkin sebuah skrip yang dapat berjalan dalam dua bahasa A dan B untuk menghasilkan quines untuk A dan B. Ketika program Anda dijalankan dalam bahasa A, itu harus menghasilkan program yang merupakan quine dalam bahasa B tetapi tidak dalam bahasa A dan sebaliknya. Bahasa A dan B dapat menjadi versi yang berbeda dari bahasa yang sama, asalkan Anda ingat bahwa quine yang dihasilkan seharusnya hanya berfungsi di salah satu versi.

Ingatlah bahwa celah standar harus dianggap tertutup dan hanya quine yang diperbolehkan.

Semoga berhasil, karakter paling sedikit menang!

Pavel
sumber
1
Quine pada dasarnya adalah meta-meta-meta-meta-meta-meta-meta-dll. program anyways :)
Esolanging Fruit
Bagaimana cara menghitung byte jika kedua bahasa menggunakan pengkodean karakter yang berbeda? Anda mungkin harus mencetak karakter daripada byte
Luis Mendo
1
Jika saya menjalankan quine dalam bahasa A untuk menghasilkan quine untuk bahasa B, haruskah itu bisa dijalankan di A?
corvus_192
2
@LuisMendo Saat menulis polyglot untuk bahasa dengan penyandian berbeda, saya akan berasumsi bahwa keduanya menerima aliran byte yang sama (bukan penyandian berbeda dari karakter yang sama).
Martin Ender
1
@Pavel Saya sebenarnya menulis tantangan serupa di sini , tetapi ditutup sebagai duplikat.
Oliver Ni

Jawaban:

5

CJam 0.6.6 dev / GolfScript, 15 14 12 byte

"0$p"0$~a:n;

Terima kasih kepada @ jimmy23013 untuk bermain golf 2 byte!

Istirahat akan diperbarui.

Verifikasi

Karena pengiriman melibatkan spasi putih yang signifikan, yang terbaik adalah membandingkan hexdumps.

$ xxd -g 1 mpquine
0000000: 22 60 30 24 7e 22 30 24 7e 4e 4d 3a 6e 3b        "`0$~"0$~NM:n;
$
$ cjam mpquine | tee quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ golfscript quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.
$ cjam quine.gs | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$
$ golfscript mpquine | tee quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ cjam quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e                    "`0$~"`0$~
$ golfscript quine.cjam | xxd -g 1
0000000: 22 60 30 24 7e 22 60 30 24 7e 0a                 "`0$~"`0$~.

CJam

CJam mencetak "`0$~"0$~dan linefeed tambahan. Cobalah online!

Program yang dihasilkan dicetak "`0$~"0$~dengan linefeed baris tambahan di GolfScript ( Coba online! ), Tetapi tanpa linefeed di CJam ( Coba online! ).

Bagaimana metaquine bekerja

"`0$~"         e# Push that string on the stack.
      0$~      e# Push a copy and evaluate it:
               e#   `     Inspect the string, pushing "\"`0$~\"".
               e#    0$   Push a copy.
               e#      ~  Evaluate, pushing "`0$~".
               e# Both "\"`0$~\"" and "`0$~" are now on the stack.
         NM    e# Push "\n" and "".
           :n; e# Map print over the elements of "" (none) and pop the result.
               e# "\"`0$~\"", "`0$~", and "\n" are now on the stack, and the
               e# characters they represent will be printed implicitly.

Cara kerja quine

"`0$~"          # Push that string on the stack.
      0$~       # As in CJam.
         <LF>   # Does nothing.
                # "\"`0$~\"" and "`0$~" are now on the stack, and the characters
                # they represent will be printed implicitly, plus a linefeed.

Tidak seperti GolfScript, CJam tidak mencetak linefeed Trailing secara default, jadi ini bukan quine di CJam.

GolfScript

GolfScript mencetak "`0$~"0$~, tanpa tertinggal spasi. Cobalah online!

Program yang dihasilkan mencetak "`0$~"0$~tanpa tertinggal spasi di CJam ( Coba online! ), Tetapi GolfScript menambahkan linefeed ( Coba online! ).

Bagaimana metaquine bekerja

"`0$~"0$~       # As in CJam.
         NM     # Unrecognized token. Does nothing.
           :n   # Store the top of the stack – "`0$~" – in the variable n. n holds
                # "\n" by default. When the program finishes, the interpreter
                # prints n implicitly, usually resulting in a trailing linefeed.
                # By redefining n, it will print "0$~" instead.
             ;  # Pop the string from the stack so it won't be printed twice.

Cara kerja quine

"`0$~"0$~      e# Works as in GolfScript.

Tidak seperti CJam, GolfScript akan menambahkan linefeed ke isi stack, jadi ini bukan quine di GolfScript.

Dennis
sumber
Hanya ingin tahu, dalam arti luas, apa perbedaan antara CJam dan GolfScript, dan mengapa kode Anda berfungsi?
Pavel
CJam sangat terinspirasi oleh GolfScript dan sebagian besar kompatibel. Satu perbedaan besar adalah bahwa GolfScript, secara default, menambahkan linefeed ke output, sedangkan CJam tidak, itulah yang saya manfaatkan di sini. Saya akan menambahkan penjelasan rinci secepatnya.
Dennis
1
"0$p"0$~a:n;.
jimmy23013
@ jimmy23013 Bagus, terima kasih! Saya telah bermain-main dengan a:n, tetapi menggunakan ptidak terpikir oleh saya.
Dennis
8

CJam / Fission, 22 byte

"'!+OR'")5-"{'_'~}_~";

Cobalah di CJam. Cobalah dalam Fisi.

Di CJam, ini mencetak quine Fission standar :

'!+OR"

Coba kueri Fisi.

Dalam Fission, ini mencetak "varian-tanpa-quine standar CJam:

{'_'~}_~

Coba quine CJam.

Ini juga berfungsi untuk 22 byte (mencetak quines yang sama):

"& *NQ!":)R"{'_'~}_~";

Penjelasan

Di CJam:

"'!+OR'"    e# Push this string.
)           e# Pull off the last character.
5-          e# Subtract 5, turning ' into ".
"{'_'~}_~"  e# Push this string.
;           e# And discard it again.

Jadi pada akhir program, tumpukan berisi string "'!+OR"dan karakter ", yang keduanya dicetak secara implisit.

Dalam Fission, aliran program dimulai Rdengan atom yang berjalan dengan benar. '"hanya mengubah massa atom ),, 5dan -diabaikan karena berbagai alasan. Kemudian atom memasuki mode cetak di "dan cetak {'_'~}_~. ;menghancurkan atom dan menghentikan program.

Martin Ender
sumber
4
+1 untuk emotikon{'_'~}
betseg
5
menghancurkan atom saya lebih suka tidak berada di dekat ketika itu terjadi
Luis Mendo
6

Clojure / Common Lisp, 274 bytes

(defmacro t []"((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))")(if '()(print(let[s clojure.string/replace](.toUpperCase(s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))(eval '(princ(t))))

Beberapa spasi ditambahkan untuk dibaca

(defmacro t []"((fn [s] (print (list s (list (quote quote) s))))
     (quote (fn [s] (print (list s (list (quote quote) s))))))")
(if '()(print(let[s clojure.string/replace](.toUpperCase
    (s(s(s(s(s(t)"fn""lambda")"[s]""(s)")"(quote ""'")"e)""e")")))))""))))"))))
    (eval '(princ(t))))

Pada dasarnya mendefinisikan makro yang mengembalikan quine di Clojure. Clojure membutuhkan parameter untuk definisi makro yang disediakan sebagai vektor ( []) sedangkan Common Lisp (untungnya) mengabaikannya. Setelah itu kami berbeda 2 bahasa dengan mengevaluasi '()yang sama dengan nildan dengan demikian falsey dalam Common Lisp dan truedalam Clojure. Kemudian kami melakukan manipulasi string menggunakan Clojure yang Common Lisp bahkan tidak mencoba untuk mengevaluasi seperti yang terjadi di ifcabang lain . Clojure di sisi lain mencoba untuk memeriksa apakah cabang lain setidaknya benar sebelum mengeksekusi sehingga harus digunakan di evalsana untuk keduanya benar di Clojure dan menghasilkan string yang benar di Common Lisp.

Catatan: hanya mengembalikan dua string yang berbeda mungkin lebih pendek tetapi kemudian tidak akan berbeda dengan tantangan polyglot tentang menghasilkan string yang berbeda dalam bahasa yang berbeda. ¯ \ _ (ツ) _ / ¯

Clojure sumber asli berjalan: https://ideone.com/SiQhPf

Sumber asli Lisp biasa dijalankan: https://ideone.com/huLcty

Keluaran Clojure: ((LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))) '(LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))))

Output Lisp umum: ((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))

Output Clojure berjalan di Common Lisp: https://ideone.com/T1DF7H

Begitu juga sebaliknya: https://ideone.com/Fezayq

cliffroot
sumber
4

Jelly / GolfScript, 18 16 byte

0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;

Verifikasi

Menguji semua program yang terlibat dengan stream byte yang tepat hanya dapat dilakukan secara lokal.

$ LANG=en_US # Latin-1. Jelly doesn't care about the exact encoding,
$            # as longs as it's not UTF-8.
$
$ xxd -g 1 mpquine
0000000: 3a 6e 22 ff cc cc 22 7d 7f fe 22 3a 6e 60 ff 3b  :n"..."}..":n`.;
$
$ jelly f mpquine | tee quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ golfscript quine.gs | xxd -g 1
0000000: 22 3a 6e 60 22 3a 6e 60                          ":n`":n`
$ jelly f quine.gs 2> /dev/null | xxd -g 1
$
$ golfscript mpquine | tee quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ jelly f quine.jelly | xxd -g 1
0000000: ff cc cc                                         ...
$ golfscript quine.jelly | xxd -g 1
0000000: 0a

Jeli

Dengan halaman kode Jelly , programnya terlihat sebagai berikut.

:n"”ṘṘ"}
“":n`”;

Ini mencetak ( Coba online! )

":n`":n`

yang merupakan quine di GolfScript ( Coba online! ), tetapi kesalahan parser di Jelly ( Coba online! )

GolfScript

Dalam bahasa Latin-1, program ini terlihat sebagai berikut, dengan karakter DEL yang tidak dapat dicetak antara }dan þ.

:n"ÿÌÌ"} þ":n`ÿ;

Ini mencetak ( Coba online! )

ÿÌÌ

atau, divisualisasikan dengan halaman kode Jelly,

”ṘṘ

yang merupakan quine di Jelly ( Coba online! ), tetapi hanya mencetak linefeed di GolfScript ( Coba online! )

Dennis
sumber
1
Bagus tua ”ṘṘ, jadi ØVharus pergi, kan?
Erik the Outgolfer
3

JavaScript / C 278 byte

Dengan 278 byte yang mengejutkan:

//\
console.log('int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}');/*
int main(){puts("A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));");}//*/

Kuota C:

int main(){char*A="int main(){char*A=%c%s%c;printf(A,34,A,34);}";printf(A,34,A,34);}

Kueri JavaScript:

A='A=;B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));';B=String.fromCharCode(39);console.log(A.slice(0,2)+B+A+B+A.slice(2));


sumber
Ibu suci quines ...
MD XF
1

Python / Retina, 70 65 64 66 byte

Saya menggunakan strategi yang sama yang saya gunakan dalam polyglot Python / Retina saya sebelumnya .

#
print"\nS`((.+))"*2+"\n\n"
#?
#_='_=%r;%_\n';_
#?;
#;print _%
#

Coba dengan Python | Coba di Retina

#adalah komentar dengan Python, jadi ia hanya mencetak quina Retina dengan Python. Di Retina, tahap pertama (2 baris) tidak melakukan apa-apa, karena tidak #akan ditemukan input. Tahap selanjutnya tidak menggantikan apa pun dengan dasar quine Python. Tahap ketiga menggantikan setiap titik koma dengan #print _%bagian. Tahap terakhir menghapus semua #.


Quine in Retina:


S`((.+))
S`((.+))


Quine dalam Python:

_='_=%r;print _%%_\n';print _%_

Quine yang digunakan dapat dilihat dalam tantangan ini . Retina quine adalah kesalahan dalam Python, dan quine Python tidak memiliki output di Retina.

mbomb007
sumber
Bisakah Anda menambahkan penjelasan untuk jawaban Anda tentang cara kerja metaquine?
Pavel
@Pavel Menambahkannya.
mbomb007
1

Python 3 / Python 2, 62 byte

_='_=%r;print(_%%_['+'~'*-~int(-1/2)+'int(-1/2):])';print(_%_)

Cobalah dengan Python 2 , Python 3 .

Berdasarkan quine Python di sini . Faktor yang membedakan antara dua versi adalah apa yang mereka lakukan dengan int(-1/2): di Python 2, /adalah pembagian integer (pembulatan ke bawah), dengan hasil -1; dalam Python 3, /adalah pembagian titik mengambang ( -0.5), yang intdipotong menjadi 0.

Kami membangun string _dalam tiga bagian. '_=%r;print(_%%_['dan 'int(-1/2):])'selalu sama. Bagian yang menarik adalah '~'*-~int(-1/2):

  • Dalam Python 2, -~int(-1/2)is 0, dan tilde tidak ditambahkan ke string;
  • Dalam Python 3, -~int(-1/2)adalah 1, dan tilde ditambahkan ke string.

Jadi, Python 2 menampilkan quine Python 3

_='_=%r;print(_%%_[int(-1/2):])';print(_%_[int(-1/2):])

dan Python 3 menampilkan quine Python 2

_='_=%r;print(_%%_[~int(-1/2):])';print(_%_[~int(-1/2):])

Di setiap versi, ekspresi di dalamnya [ :]dievaluasi menjadi 0, yang membuat slice menyertakan seluruh string, sedangkan dalam bahasa yang salah dievaluasi -1, yang membuat slice hanya menyertakan karakter terakhir, memotong output sehingga bukan quine penuh.

DLosc
sumber
1

Brain-Flak , brainfuck 4617 4009 byte

((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((()()()())))()())[()()])))()()())[()()])))())[()])[()()()()])))))))))))))))))))))))))))))))))))))))))))()()())()())[()()()()])()()())[()()])()())[()()()()])()()()))()()())[()()])[()()()()])))))))))))))))))))()())))()()())[()()()()])()()()()())[()()]))()())[()()()])()())[()()])))()()())[()()])))())[()()])[()()()])))))))))))))))))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])()()()())[()()()])()()()())[()()])[()()()]))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()())[()()])[()()()])))))))))))))))))))))))))))))()()()())[()()()])()()()())[()()])[()()()]))()()()())[()()()])()()()()()))))))[()()()])[()])()()))))()()){({}<>)<>}<>([]){({}[()]<(({}[()]<((((((()()()){}())){}{}){}())<>)>)<>){({}[()]<({}()())>){({}[()]<({}())>){({}[()]<({}((()()()){}()){})>){({}[()]<({}()())>){({}[()]<({}(((()()()){}()){}){}())>){(<{}({}()())>)}}}}}}{}([]<({}<{({}<>)<>}<>>)>){({}[()]<({}<>)<>>)}{}{({}[()]<(({}))>)}{}(((({})(((()()())){}{}){}())))<>>)}{}{<>({}<>)}{+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>+>>>+++++>>>++++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>+++>>>++++>>>++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>+++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+>>>+>>>+>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>+>>>++>>>++>>>++>>>+++++++>>>++++++++>>>+++++++>>>++++++++>>>++>>>+++++++>>>++++++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++>>>+++++++>>>++++++++>>>+>>>+++++++>>>++++++++>>>+>>>++>>>+>>>++>>>++>>>++++>>>++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>++++++++>>>+++++++>>>++++++++>>>+>>>+++++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++>>>++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>+++>>>+>>>+>>>+>>>+++++++>>>++++++++>>>+++++>>>+>>>++>>>++++++>>>++>>>+>>>++>>>++>>>++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>++++>>>++>>>++++++++>>>+++++++>>>++++++++>>>+++>>>++++>>>+++++++>>>+>>>+++++++>>>++++++++>>>+++>>>++++>>>++>>>+++>>>++++>>>++++++++>>>+++>>>++++>>><<<[<<<]>>>[>++++++++++++++++++++++++++++++++++++++++.<[->.+.->+<<]>+.[-]>>]<[<<<]>>>[<++++++++++++++++++++++++++++++++++++++++>-[<+>-[<+++++++++++++++++++>-[<++>-[<+++++++++++++++++++++++++++++>-[<++>-[<++++++++++++++++++++++++++++++>-[<++>-]]]]]]]<.>>>>]}{}

Cobalah online!

Cobalah online!

Penjelasan sedang dalam perjalanan saya masih bermain golf ini

Wisaya Gandum
sumber
Ini menghasilkan quine brainfuck di brainfuck, dan quine Brain-Flak di Brain-Flak. Ini harus menghasilkan quine Brainfuck ketika dijalankan di Brain-Flak dan Quine Brain-Flak ketika dijalankan di Brainfuck.
Pavel
Saya akan melakukannya lagi. Maaf saya hanya mengalami kesulitan mengikuti As dan Bs
Wheat Wizard