Các quine meta-polyglot


18

Trong thời gian của tôi trên PPCG, tôi đã nhận thấy rằng các vấn đề về quine và polyglot khá phổ biến. Ngoài ra, các giải pháp meta cho các vấn đề, nghĩa là các tập lệnh tạo ra một chương trình là giải pháp cho một vấn đề, có xu hướng nhận được nhiều phản hồi tích cực từ cộng đồng. Do đó, tôi đã tạo ra thử thách này, thực hiện ba ý tưởng này.

Sau đó, nhiệm vụ của bạn, người đọc và người đam mê , là tạo ra một đoạn mã ngắn nhất có thể chạy bằng hai ngôn ngữ A và B để tạo ra các câu hỏi cho A và B. Khi chương trình của bạn chạy bằng ngôn ngữ A, nó sẽ tạo ra một chương trình đó là một quine trong ngôn ngữ B nhưng không phải trong ngôn ngữ A và ngược lại. Các ngôn ngữ A và B có thể là phiên bản khác nhau của cùng một ngôn ngữ, miễn là bạn nhớ rằng các quines được tạo chỉ nên hoạt động ở một trong các phiên bản.

Hãy nhớ rằng các sơ hở tiêu chuẩn nên được coi là đóng và chỉ cho phép các quy tắc thích hợp .

Chúc may mắn, ít nhân vật chiến thắng!


1
Quine về cơ bản là một meta-meta-meta-meta-meta-meta-meta-v.v. dù sao chương trình :)
Esolanging Fruit 8/11/2016

Làm thế nào để đếm byte nếu hai ngôn ngữ sử dụng mã hóa ký tự khác nhau? Bạn có thể nên ghi điểm bằng các ký tự thay vì byte
Luis Mendo

1
Nếu tôi chạy quine trong ngôn ngữ A để tạo ra một quine cho ngôn ngữ B, thì điều đó có thể chạy được trong A không?
corvus_192

2
@LuisMendo Khi viết một polyglot cho các ngôn ngữ có mã hóa khác nhau, tôi giả sử rằng cả hai đều nhận được cùng một luồng byte (không phải mã hóa khác nhau của cùng một ký tự).
Martin Ender

1
@Pavel Tôi thực sự đã viết một thử thách tương tự ở đây , nhưng nó đã bị đóng như một bản sao.
Oliver Ni

Câu trả lời:


5

CJam 0,6,6 dev / GolfScript, 15 14 12 byte

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

Cảm ơn @ jimmy23013 vì đã chơi golf 2 byte!

Phần còn lại để được cập nhật.

xác minh

Vì việc đệ trình liên quan đến khoảng trắng đáng kể, tốt nhất nên so sánh các 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$~.

Camam

Bản in của CJam "`0$~"0$~và một linefeed trailing. Hãy thử trực tuyến!

Chương trình được tạo sẽ in "`0$~"0$~với linefeed trailing trong GolfScript ( Thử trực tuyến! ), Nhưng không có linefeed trong CJam ( Thử trực tuyến! ).

Cách thức hoạt động của meta

"`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.

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

"`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.

Không giống như GolfScript, CJam không in một nguồn cấp dữ liệu theo mặc định, vì vậy đây không phải là một câu hỏi trong CJam.

GolfScript

Bản in GolfScript "`0$~"0$~, không có khoảng trắng ở cuối. Hãy thử trực tuyến!

Chương trình được tạo sẽ in "`0$~"0$~mà không có khoảng trắng theo dõi trong CJam ( Dùng thử trực tuyến! ), Nhưng GolfScript sẽ thêm một nguồn cấp dữ liệu ( Thử trực tuyến! ).

Cách thức hoạt động của meta

"`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.

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

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

Không giống như CJam, GolfScript sẽ nối thêm một nguồn cấp dữ liệu vào nội dung của ngăn xếp, vì vậy đây không phải là một điểm trừ trong GolfScript.


Chỉ cần tò mò, theo nghĩa rộng, sự khác biệt giữa CJam và GolfScript là gì và tại sao mã của bạn hoạt động?
Pavel

CJam được truyền cảm hứng rất nhiều bởi GolfScript và chủ yếu là tương thích ngược. Một điểm khác biệt lớn là GolfScript, theo mặc định, sẽ thêm một nguồn cấp dữ liệu vào đầu ra, trong khi CJam thì không, đó là những gì tôi đang khai thác ở đây. Tôi sẽ thêm một lời giải thích chi tiết càng sớm càng tốt.
Dennis

1
"0$p"0$~a:n;.
jimmy23013

@ jimmy23013 Rất vui, cảm ơn bạn! Tôi đã từng đùa giỡn a:n, nhưng việc sử dụng pđã không xảy ra với tôi.
Dennis

8

CJam / Phân hạch, 22 byte

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

Hãy thử nó trong CJam. Hãy thử nó trong phân hạch.

Trong CJam, điều này in ra quine phân hạch tiêu chuẩn :

'!+OR"

Hãy thử quine phân hạch.

Trong phân hạch, bản in này là một "biến thể không có của quine CJam tiêu chuẩn:

{'_'~}_~

Hãy thử quin CJam.

Điều này cũng hoạt động cho 22 byte (in cùng một quines):

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

Giải trình

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

Vì vậy, vào cuối chương trình, ngăn xếp chứa chuỗi "'!+OR"và ký tự ", cả hai đều được in ngầm.

Trong phân hạch, dòng chương trình bắt đầu từ Rmột nguyên tử phải. '"chỉ thay đổi khối lượng nguyên tử, ), 5-được bỏ qua vì nhiều lý do. Sau đó nguyên tử vào chế độ in tại "và in {'_'~}_~. ;phá hủy nguyên tử và chấm dứt chương trình.


4
+1 cho biểu tượng cảm xúc{'_'~}
betseg

5
phá hủy nguyên tử mà tôi không muốn ở gần khi điều đó xảy ra
Luis Mendo

6

Clojure / Lisp thông thường, 274 byte

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

Một số không gian được thêm vào để dễ đọc

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

Về cơ bản định nghĩa một macro trả về một quine trong Clojure. Clojure yêu cầu các tham số cho định nghĩa macro được cung cấp dưới dạng vector ( []) trong khi Common Lisp (rất may) chỉ bỏ qua nó. Sau đó, chúng tôi khác nhau 2 ngôn ngữ bằng cách đánh giá ngôn ngữ '()nào bằng nilvà do đó falsey trong Common Lisp và trueở Clojure. Sau đó, chúng tôi thực hiện các thao tác chuỗi bằng Clojure mà Common Lisp thậm chí không cố gắng đánh giá khi nó đi trong một ifnhánh khác . Mặt khác, Clojure cố gắng kiểm tra xem một nhánh khác ít nhất có đúng hay không trước khi thực hiện vì vậy phải sử dụng evalở đó để cả hai đều đúng trong Clojure và xuất chuỗi đúng trong Common Lisp.

Lưu ý: chỉ trả về hai chuỗi khác nhau có thể ngắn hơn nhưng sau đó sẽ không khác với các thách thức đa âm về việc xuất các chuỗi khác nhau bằng các ngôn ngữ khác nhau. ¯ \ _ (ツ) _ /

Chạy nguồn gốc Clojure: https://ideone.com/SiQhPf

Chạy nguồn gốc Lisp phổ biến: https://ideone.com/huLcty

Sản lượng Clojure: ((LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))) '(LAMBDA (S) (PRINT (LIST S (LIST 'QUOTE S)))))

Đầu ra Lisp phổ biến: ((fn [s] (print (list s (list (quote quote) s)))) (quote (fn [s] (print (list s (list (quote quote) s))))))

Đầu ra Clojure chạy trong Lisp chung: https://ideone.com/T1DF7H

Ngược lại: https://ideone.com/Fezayq


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`.;

xác minh

Kiểm tra tất cả các chương trình liên quan với các luồng byte chính xác chỉ có thể được thực hiện cục bộ.

$ 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

Thạch

Với trang mã của Jelly , chương trình trông như sau.

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

Bản in này ( Dùng thử trực tuyến! )

":n`":n`

đó là một điểm yếu trong GolfScript ( Dùng thử trực tuyến! ), nhưng lỗi trình phân tích cú pháp trong Jelly ( Thử trực tuyến! ).

GolfScript

Trong tiếng Latin-1, chương trình trông như sau, với ký tự DEL không thể in được giữa }þ.

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

Bản in này ( Dùng thử trực tuyến! )

ÿÌÌ

hoặc, được hiển thị bằng trang mã của Jelly,

”ṘṘ

đó là một câu hỏi trong Jelly ( Dùng thử trực tuyến! ), nhưng chỉ in một nguồn cấp dữ liệu trong GolfScript ( Thử trực tuyến! ).


1
Tốt cũ ”ṘṘ, do đó ØVnên được đi, phải không?
Erik the Outgolfer

3

JavaScript / C 278 byte

Ở mức đáng kinh ngạc 278 byte:

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

Câu hỏi thường gặp:

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

Quy tắc 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));


Mẹ thánh của quines ...
MD XF


1

Python / Retina, 70 65 64 66 byte

Tôi đã sử dụng chiến lược tương tự mà tôi đã sử dụng trong polyglot Python / Retina trước đây của mình .

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

Thử trong Python | Thử trong võng mạc

#là một nhận xét trong Python, vì vậy nó chỉ đơn giản là in quine Retina bằng Python. Trong Retina, giai đoạn đầu tiên (2 dòng) không làm gì cả, vì #sẽ không tìm thấy trong đầu vào. Giai đoạn tiếp theo thay thế không có gì với cơ sở của quine Python. Giai đoạn thứ ba thay thế mỗi dấu chấm phẩy bằng#print _% mảnh. Giai đoạn cuối loại bỏ tất cả #.


Quine ở võng mạc:


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


Quine trong Python:

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

Các quines được sử dụng có thể được nhìn thấy trong thử thách này . Quine Retina là một lỗi trong Python và quine Python không có đầu ra trong Retina.


Bạn có thể thêm một lời giải thích cho câu trả lời của bạn về cách thức hoạt động của meta không?
Pavel

@Pavel Đã thêm nó.
mbomb007

1

Python 3 / Python 2, 62 byte

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

Hãy thử nó trong Python 2 , Python 3 .

Dựa trên quine Python ở đây . Yếu tố phân biệt giữa hai phiên bản là những gì chúng làm với int(-1/2): trong Python 2, /là phép chia số nguyên (làm tròn xuống), với kết quả là -1; trong Python 3, /là phép chia dấu phẩy động ( -0.5), intcắt ngắn 0.

Chúng tôi xây dựng một chuỗi _trong ba phần. '_=%r;print(_%%_[''int(-1/2):])'luôn luôn như vậy Phần thú vị là'~'*-~int(-1/2) :

  • Trong Python 2, -~int(-1/2)0 và dấu ngã không được thêm vào chuỗi;
  • Trong Python 3, -~int(-1/2)is 1và dấu ngã được thêm vào chuỗi.

Do đó, Python 2 xuất ra quine Python 3

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

và Python 3 xuất ra quine Python 2

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

Trong mỗi phiên bản, biểu thức bên trong [ :]ước tính 0, làm cho lát cắt bao gồm toàn bộ chuỗi, trong khi đó, ngôn ngữ sai nó đánh giá -1, làm cho lát cắt chỉ bao gồm ký tự cuối cùng, cắt bớt đầu ra để nó không phải là một câu hỏi đầy đủ.


1

Brain-Flak , brainfuck 4617 4009 byte

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

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

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

Giải thích là trên đường tôi vẫn đang chơi gôn này


Điều này tạo ra một quine brainfuck trong brainfuck, và một quine Brain-Flak trong Brain-Flak. Nó sẽ tạo ra một quine brainfuck khi chạy trong Brain-Flak và một quine Brain-Flak khi chạy trong brainfuck.
Pavel

Tôi sẽ làm lại. Tôi xin lỗi tôi chỉ có một thời gian khó khăn khi theo As và Bs
Wheat Wizard
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.