Jumlah pesanan

10

Tulis sebuah program yang, ketika dijalankan dalam bahasa yang berbeda, menghasilkan permutasi byte yang berbeda dari kode dalam setiap bahasa. Kode sumber yang tepat dihitung sebagai satu permutasi.

Di sini "bahasa yang berbeda" dapat berupa versi yang berbeda (Py 2 dan Py 3) atau bendera standar yang berbeda. Output berbeda yang memaksa versi berbeda.

Aturan quine yang tepat berlaku untuk program dalam setiap bahasa. Skor Anda dihitung sebagai (Language count)^6/(Code length in bytes), dengan skor yang lebih tinggi lebih baik.

Sampel:

Jika kode Anda AABdan berjalan dalam tiga bahasa berbeda kembali ABA, AABdan AAB, maka nilainya adalah 2^6/3(hanya satu dari dua yang AABdihitung). Tidak apa-apa jika ABAtidak ada artinya.

l4m2
sumber
1
Apa yang dianggap sebagai bahasa yang berbeda?
Laikoni
4
Definisi quine yang tepat mana yang berlaku? ( Martin , atau ais523 ini , atau mungkin beberapa definisi lain dalam meta benang ini?) Apakah aturan Quine yang tepat hanya berlaku untuk interpretasi dari program yang yang benar-benar quines? (Untuk apa nilainya, saya pikir tantangan ini tidak banyak diperbaiki dengan menerapkan aturan quine yang tepat.)
Lynn
Untuk memperjelas, mengerjakan contoh Anda - jika kode saya AABdicetak AABdalam bahasa-1 dan ABAdalam bahasa-2, saya berasumsi bahwa itu harus quine yang tepat ketika dilihat sebagai program bahasa-1, dan tidak ada batasan lebih lanjut yang melibatkan penafsirannya sebagai program bahasa-2. Apakah itu benar?
Lynn
1
Apakah panjang kode dihitung dalam karakter atau byte? Apa yang harus kita lakukan dengan pengkodean karakter yang berbeda?
dylnan
1
Bagaimana dengan byte vs karakter?
dylnan

Jawaban:

10

Befunge-98 , > <> , Gol> <> , Fission , Wumpus , Kardinal , Beeswax dan Alice Score: 8 6 /88 = 2978,909

"65*4+059*$!#.39*0jp2+'Wk,@ ''5&.'\d&o@o&88#+\@ol?!,'.'0.6'!+Ox,++tttt=++%-$#}.6~.F4*`*R

Cobalah di Befunge! Coba di> <>! Cobalah di Gol> <>! Cobalah dalam Fisi! Cobalah di Wumpus! Cobalah di Cardinal! Cobalah dalam lilin lebah! Cobalah di Alice!

Verifikasi!

Banyak bahasa 2D, semuanya menyalahgunakan string pembungkus literal. Perbedaan dalam output adalah sebagai berikut:

> <>, Gol> <> dan Befunge-98 semua mencetak kode mundur (kecuali untuk " ), dengan tiga karakter terakhir di posisi yang berbeda R*",, O"*dan "R*masing - masing. Lilin lebah juga memiliki kode mundur, tetapi tiga karakter terakhir diselingi di bagian pertama dari output. Alice sebagian besar mundur, kecuali untuk semua karakter yang lolos ( ', \dan ") pindah ke depan sebagai gantinya.

Wumpus adalah satu-satunya quine yang sebenarnya, Fission menempatkan "di akhir kode alih-alih awal, dan Cardinal menempatkan "antara 0dan 5dekat awal.

Bukti permutasi yang berbeda

Penjelasan:

Befunge-98:

"  Wrapping string literal pushes all other characters + a space to the stack
 65*4+  Push " to the stack
      059*$!#.39*0j   Push 1,27 to the stack
                   p  Pops the top three values of the stack (27,1,34)
                    2+  Adds 2 to the space to make "
                      'Wk,@  Prints the top 88 characters of the stack and terminates

> <> dan Gol> <>:

Sejujurnya, saya tidak berbuat banyak di sini. Satu-satunya perbedaan antara eksekusi kedua bahasa ini adalah @perintah, yang memutar tiga nilai teratas tumpukan dengan cara berbeda untuk setiap bahasa.

"  Wrapping string literal pushes all other characters to the stack
 65*4+  Push 34 (") to the stack
      059*$!#.  Jump to cell 45,0
                                   \@  Rotate the top three values of the stack 
                                     ol?!,'.'0.  Output the whole stack, ending in a divide by 0/stack underflow error

Pembelahan:

 "............R  Spawn a pointer going right

 "  Switch to printing mode and print every other character
 "  Switch off printing mode
  6  Teleport to other 6
 "........6'!+O   Print the "

Wumpus:

"  Bouncing string literal
 65*4+  Push a (")
      059*$!#.   Push 0 and jump to cell 0,45
                                        \  Reflect off mirror
                                       +   Add 0 to top of stack
                                 @o&88#    Print the top 88 characters of the stack

Kardinal:

                                 %   Spawn two pointer going left/right (up/down despawn immediately)
                                  -$  Right pointer jumps to cell -1,0
                      x,++tttt=++     Left pointer prints "
"  While right pointer switches to print mode and prints the code

Lilin Lebah:

 "................*`*   Spawn pointers going in every direction
                        Every other * also spawns pointers, but they do nothing
                   `    Turn on print mode for two of the pointers going in different directions
                        This prints everything but the `
          #}.6~.F4*     Print a `

Alice:

"  Wrapping string literal pushes all other characters to the stack
   Except 's and mirrors
 65*4+  Push " to the stack
      059*$!#.  Does nothing
              39*0j  Jumps to cell 39,0
                         ''5&.    Push ' and duplicate it 5 times
                              '\  Push \
                                d&o@  Print the whole stack
Jo King
sumber
6

Perl 5 , Ruby , JavaScript (Chrome), PHP , Python 2 , Python 3 , 1206 bytes, mencetak 6 6 /1206 = 38,6865671641791

q=1//2;s=+0;s|0;"/.__id__;#";_="""q=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%"))""";R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q="""|;#<?ob_end_clean();
eval($_='"$t"?0?[$q=37 .chr+113 .chr+38 .chr,$p=(96 .chr+39 .chr)*4,$n=10 .chr,$s=39 .chr*12,$S=34 .chr*3]:eval("printf=console.log;c=String.fromCharCode;$q=c(96);$p=c(37,113,38,39).repeat(4);$n=c(10);$s=c(39).repeat(12);$S=c(34,34,34)"):[]?[$q=q(!g)^PA,$p=HARHARHARHAR^od2od2od2od2,$n=R^X,$s=bbbbbbbbbbbb^EEEEEEEEEEEE,$S=hhh^JJJ]:[$q=O^h,$p=str_repeat(RHa3^w9GS,4),$n=R^X,$s=str_repeat(b^E,12),$S=HHH^jjj];//#');printf($x='q=1//2;s=+0;s|0;"/.__id__;#";_=%7$sq=1//2;s=+0;s|0;"/.__id__;#";_={0}{1}{0};R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q={0}{2}{0};print(_.format(Q,_,q[0:-12]+R,"%8$s"))%7$s;R=chr((39,34)[1/2>0])*12;Q=chr((39,34)[1/2==0])*3;q=%7$s|;#<?ob_end_clean();%5$seval($_=%3$s%1$s%3$s);printf($x=%3$s%2$s%3$s,$_,$x,$q,$p,$n,$s,$S,"%8$s",![]||([]+[])?$n:"");//#%4$s%6$s%7$s;print(_.format(Q,_,q[0:-12]+R,"%8$s"))%9$s',$_,$x,$q,$p,$n,$s,$S,"%",![]||([]+[])?$n:"");//#`q&%`q&%`q&%`q&%''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))

Validasi Perl, Ruby, PHP, Python 2 dan Python 3 online!

Catatan : menjalankan program di atas di konsol Inspektur di Chrome (yang muncul untuk mendukung argumen posisiconsole.log ) mengembalikan program yang benar.

Penjelasan

Ini ternyata jauh lebih lama dari yang saya harapkan dan saya membuat hidup saya sedikit lebih sulit juga, jadi saya cenderung terus mengotak-atiknya. Saya juga ingin menambahkan lebih banyak bahasa, tetapi saya perlu menemukan sesuatu yang tidak masalah$ sigil ...

Ini cukup banyak format Quine standar dimana perhitungan kutipan untuk digunakan sedikit berbeda untuk setiap bahasa: di Ruby %q&digunakan, PHP menggunakan ', JavaScript (Node.js) memanfaatkan `dan Perl 5 Memanfaatkan q(... ). Karena hanya tanda kutip yang berubah, sisa dari program ini masih dapat dieksekusi dan sintaks yang valid dalam setiap bahasa. Python 2 dan 3 dililit program sebelumnya menggunakan """untuk Python 2 dan '''untuk Python 3.

Resultan program Perl dan Ruby tidak quines standar, tambahan q/ %qs ditambahkan setiap iterasi, namun kembali program pertama dengan benar.

Hasilnya adalah:

  • Perl 5:
    eval($_=q&... q&);printf($x=q&... q&,... );//#'%`'%`'%`'%`''''''''''''"""...
  • Ruby:
    eval($_=%q&... %q&);printf($x=%q&... %q&,... );//#`'`'`'`'''''''''''''"""...
  • JavaScript (Chrome):
    eval($_=`... `);printf($x=`... `,... );//#%q&'%q&'%q&'%q&'''''''''''''"""...
  • PHP:
    eval($_='... ');printf($x='... ',... );//#`q&%`q&%`q&%`q&%''''''''''''"""...
  • Python 2:
    ... _="""... """;... q="""...''''''''''''""";print(_.format(Q,_,q[0:-12]+R,"%"))
  • Python 3:
    ... _='''... ''';... q='''...""""""""""""''';print(_.format(Q,_,q[0:-12]+R,"%"))

Saya sudah sering mengerjakan ulang ini, saya harap saya tidak melewatkan kunci apa pun di sini. Saya masih memiliki cara untuk pergi ke mana saja di dekat skor Jo King ...

Dom Hastings
sumber
2

Jelly , dan M , 2 6 /14 = 4,57

1Ɗṙ@“1Ɗṙ@ȮṾ”ȮṾ

Cobalah di Jelly!

Coba di M!

Ɗṙ@ȮṾ1“Ɗṙ@ȮṾ1” dalam Jelly

1Ɗṙ@ȮṾ“1Ɗṙ@ȮṾ” dalam M.

dylnan
sumber
Saya tidak yakin bahwa arang dianggap sebagai quine yang tepat
H.PWiz
@ H.PWiz Saya baru saja akan menambahkan komentar yang mengatakan itu. Saya akan bertanya OP
dylnan
@ l4m2 apakah Anda menganggap program Charcoal quine yang tepat? Saya akan menghapus jika tidak.
dylnan
Saya kira seperti Quinedi PHP?
l4m2
@ l4m2 Tidak yakin, saya tidak tahu PHP. Ini berfungsi untuk sebagian besar teks ASCII yang saya pikir
dylnan
2

Python 2 dan Python 3 , 2 6 /61 = 1,05

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

Cobalah dengan Python 2!

Cobalah dengan Python 3!

Disimpan 12 byte berkat Jo King.

Cetakan Python 2

s=')]1-2*)0>2/1(::[s%%s(tnirp;r%=s';print(s%s[::(1/2>0)*2-1])

Cetakan Python 3

s='s=%r;print(s%%s[::(1/2>0)*2-1])';print(s%s[::(1/2>0)*2-1])

Ini menggunakan fakta yang 1/2ada .5di Python 3 dan 0Python 2.

dylnan
sumber
1

Bash / GolfScript, 72 byte, skor 2 6 /72 = 8/9 (~ 0,888 ...)

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

Berisi satu ruang trailing tunggal pada dua baris pertama.

Cobalah online di Bash.
Cobalah online di GolfScript.

Cukup modifikasi jawaban @ jimmy23013 untuk tantangan " Write a Polyquine " . Modifikasi yang dilakukan adalah menghapus ruang trailing setelah baris ketiga, dan berubah \n"+@n.;menjadi\n "+@n; .

Bash akan mencetak baris 1 dan 2 seperti ini:

.~0 ()    <- Trailing space
{         <- Trailing space

Dan GolfScript akan mencetak baris 1 dan 2 seperti ini:

.~0 ()   <- No trailing space
 {       <- Both leading and trailing space

Di sini, program dasar, keluaran Bash, dan keluaran GolfScript masing-masing dengan baris baru diganti dengan \n:

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

      ^^^ Note the difference here
Kevin Cruijssen
sumber