Tulis Polyquine


33

Polyquine adalah quine dan polyglot. 1 Anda harus menulis quine yang valid setidaknya dalam dua bahasa yang berbeda. Ini kode golf, jadi jawaban tersingkat (dalam byte) menang.

1 Aku mengarangnya. Atau lebih tepatnya, Geobits melakukannya . Tampaknya, dia juga bukan yang pertama .

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

Selanjutnya, kode Anda harus mengandung string literal.

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).
  • Mereka tidak boleh dialek yang berbeda dari bahasa yang sama (misalnya Pascal vs Delphi).
  • Satu bahasa mungkin bukan bagian dari yang lain (misalnya C vs C ++).

4
"kode Anda harus mengandung string literal" Bahkan dalam bahasa yang tidak memiliki string literal, seperti Brainfuck?
Peter Olson

@PeterOlson Tujuan dari aturan ini adalah menghindari beberapa celah dalam bahasa khusus golf (misalnya yang ini ). Karena saya tidak dapat mengantisipasi penghapusan atau pelemahan aturan yang akan menyebabkan (dan karena saya bukan penggemar mengubah aturan kecuali benar-benar diperlukan), saya minta maaf, tetapi pengiriman BF tidak akan valid untuk tujuan ini tantangan. Jika ada penghiburan, pengiriman BF kemungkinan besar tidak akan kompetitif. ;)
Martin Ender

1
"Dia bukan yang pertama juga" terhubung ke mana?
Erik the Outgolfer

2
C sebenarnya bukan subset dari C ++.
MD XF

Apakah dua bahasa berbasis Brainf ** k berbeda dihitung sebagai bahasa yang sama, seperti Brainf ** k dan MOO?
MD XF

Jawaban:


14

CJam / GolfScript, 34 byte

{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~

Hitungan byte berisi linefeed baris, karena program tidak akan menjadi quine tanpanya.

Sementara CJam dan GolfScript sangat mirip dalam beberapa aspek, ada banyak perbedaan. Untuk membuat ini menjadi polyquine "jujur", saya memutuskan untuk mengandalkan perbedaan sebanyak mungkin. Kecuali untuk sintaksis blok dan string (yang dibagi dengan bahasa oh begitu banyak yang lain), tidak ada bagian kode yang mencapai persis sama di kedua bahasa.

Interpreter GolfScript online memiliki bug; program ini hanya bekerja dengan penerjemah resmi.

Contoh dijalankan

$ cat polyquine
{"__X.0#@@?LL
;~"N}__X.0#@@?LL
;~
$ md5sum polyquine <(cjam polyquine) <(golfscript polyquine)
e2f1f3cd68abbbceec58080513f98d9a  polyquine
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/63
e2f1f3cd68abbbceec58080513f98d9a  /dev/fd/62

Bagaimana cara kerjanya (CJam)

" Push that block.                                                                        ";

{"__X.0#@@?LL
;~"N}

" Push two copies of the block, 1 (computed as 1**0) and rotate the block copies on top.  ";

__X.0#@@

" If 1 is truthy (oh, the uncertainty), execute the first copy; else, execute the second.
  Evaluating the block pushes the string it contains; N pushes a linefeed.                ";

?

" Push two empty arrays.                                                                  ";

LL

" Discard one empty array and dump the second.                                            ";

;~

" (implicit) Print all items on the stack.                                                ";

Bagaimana cara kerjanya (GolfScript)

# Push that block.

{"__X.0#@@?LL
;~"N}

# Push a copy of the block; _ and X are noops, # initiates an inline comment.

__X.0#@@?LL

# Discard the 0 and execute the copy of the block.
# Evaluating the block pushes the string it contains; N is a noop.

;~

# (implicit) Print all items on the stack, followed by a linefeed.

CJam / GolfScript, 12 byte

{"0$~"N}0$~

Solusi Cheaty yang menghindari perbedaan bahasa sebanyak mungkin.

Cobalah online:

Bagaimana cara kerjanya (CJam)

 "0$~"       " Push that string.                                                          ";
      N      " Push a linefeed.                                                           ";
{      }0$~  " Push a copy of the block and execute it.                                   ";
             " (implicit) Print the stack.                                                ";

Bagaimana cara kerjanya (GolfScript)

 "0$~"       # Push that string.
      N      # Undefined token (noop).
{      }0$~  # Push a copy of the block and execute it.
             # (implicit) Print the stack, followed by a linefeed.

14

C # / Java, 746 byte

Saya menggunakan properti yang karakter di Jawa dapat ditulis sebagai urutan unicode identik. Jika kami memiliki Ainstruksi untuk kompiler C # dan Binstruksi untuk Java, kami dapat menggunakan fragmen kode berikut:

//\u000A\u002F\u002A
A//\u002A\u002FB

Itu akan "dikenali" dengan cara berikut dengan C #:

//\u000A\u002F\u002A
A//\u002A\u002FB

Dan dengan cara berikut oleh Java:

//
/*
A//*/B

Karena \u000Ais line break, \u002Fis /dan \u002Ais *in Java.

Jadi polyglot-quine terakhir adalah:

//\u000A\u002F\u002A
using System;//\u002A\u002F
class Program{public static void//\u000A\u002F\u002A
Main//\u002A\u002Fmain
(String[]z){String s="//@#'^using System;//'#^class Program{public static void//@#'^Main//'#main^(String[]z){String s=!$!,t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&'!,s};for(int i=0;i<7;i++)t=t.//@#'^Replace//'#replace^(!!+(char)a[i],b[i]);//@#'^Console.Write//'#System.out.printf^(t);}}",t=s;int[]a=new int[]{33,94,38,64,35,39,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A",s};for(int i=0;i<7;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);//\u000A\u002F\u002A
Console.Write//\u002A\u002FSystem.out.printf
(t);}}

Namun, ukurannya terlalu besar karena verbositas bahasa.

Kompilasi tersedia di ideone.com: C # , Java .


3
Selamat datang di komunitas Programming Puzzles & Code Golf!
Erik the Outgolfer

2
Saya tahu ini sudah hampir dua tahun, tetapi Anda bisa bermain golf 58 byte. Cobalah secara online Java. dan Cobalah secara online C # .NET.
Kevin Cruijssen

Apakah maksud Anda 688 byte?
Ivan Kochurkin

13

Python 3 dan JavaScript, 134 byte

Ini usaha saya (terakhir?):

a='eval(a.split(" ")[2%-4]),1//2# q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8)) print(a[-12:]%a) a=%r;eval(a)';eval(a)

Mungkin bisa bermain golf sedikit lebih, terutama jika ada yang tahu cara yang lebih baik untuk mendapatkan tanda kutip tunggal dalam JavaScript.


Rebus, programnya terlihat seperti ini:

a='a long string';eval(a)

The eval()fungsi akan mengevaluasi ekspresi dalam kedua bahasa. Jadi string panjang dieksekusi:

eval(a.split(" ")[2%-4]),1//2# ... the rest gets commented out

Ini membagi string panjang dengan spasi dan mengevaluasi substring yang diindeks oleh 2%-4. JavaScript akan menjalankan substring ketiga ( 2 % -4 == 2) dan Python yang terakhir kedua ( 2 % -4 == -2), karena operator modulo mereka berperilaku berbeda untuk negatif.

Sisa string diabaikan dalam kedua bahasa. JavaScript berhenti di //, sementara Python melihatnya sebagai pembagian integer dan berhenti di# .

Jadi JavaScript mencetak kode sumber ke konsol di sini:

q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(-8))

Dan Python di sini:

print(a[-12:]%a)

Keduanya memanfaatkan bagian akhir dari string, yang merupakan templat program:

a=%r;eval(a)

1 Golfed ke 140 byte: a='print(a[78:]%a)1q=String.fromCharCode(39);console.log("a="+q+a+q+a.slice(82))1a=%r;eval(a.split(1)[0|0=="0"])';eval(a.split(1)[0|0=="0"]). Diuji dalam JavaScript tetapi tidak dalam python ... tetapi harus berfungsi.
soktinpk

@ Soktinpk Terima kasih, tapi saya tidak berpikir Python akan mengizinkan a.split(1).
grc

1
-8 byte:q=unescape("%27")
Patrick Roberts

8

Ruby / Perl / PHP, 52

$b='$b=%c%s%c;printf$b,39,$b,39;';printf$b,39,$b,39;

Salinan kata demi kata dari Christopher Durr Quine Perl karya .

Ini adalah penyalahgunaan aturan. Ruby dan Perl jelas bukan bahasa yang sama, Perl juga bukan subset dari Ruby (sebagian besar quine Perl yang terhubung tidak bekerja di Ruby, misalnya). Tapi Ruby dirancang agar bisa terlihat sangat mirip Perl jika Anda menginginkannya, dan ini sering terjadi ketika bermain golf.


Apakah ini bisa dibuat berfungsi (atau sudah) di PHP juga? Jika saya membaca dokumen dengan benar, Anda dapat menjalankannya di baris perintah dengan -Rdan Anda tidak memerlukan tag skrip. php.net/manual/en/features.commandline.options.php
hmatt1

Saya tidak akan menyebutnya aturan penyalahgunaan. Menemukan quine yang berfungsi pada persimpangan dua bahasa jelas merupakan cara yang valid untuk mendekati pertanyaan ini. Namun, melihat ini bukan karya Anda sendiri, saya lebih suka jika Anda menandainya sebagai wiki komunitas.
Martin Ender

@chememagic memang bisa!
histokrat

@ MartinBüttner selesai.
histokrat

6

Bash / GolfScript, 73

.~0 () 
{ 
    declare "-f" @* ".~0" " () 
"+@n.;
    echo '.~0;'
}
.~0;

Ada spasi tambahan di masing-masing dari 3 baris pertama.

Bash / GolfScript, 78

alias :a~a.='eval "alias :a~a."\
;set [61 39]+a[39]+n"":a;echo ":a~a."'
:a~a.

5

PHP / Perl - 171

#<?PHP$s=1;$t="";
$a='%s<%cPHP$s=1;$t="";%c$a=%c%s%c;$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);%c#%c>';$t==$s?$t="#":$s;printf($a,$t,63,10,39,$a,39,10,63);
#?>

Jalankan dengan:

$ php quine.pl
$ perl quine.pl

The phpkode benar-benar berjalan (tidak hanya mencetak sendiri).


5

Bash / Ruby, 104 82

"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
"tee`#";puts <<a*2+'a'#`" -<<'a';echo a
a

Versi yang lebih lama:

"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
"alias" "puts=f()(tee -;echo a);f"
puts <<a *2+"a"
a

Bash / Ruby, 128 tanpa perilaku yang tidak ditentukan

"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
"alias" 'puts=f()(a=`cat`;echo "$a
$a
a");f'
puts <<'a' *2+"a"
a

wow, saya bahkan tidak mengerti cara kerja kode Ruby: D
Martin Ender

@ MartinBüttner <<adi Ruby berfungsi seperti Bash, tetapi mengembalikan string Saya tidak menulis program Ruby sebelumnya. Saya baru saja menemukan bahasa acak dengan fitur ini.
jimmy23013

Saya juga tidak tahu cara kerjanya di bash: P
Martin Ender

@ MartinBüttner Ini disebut heredoc. <<wordmengembalikan string yang ditutup oleh garis dengan satu word.
jimmy23013

5

reticular / befunge-98, 28 bytes [tidak bersaing]

<@,+1!',k- ';';Oc'43'q@$;!0"

Coba reticular! Coba sebelum 98!

Apa pun di antara ;s di befunge diabaikan, dan !melompat ke dalam segmen di antara; s untuk reticular. Jadi, reticular melihat:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                             move left
                           "  capture string
                          0   push zero
                        ;!    skip `;` (end program)
                       $      drop zero
                     q@       reverse TOS
                 '43'         push 34 (")
                c             convert to char
               O              output all
              ;               end program

Befunge melihat:

<@,+1!',k- ';';Oc'43'q@$;!0"
<                            move left
                           " capture string
                         !0  push 1
              ;         ;    skip this
         - ';'               push 27
       ,k                    output top 27 chars
   +1!'                      push 34 (")
  ,                          output "
 @                           end program

4

Ruby / Mathematica, 225 byte

Ini adalah polyquine saya yang sangat bagus (yang berfungsi sebagai contoh dan pembuktian konsep):

s="s=%p;puts s%%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1";puts s%s;#Print[StringReplace[s,{(f=FromCharacterCode)@{37,112}->ToString@InputForm@s,f@{37,37}->f@37}]]&@1

Bagian pertama didasarkan pada quine Ruby ini dan pada dasarnya adalah:

s="s=%p;puts s%%s;#MathematicaCode";puts s%s;#MathematicaCode

Penugasan string persis sama dalam Mathematica. Ini puts s%sditafsirkan sebagai produk dari 4 simbol :, putsstring s, %(hasil REPL terakhir atau Out[0]jika itu ekspresi pertama yang Anda evaluasi) dan lainnya s. Tentu saja itu sama sekali tidak berarti, tetapi Mathematica tidak peduli dan ;menekan output apa pun, jadi ini hanya diproses secara diam-diam. Kemudian# buat sisa baris komentar untuk Ruby sementara Mathematica melanjutkan.

Adapun kode Mathematica, bagian terbesarnya, adalah untuk mensimulasikan pemrosesan string format Ruby tanpa menggunakan string literal. FromCharacterCode@{37,112}adalah %pdan FromCharacterCode@{37,112}sekarang %%. Yang pertama akan diganti dengan string itu sendiri, (di manaInputForm menambahkan tanda kutip) yang terakhir dengan satu %. Hasilnya Printed. Tangkapan terakhir adalah bagaimana menghadapinya #di depan. Ini adalah simbol Mathematica untuk argumen pertama dari fungsi murni (anonim). Jadi apa yang kita lakukan adalah kita membuat semua itu fungsi murni dengan menambahkan &dan segera memanggil fungsi dengan argumen , yang Mathematica lagi hanya menelan terlepas dari hal apa yang dikembalikan oleh fungsi.1 . Prepending a1 ke fungsi panggilan "mengalikan" hasilnya dengan1


2

> <> dan CJam, 165 byte

"~~~~~~~~~~~~~~~~~~~~~~~r00gol?!v93*0.Hi
'                               <       .1*5av!?log10oar~~~r
'"`{"`"\"_~e#.21 <.2+4*96;!?log10oa"}_~e#.21 <.2+4*96;!?log10oa

Untuk CJam, program dimulai dengan string multi-line literal. Ini lolos dengan` , dan kemudian menggunakan quine standar untuk mencetak kode quine, serta komentar tambahan.

Ke> <>, yang pertama " memulai string literal yang melewati seluruh baris pertama, mendorong setiap karakter ke stack. Setelah itu, spasi tambahan (dibuat karena input sedang diisi) dihapus, dan kemudian tumpukan dibalik. Setiap karakter dalam tumpukan (yaitu seluruh baris pertama) adalah output, dan kemudian bergerak ke baris kedua.

Baris kedua pada dasarnya melakukan hal yang sama, kecuali bahwa itu di arah yang berlawanan, sehingga Anda tidak perlu membalikkan tumpukan. (Saya tetap melakukannya, karena saya harus menghapus spasi tambahan.)

Akhirnya, bergerak ke baris ketiga. Satu-satunya perbedaan utama adalah bahwa Anda harus melewati blok CJam, yang dilakukan dengan menggunakan .Kutipan tunggal menangkap seluruh baris (sekali lagi, mundur), dan kemudian itu adalah output.


2

C / PHP, 266 304 300 282 241 203 + 10 byte

//<?php
function main($a){printf($a="%c//<?php%cfunction main(%ca){printf(%ca=%c%s%c,13,10,36,36,34,%ca,34,36,10,10,10);}%c#if 0%cmain();%c#endif",13,10,36,36,34,$a,34,36,10,10,10);}
#if 0
main();
#endif

+10 byte karena mengkompilasi dalam C memerlukan flag kompiler GCC -Dfunction= .

Cara kerjanya (dalam PHP):

  • Penerjemah PHP hanya mencetak semuanya sebelum <?phpHTML. //bukan komentar dalam HTML, jadi hanya dicetak.
  • maindideklarasikan sebagai fungsi dengan variabel a.
  • printfmencetak carriage return (untuk mengganti yang sudah dicetak //) dan kemudian kode sumber, menggunakan metode quining C / PHP standar.
  • #if 0 diabaikan oleh PHP.
  • main($a)menginisialisasi variabel kosong a. (Sebelumnya digunakan error_reporting(0)untuk mengabaikan kesalahan yang disebabkan oleh panggilanmain() )
  • #endif juga diabaikan oleh PHP.

Cara kerjanya (dalam C):

  • //<?php adalah komentar single-line, sehingga diabaikan.
  • Kata functionkunci diabaikan karena argumen kompiler baris perintah-Dfunction= .
  • GCC dan Dentang tidak peduli jika variabel mulai dengan atau mengandung $. (Ini menyelamatkan hari.)
  • printf mencetak carriage return (tidak berguna dalam contoh ini) dan kemudian kode sumber, menggunakan metode quining C / PHP standar.
  • #if 0mengabaikan semuanya sampai endif, jadi PHP dapat memanggil main.
  • #endif mengakhiri blok "abaikan aku".

2

Wumpus / > <> / Befunge-98 28 byte

"]#34[~#28&o@,k+deg0 #o#!g00

Cobalah di Wumpus! , Coba di> <>! , Cobalah di Befunge-98!

Bagaimana itu bekerja:

Kode Wumpus:

  " Start string literal
    Bounce off end of line and come back
  " End string literal
   ] Push top of stack to bottom
    #34 Push double quote
       [~ Get bottom of stack and swap it with the double quote
         #28 Push 28
            &o@ Print the top 28 items on stack and terminate program

> <> Kode:

  " Start string literal
    Wrap when it reaches the end of the line
  " End string literal
   ]# Clear stack and reflect
  " Wrapping string literal again, but backwards
                     g00 Get the character from cell 0 (")
                 #o#! Skip into the printing loop
                      Exit with an error

Kode Befunge-98:

  " Wrapping string literal
   ] Turn right
   ] Turn right again, going West
  " Wrapping string literal going West
                 !g00 Get double quote and invert it
              #o# Skip over the o instruction
           g0   Get double quote
        +de Push 27
     @,k    Print 27+1 items from the stack and terminate program.

1

05AB1E / 2sable, 14 byte, tidak bersaing

0"D34çý"D34çý

Cobalah online! (05AB1E)
Cobalah online! (2sable)

2sable berasal dari 05AB1E dan mirip, tetapi memiliki perbedaan besar.

Mengejar baris baru.


1
Saya tidak tahu apa status 2sable dan 05AB1E saat ini, tetapi terakhir kali saya memeriksa saya akan menganggap mereka sebagai dialek yang berbeda dari satu bahasa.
Martin Ender

1

C / TCL, 337 byte

#define set char*f= 
#define F 
#define proc main(){ 
set F "#define set char*f= 
#define F 
#define proc main(){ 
set F %c%s%c; 
proc /* {} {} 
puts -nonewline %cformat %cF 34 %cF 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 
"; 
proc /* {} {} 
puts -nonewline [format $F 34 $F 34 91 36 36] 
set a {*/printf(f,34,f,34,91,36,36);} 

1

C / Vim 4.0, 1636 byte

Berisi karakter kontrol.

map () {}/*
map g ;data0df"f"cf"
f"cf"
f"D2kyyP;g6k2dd4x5jA"JxA","JxA","jyyPkJxA"jok;g2kdd4xkJx3jdd
map ;g O"vdldd0i# 0# 1# 2# 3# 4# 5# #0lx2lx2lx2lx2lx2lx2lx:s/##/#/g
o:s//"/gk0y2lj02lp"addk@ao:s//\\/gk0ly2lj02lp"addk@ao:s///gk04ly2lj02lp05l"vp"addk@ao:s///gk05ly2lj02lp05l"vp"vp"addk@ao:s//
/gk06ly2lj02lp05l"vp"vp"vp"addk@ao:s//
/gk02ly2lj02lp05l"vp"addk@a
unmap ()

map ;data o*/ char*g[]={"map () {}/*#2map g ;data0df#0f#0cf#0#5#3f#0cf#0#5#3f#0D2kyyP;g6k2dd4x5jA#0#3JxA#0,#0#3JxA#0,#0#3jyyPkJxA#0#3jo#3k;g2kdd4xkJx3jdd#2map ;g O#4#4#4#4#3#0vdldd0i## 0## 1## 2## 3## 4## 5## ###30lx2lx2lx2lx2lx2lx2lx:s/####/##/g#5o:s//#0/g#3k0y2lj02lp#0addk@ao:s//#1#1/g#3k0ly2lj02lp#0addk@ao:s//#4#4#3/g#3k04ly2lj02lp05l#0vp#0addk@ao:s///g#3k05ly2lj02lp05l#0vp#0vp#0addk@ao:s//#4#4#5/g#3k06ly2lj02lp05l#0vp#0vp#0vp#0addk@ao:s//#4#4#5/g#3k02ly2lj02lp05l#0vp#0addk@a#2unmap ()#2#2map ;data o*/ char*g[]={","#A#0#a#0,#0#b#0,#0#c#0#C#2","}; /*#3#2#2#0*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf(#0#1n#0);else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}"}; /*

"*/  print(char*s){char*t=s,c,d;while(c=*t++)if(c==35){c=*t++;if(c==35)putchar(c);else if(c==48)putchar(34);else if(c==49)putchar(92);else if(c==50)printf("\n");else if(c==51)putchar(27);else if(c==52)putchar(22);else if(c==53)putchar(13);else if(c>64&&c<91)print(g[c-65]);else printf(g[c-97]);}else putchar(c);}  main(){print(g[1]);}

Vim Anda perlu memiliki set berikut:

set noai
set wm=0
set nosi
set tw=0
set nogdefault

1

C / Lisp, 555 byte

t(setq /*;*/){}main(){char q='\"',s='\\';char*a= 
"~%t(setq /*;*/){}main(){char q='~A';char*a= 
~S;char*b=/* 
)(setq a ~S) 
(setq */ ~S;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);}~%";char*b=/* 
)(setq a "\\\"',s='\\\\") 
(setq */ " 
t(setq /*;*/){}main(){char q='%c%c',s='%c%c';char*a= 
%c%s%c;char*b=/* 
)(setq a %c%c%c%c%c',s='%c%c%c%c%c) 
(setq */ %c%s%c;printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 
";printf(b,s,q,s,s,q,a,q,q,s,s,s,q,s,s,s,s,q,q,b,q/* 
)(format t /* a /* a */);} 

Baris pertama sengaja kosong.


1

Perl / Javascript (SpiderMonkey), 106 byte

$_='$q=+[]?h^O:unescape("%27");print("$_="+$q+$_+$q+";eval($_)"||(q($_),"=$q$_$q;",q(eval($_))))';eval($_)

Coba Perl secara online!
Coba JavaScript online!

Penjelasan

Data quine disimpan dalam $_kedua bahasa dan kemudian evaled, yang merupakan prosedur standar di Perl. Saya memilih SpiderMonkey pada TIO karena memiliki printfungsi, tetapi ini dapat dengan mudah porting ke browser untuk + 20 byte (tambahkan eval("print=alert");ke awal $_definisi s).

Perl melihat data yang disimpan dalam $_dan evals seperti biasa. Karena +[]benar di Perl, 'disimpan $qmelalui string-XOR dari hdan O. Trik terakhir adalah dalam panggilan ke printtempat bagian pertama untuk JavaScript menggunakan +, yang dalam Perl memperlakukan semua item sebagai angka, dan menambahkan hingga 0, maka kita menggunakan ||operator untuk mengembalikan apa yang sebenarnya kita inginkan (q($_),"=$q$_$q;",q(eval($_)))yang setara dengan "\$_=$q$_$q;eval(\$_)".

Dalam JavaScript, +[]pengembalian 0, sehingga kita sebut unescape("%27")ke toko 'di $q(sayangnya, atobdoesm't ada pada SpirderMonkey ...). Dalam panggilan ke print, karena +merupakan operator gabungan dalam JavaScript, blok pertama membangun output yang diinginkan dan bagian kedua setelah ||diabaikan.

Terima kasih atas komentar Patrick Roberts untuk unescapetriknya!


Perl / JavaScript (Peramban), 108 byte

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

Coba Perl secara online!

$_='eval("q=_=>_+``;printf=console.log");printf(q`$_=%s%s%s;eval($_)`,$q=+[]?h^O:atob("Jw"),$_,$q)';eval($_)

Penjelasan

Kami menyimpan data quine $_dalam kedua bahasa dan kemudian eval, yang merupakan prosedur standar di Perl.

Perl melihat data yang disimpan dalam $_dan evals seperti biasa. The evaldalam $_dijalankan dan gagal untuk mengurai, tapi karena itu eval, tidak error. printfkemudian disebut, dengan string yang dikutip tunggal q(), dengan `sebagai pembatas, karena hanya menggunakan `akan menghasilkan perintah yang dieksekusi di shell, maka untuk penggunaan pertama $q, karena +[]benar di Perl, 'disimpan $qmelalui stringwise-XOR dari hdanO .

Dalam JavaScript, evalblok dalam $_set up fungsi q, yang returns argumen sebagai Stringdan alias console.loguntuk printf, karena console.logformat string seperti printfdi Perl. Ketika printfdipanggil +[]kembali 0, maka kami memanggil atobuntuk men '- decode dan menyimpan $q.


1

Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1031 bytes

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='eval("0"?0?"def strtr(s,f,t);s.tr(f,t) end;class String;def chr(n);self+n.chr end;end":"$u=strtr=(s,f,t)=>[...f].reduce((s,a,i)=>s.replace(RegExp(a,`g`),t[i]),s);printf=console.log;(S=String).prototype.chr=function(n){return this+S.fromCharCode(n)}":[]&&"sub strtr{eval q(q(X)=~y/X/X/r)=~s/X/shift/ger}");printf(strtr("%s<?#/.__id__;s=+0;#j;read -d jj q<<jj;s=zj;Q=jecho s=1//2z;_=rksksksz<z?z#/.__id__z;s=+0z;#ksz;read -d ksks qz<z<ksksz;s=zzksz;Q=kskQksz;evalz zkQ;echo kqj;eval kQwk_=j%sj;eval(k_);//;#jjj;f=jjjs=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)jjj;q=_[18]*3;print f%%(q,_,q,q,f,q)%s","jkwz","".chr(39).chr(36).chr(10).chr(92).chr(92)),[]&&"s=1//2;_=r".chr(39).chr(39).chr(39),$_,$u?"":"".chr(10));';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Verifikasi online!

Berdasarkan pembaruan saya untuk jawaban ini , saya pikir saya akan mencoba dan mengoptimalkan kode yang mencetak permutasi yang berbeda, tetapi akhirnya menambahkan di Bash, yang menambahkan lebih banyak byte. Meskipun ini lebih dioptimalkan daripada upaya pertama saya (disimpan lebih dari 300 byte) saya yakin masih bisa di-golf lebih lanjut.


Alternatif Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 bytes

s=1//2;_=r'''<?#/.__id__;s=+0;#';read -d '' q<<'';s=\';Q='echo s=1//2\;_=r$s$s$s\<\?\#/.__id__\;s=+0\;#$s\;read -d $s$s q\<\<$s$s\;s=\\$s\;Q=$s$Q$s\;eval\ \$Q;echo $q';eval $Q
$_='$z=0?"$&".next+92 .chr+10 .chr: 0..a||eval("printf=console.log;unescape`$%27%5C%0Ak`");$q=$z[1]?$z[1]:h^O;printf("%s%s%s%s<?#/.__id__;s=+0;#%s;read -d %s%s q<<%s%s;s=%s%s;Q=%secho s=1//2%s;_=r%ss%ss%ss%s<%s?%s#/.__id__%s;s=+0%s;#%ss%s;read -d %ss%ss q%s<%s<%ss%ss%s;s=%s%s%ss%s;Q=%ss%sQ%ss%s;eval%s %s%sQ;echo %sq%s;eval %sQ%s%s_=%s%s%s;eval(%s_);//;#%s%s%s;f=%s%s%ss=1//2;_=r%%s%%s%%s;f=%%s%%s%%s;q=_[18]*3;print f%%%%(q,_,q,q,f,q)%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)%s",[]&&"s=1//2;_=r",$r=[]&&$q,$r,$r,$q,$q,$q,$q,$q,$b=$z[2]?$z[2]:chr(92),$q,$q,$b,$d=$z[0]?$z[0]:h^L,$d,$d,$b,$b,$b,$b,$b,$d,$b,$d,$d,$b,$b,$d,$d,$b,$b,$b,$d,$b,$d,$d,$d,$b,$b,$b,$d,$d,$q,$d,$n=$z[3]?$z[3]:chr(10),$d,$q,$_,$q,$d,$q,$q,$q,$q,$q,$q,$q,$q,$q,$z[4]?"":$n);';eval($_);//;#''';f='''s=1//2;_=r%s%s%s;f=%s%s%s;q=_[18]*3;print f%%(q,_,q,q,f,q)''';q=_[18]*3;print f%(q,_,q,q,f,q)

Verifikasi online!

Sedikit lebih dekat dengan pendekatan awal saya, tetapi pengulangan argumen untuk printf masih gila. Menggunakan argumen posisi sebagai gantinya membuat ini hanya berfungsi di Chrome dan sulit untuk bekerja di PHP juga karena $sdi %1$sinterpolasi, tetapi bisa menghemat banyak byte, mungkin menggunakan kombinasi dari dua pendekatan ...


0

C / dc, 152 byte

z1d//[[z1d//]P91PP93P[dx]Pq 
;main(){char*a="z1d//[[z1d//]P91PP93P[dx]Pq%c;main(){char*a=%c%s%c;printf(a,10,34,a,34);}//]dx";printf(a,10,34,a,34);}//]dx

Memanfaatkan komentar, ya!


0

Perl 5 / Ruby / PHP / JavaScript (Browser), 153 byte

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

Coba Perl secara online!
Coba Ruby online!
Coba PHP online!

$_='$z=0?"$&".next: 0..a||eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);",$d=$z[0]?$z[0]:h^L,$q=$z[1]?$z[1]:h^O,$_,$q,$d);';eval($_);

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.