Viết một Polyquine


33

Một polyquine là cả quine và polyglot. 1 Bạn phải viết một quine có giá trị bằng ít nhất hai ngôn ngữ khác nhau. Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

1 tôi đã làm điều đó lên. Hay đúng hơn, Geobits đã làm . Rõ ràng, anh cũng không phải là người đầu tiên .

Quy tắc cho Quines

Chỉ có quines thực sự được chấp nhận. Đó là, bạn cần in toàn bộ mã nguồn nguyên văn sang STDOUT, không có :

  • đọc mã nguồn của bạn, trực tiếp hoặc gián tiếp.
  • dựa vào môi trường REPL chỉ đơn giản là đánh giá và in mọi biểu thức bạn cung cấp cho nó.
  • dựa vào các tính năng ngôn ngữ chỉ in ra nguồn trong một số trường hợp nhất định.
  • sử dụng thông báo lỗi hoặc STDERR để viết tất cả hoặc một phần của quine. (Bạn có thể viết mọi thứ cho STDERR hoặc đưa ra các cảnh báo / lỗi không nghiêm trọng miễn là STDOUT là một câu hỏi hợp lệ và các thông báo lỗi không phải là một phần của nó.)

Hơn nữa, mã của bạn phải chứa một chuỗi bằng chữ.

Quy tắc cho Polyglots

Hai ngôn ngữ được sử dụng phải khác biệt rõ ràng. Đặc biệt:

  • Chúng không được là các phiên bản khác nhau của cùng một ngôn ngữ (ví dụ: Python 2 so với Python 3).
  • Chúng không được là các phương ngữ khác nhau của cùng một ngôn ngữ (ví dụ Pascal so với Delphi).
  • Một ngôn ngữ có thể không phải là tập hợp con của ngôn ngữ khác (ví dụ C so với C ++).

4
"Mã của bạn phải chứa một chuỗi ký tự" Ngay cả trong các ngôn ngữ không có chuỗi ký tự, chẳng hạn như Brainfuck?
Peter Olson

@PeterOlson Mục đích của quy tắc là tránh một vài sơ hở trong các ngôn ngữ dành riêng cho môn đánh gôn (ví dụ: ngôn ngữ này ). Vì tôi không thể lường trước việc loại bỏ hoặc làm suy yếu quy tắc sẽ dẫn đến điều gì (và vì tôi không phải là người thích thay đổi quy tắc trừ khi thực sự cần thiết), tôi xin lỗi, nhưng việc gửi BF sẽ không hợp lệ cho mục đích này thử thách. Nếu đó là bất kỳ sự an ủi nào, một bài nộp BF có thể sẽ không thể cạnh tranh được. ;)
Martin Ender

1
"Anh ấy không phải là người đầu tiên" liên kết đến đâu?
Erik the Outgolfer

2
C không thực sự là một tập hợp con của C ++.
MD XF

Có hai ngôn ngữ Brainf ** k khác nhau được tính là cùng một ngôn ngữ, chẳng hạn như Brainf ** k và MOO không?
MD XF

Câu trả lời:


14

CJam / GolfScript, 34 byte

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

Số byte chứa một nguồn cấp dữ liệu theo dõi, vì chương trình sẽ không phải là một quine mà không có nó.

Trong khi CJam và GolfScript rất giống nhau ở một số khía cạnh, có rất nhiều sự khác biệt. Để biến điều này thành một polyquine "trung thực", tôi quyết định dựa vào sự khác biệt càng nhiều càng tốt. Ngoại trừ cú pháp khối và chuỗi (mà các ngôn ngữ chia sẻ với oh rất nhiều người khác), không có phần mã nào đạt được chính xác như nhau trong cả hai ngôn ngữ.

Trình thông dịch GolfScript trực tuyến có lỗi; chương trình này chỉ hoạt động với thông dịch viên chính thức.

Chạy ví dụ

$ 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

Cách thức hoạt động (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.                                                ";

Cách thức hoạt động (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$~

Giải pháp gian lận tránh sự khác biệt của ngôn ngữ càng nhiều càng tốt.

Dùng thử trực tuyến:

Cách thức hoạt động (CJam)

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

Cách thức hoạt động (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

Tôi sử dụng thuộc tính mà ký tự trong Java có thể được viết dưới dạng các chuỗi unicode giống hệt nhau. Nếu chúng ta có Ahướng dẫn cho trình biên dịch C # và Bhướng dẫn cho Java, chúng ta có thể sử dụng đoạn mã sau:

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

Nó sẽ được "công nhận" theo cách sau với C #:

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

Và theo cách sau của Java:

//
/*
A//*/B

Bởi vì \u000Angắt dòng, \u002F/\u002Anằm *trong Java.

Vì vậy, polyglot-quine cuối cùng là:

//\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);}}

Tuy nhiên, kích thước quá lớn vì tính dài dòng của ngôn ngữ.

Biên dịch có sẵn trên ideone.com: C # , Java .


3
Chào mừng bạn đến với cộng đồng Câu đố & Mã Golf Lập trình!
Erik the Outgolfer

2
Tôi biết đã gần hai năm, nhưng bạn có thể chơi golf 58 byte. Hãy thử Java trực tuyến. và dùng thử trực tuyến C # .NET.
Kevin Cruijssen

Ý bạn là 688 byte?
Ivan Kochurkin

13

Python 3 và JavaScript, 134 byte

Đây là nỗ lực (cuối cùng?) Của tôi:

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)

Nó có thể được chơi gôn nhiều hơn một chút, đặc biệt là nếu có ai biết cách tốt hơn để có được các trích dẫn đơn trong JavaScript.


Đun sôi xuống, chương trình trông như thế này:

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

Các eval()chức năng sẽ đánh giá biểu thức trong cả hai ngôn ngữ. Vì vậy, chuỗi dài được thực thi:

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

Điều này phân tách chuỗi dài theo khoảng trắng và đánh giá chuỗi con được lập chỉ mục bởi 2%-4. JavaScript sẽ chạy chuỗi con thứ ba ( 2 % -4 == 2) và Python thứ hai cuối cùng ( 2 % -4 == -2), bởi vì các toán tử modulo của chúng hoạt động khác nhau đối với các phủ định.

Phần còn lại của chuỗi bị bỏ qua trong cả hai ngôn ngữ. JavaScript dừng tại //, trong khi Python xem nó là phép chia số nguyên và dừng tại #.

Vì vậy, JavaScript in mã nguồn vào bảng điều khiển ở đây:

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

Và Python ở đây:

print(a[-12:]%a)

Cả hai đều sử dụng phần cuối cùng của chuỗi, là một mẫu của chương trình:

a=%r;eval(a)

+1 Đã đánh gôn tới 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"]). Đã thử nghiệm bằng JavaScript nhưng không phải bằng python ... nhưng nó sẽ hoạt động.
soktinpk

@soktinpk Cảm ơn, nhưng tôi không nghĩ Python sẽ cho phép 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;

Sao chép nguyên văn từ câu chuyện Perl của Christopher Durr .

Đây là quy tắc lạm dụng. Ruby và Perl chắc chắn không phải là cùng một ngôn ngữ, Perl cũng không phải là một tập hợp con của Ruby (ví dụ, hầu hết các quines Perl được liên kết không hoạt động trong Ruby). Nhưng Ruby được thiết kế để có thể trông rất giống Perl nếu bạn muốn, và điều này xảy ra rất nhiều khi chơi golf.


Điều này có thể được thực hiện để làm việc (hoặc đã có) trong PHP không? Nếu tôi đang đọc tài liệu chính xác, bạn có thể chạy nó trên dòng lệnh -Rvà bạn không cần các thẻ script. php.net/manual/en/features.commandline.options.php
hmatt1

Tôi sẽ không gọi đó là lạm dụng quy tắc. Tìm một câu hỏi hoạt động trên giao điểm của hai ngôn ngữ chắc chắn là một cách hợp lệ để tiếp cận câu hỏi này. Tuy nhiên, thấy đây không phải là công việc của riêng bạn, tôi thích hơn nếu bạn đánh dấu wiki cộng đồng.
Martin Ender

@chilemagic quả thật đấy!
lịch sử

@ MartinBüttner đã làm xong.
lịch sử

6

Bash / GolfScript, 73

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

Có một khoảng trống ở mỗi trong 3 dòng đầu tiên.

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);
#?>

Chạy với:

$ php quine.pl
$ perl quine.pl

Các phpcode đang thực sự chạy (không chỉ in chính nó).


5

Bash / Ruby, 104 82

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

Phiên bản cũ hơn:

"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 mà không có hành vi không xác định

"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, tôi thậm chí không hiểu cách thức hoạt động của mã Ruby: D
Martin Ender

@ MartinBüttner <<atrong Ruby hoạt động giống như Bash, nhưng trả về một chuỗi. Tôi đã không viết một chương trình Ruby trước đây. Tôi chỉ tìm thấy một ngôn ngữ ngẫu nhiên với tính năng này.
jimmy23013

Tôi cũng không biết nó hoạt động như thế nào trong bash: P
Martin Ender

@ MartinBüttner Nó được gọi là heredoc. <<wordtrả về một chuỗi được đóng bởi một dòng với một word.
jimmy23013

5

reticular / befunge-98, 28 byte [không biên dịch]

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

Hãy thử lưới! Hãy thử befunge 98!

Bất cứ điều gì ở giữa ;s trong befunge đều bị bỏ qua và !bỏ qua đoạn giữa ;các s cho hình lưới. Do đó, reticular thấy:

<@,+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 thấy:

<@,+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 / Mathicala, 225 byte

Đây là polyquine rất dễ đánh bại của riêng tôi (phục vụ như là ví dụ và bằng chứng về khái niệm):

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

Phần đầu tiên dựa trên quine Ruby này và về cơ bản là:

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

Việc gán chuỗi hoàn toàn giống nhau trong Mathicala. Các puts s%sđược hiểu như là một sản phẩm của 4 biểu tượng: puts, chuỗi s, %(kết quả REPL cuối cùng hoặc Out[0]nếu đó là biểu hiện đầu tiên bạn đánh giá) và một người khác s. Điều đó tất nhiên là hoàn toàn vô nghĩa, nhưng Mathematica không quan tâm và ;triệt tiêu bất kỳ đầu ra nào, vì vậy điều này chỉ được xử lý một cách âm thầm. Sau đó# làm cho phần còn lại của dòng nhận xét cho Ruby trong khi Mathicala tiếp tục.

Đối với mã Mathicala, phần lớn nhất của nó, là mô phỏng xử lý chuỗi định dạng của Ruby mà không sử dụng bất kỳ chuỗi ký tự nào. FromCharacterCode@{37,112}%pFromCharacterCode@{37,112}%%. Cái trước được thay thế bằng chính chuỗi, (trong đó InputFormthêm dấu ngoặc kép) cái sau bằng một chuỗi %. Kết quả là Printed. Cái bắt cuối cùng là làm thế nào để đối phó với điều đó #ở phía trước. Đây là biểu tượng của Mathicala cho đối số đầu tiên của hàm thuần (ẩn danh). Vì vậy, những gì chúng ta làm là chúng ta tạo ra tất cả các chức năng thuần túy đó bằng cách nối thêm& và gọi ngay hàm đó bằng đối số 1. Chuẩn 1bị một hàm gọi "nhân" kết quả với1, mà Mathicala một lần nữa chỉ nuốt bất kể loại vật nào được trả về bởi hàm.


2

> <> và CJam, 165 byte

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

Đối với CJam, chương trình bắt đầu với một chuỗi nhiều dòng. Điều này được thoát với `, và sau đó nó sử dụng quine tiêu chuẩn để in mã quine, cũng như một nhận xét dấu.

Đến> <>, đầu tiên "bắt đầu một chuỗi ký tự đi qua toàn bộ hàng đầu tiên, đẩy mọi ký tự vào ngăn xếp. Sau đó, các khoảng trắng ở cuối (được tạo do đầu vào được đệm) sẽ bị xóa và sau đó ngăn xếp được đảo ngược. Mỗi ký tự trong ngăn xếp (tức là toàn bộ hàng đầu tiên) là đầu ra, và sau đó nó di chuyển xuống hàng thứ hai.

Hàng thứ hai về cơ bản cũng làm điều tương tự, ngoại trừ việc nó ở hướng ngược lại, vì vậy bạn không cần phải đảo ngược ngăn xếp. (Dù sao thì tôi cũng phải xóa vì phải xóa dấu cách.)

Cuối cùng, nó chuyển sang dòng thứ ba. Sự khác biệt lớn duy nhất là bạn phải bỏ qua khối CJam, được thực hiện bằng cách sử dụng .Trích dẫn duy nhất ghi lại toàn bộ dòng (một lần nữa, ngược lại), và sau đó nó là đầu ra.


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 vì biên dịch trong C yêu cầu cờ trình biên dịch GCC -Dfunction=.

Cách thức hoạt động (trong PHP):

  • Trình thông dịch PHP chỉ đơn giản là in mọi thứ trước <?phpHTML. //không phải là một nhận xét trong HTML, vì vậy nó được in đơn giản.
  • mainđược khai báo là một hàm với một biến a.
  • printfin một bản hoàn trả vận chuyển (để ghi đè lên bản đã in //) và sau đó là mã nguồn, sử dụng phương thức phân loại C / PHP tiêu chuẩn.
  • #if 0 bị bỏ qua bởi PHP.
  • main($a)khởi tạo một biến rỗng a. (Trước đây được sử dụng error_reporting(0)để bỏ qua lỗi gây ra bởi cuộc gọi main())
  • #endif cũng bị PHP bỏ qua.

Cách thức hoạt động (bằng C):

  • //<?php là một nhận xét một dòng, vì vậy nó bị bỏ qua.
  • Các functiontừ khóa được bỏ qua do trình biên dịch đối số dòng lệnh -Dfunction=.
  • GCC và Clang không quan tâm nếu các biến bắt đầu bằng hoặc chứa $. (Điều này đã lưu trong ngày.)
  • printf in một trả về vận chuyển (trong trường hợp này là vô dụng) và sau đó là mã nguồn, sử dụng phương thức khai thác C / PHP tiêu chuẩn.
  • #if 0bỏ qua mọi thứ cho đến khi endif, vì vậy PHP có thể gọi main.
  • #endif kết thúc khối "phớt lờ tôi".

2

Wumpus / > <> / Befunge-98 28 byte

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

Hãy thử nó trong Wumpus! , Hãy thử trong> <>! , Hãy thử nó trong Befunge-98!

Làm thế nào nó hoạt động:

Mã 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

> <> Mã:

  " 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

Mã 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

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

Chứa các ký tự điều khiển.

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 của bạn cần có bộ sau:

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 */);} 

Cố ý để trống dòng đầu tiên.


1

Perl / Javascript (SpiderMonkey), 106 byte

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

Hãy thử Perl trực tuyến!
Hãy thử JavaScript trực tuyến!

Giải trình

Dữ liệu quine được lưu trữ bằng $_cả hai ngôn ngữ và sau đó là evaled, đây là quy trình chuẩn khá nhiều trong Perl. Tôi đã chọn SpiderMonkey trên TIO vì nó có printchức năng, nhưng điều này có thể dễ dàng được chuyển đến trình duyệt với giá trị hơn 20 byte (thêm eval("print=alert");vào đầu $_định nghĩa s).

Perl thấy dữ liệu được lưu trữ $_evals như bình thường. Vì +[]là sự thật trong Perl, 'được lưu trữ $qthông qua chuỗi XOR của hO. Thủ thuật cuối cùng là trong cuộc gọi đến printnơi phần đầu tiên sử dụng JavaScript +, trong Perl coi tất cả các mục là số và cộng lại 0, sau đó chúng tôi sử dụng ||toán tử để trả về những gì chúng tôi thực sự muốn (q($_),"=$q$_$q;",q(eval($_)))tương đương "\$_=$q$_$q;eval(\$_)".

Trong JavaScript, +[]trả về 0, vì vậy chúng tôi gọi unescape("%27")để lưu trữ 'trong$q (không may, atobdoesm't tồn tại trong SpirderMonkey ...). Trong lệnh gọi print, vì +là toán tử nối trong JavaScript, khối đầu tiên xây dựng đầu ra mong muốn và phần thứ hai sau khi ||bị bỏ qua.

Nhờ vào bình luận của Patrick Roberts về unescapemánh khóe!


Perl / JavaScript (Trình duyệt), 108 byte

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

Hãy thử Perl trực tuyến!

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

Giải trình

Chúng tôi lưu trữ dữ liệu quine trong $_ bằng cả hai ngôn ngữ và sau evalđó là tiêu chuẩn khá nhiều trong Perl.

Perl thấy dữ liệu được lưu trữ $_evals như bình thường. Bên evaltrong $_được thực thi và không phân tích cú pháp, nhưng vì nó evalkhông có lỗi. printfsau đó được gọi, với một chuỗi được trích dẫn q(), với `tư cách là dấu phân cách, vì chỉ cần sử dụng `sẽ dẫn đến các lệnh được thực thi trong shell, sau đó cho lần sử dụng đầu tiên $q, vì sự +[]thật trong Perl, 'được lưu trữ $qthông qua chuỗi XOR của hO.

Trong JavaScript, các evalkhối trong $_bộ lên một chức năng q, đó returnlà lý lẽ của nó như là một Stringvà bí danh console.logđể printf, vì console.logđịnh dạng chuỗi như printftrong Perl. Khi printfđược gọi là +[]trả về 0, vì vậy chúng tôi gọi atobđể giải mã 'và lưu trữ trong $q.


1

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

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)

Xác nhận trực tuyến!

Dựa trên những cập nhật của tôi cho câu trả lời này , tôi nghĩ rằng tôi đã thử và tối ưu hóa mã in một hoán vị khác, nhưng cuối cùng lại thêm vào Bash, dù sao cũng đã tải thêm byte. Trong khi điều này được tối ưu hóa hơn lần thử đầu tiên của tôi (được lưu trên 300 byte), tôi chắc chắn rằng nó vẫn có thể được chơi gôn hơn nữa.


Thay thế Perl 5 / Ruby / JavaScript (Node.js) / Bash / Python 2 / PHP , 1040 byte

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)

Xác nhận trực tuyến!

Gần hơn một chút với cách tiếp cận ban đầu của tôi, nhưng sự lặp lại của các cuộc tranh luận printfvẫn còn điên rồ. Sử dụng đối số vị trí thay vì làm cho công việc duy nhất này trong Chrome và là khó khăn để có được làm việc trong PHP cũng bởi vì $strong %1$sđược nội suy, nhưng có thể tiết kiệm rất nhiều byte, có lẽ sử dụng một sự kết hợp của hai cách tiếp cận ...


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

Lợi dụng ý kiến, yeah!


0

Perl 5 / Ruby / PHP / JavaScript (Trình duyệt), 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($_);

Hãy thử Perl trực tuyến!
Hãy thử Ruby trực tuyến!
Hãy thử PHP trực tuyến!

$_='$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($_);

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.