Viết một Palindrom-Polyglot-Quine


25

Viết một "palipolyquine": một chương trình là một quine , một polyglot và một palindrom .

Quy tắc:

  • Số lượng ngôn ngữ polyglot thích hợp hơn kích thước mã.
  • Câu trả lời ngắn nhất (tính bằng byte) sẽ thắng, trong trường hợp hòa.
  • Quy tắc Polyglot và Quine xem tại đây: Viết một Polyquine .

Ví dụ của tôi (Tôi có một kho lưu trữ Freaky-Source với các bài kiểm tra):

C # / Java (1747 byte):

/**///\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 i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{!&!!,!&n!,!&&!,!&@!,!&#!,!&_!,!`!,!?!,s};for(i=0;i<9;i++)t=t.?@#_^Replace?_#replace^(!!+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t?@#_^[i];Console.Write?_#.charAt(i);System.out.printf^(t);}}/",t=s;int i;int[]a=new int[]{33,94,38,64,35,95,96,63,36};String[]b=new String[]{"\"","\n","\\","\\u000A","\\u002F","\\u002A","/","//",s};for(i=0;i<9;i++)t=t.//\u000A\u002F\u002A
Replace//\u002A\u002Freplace
(""+(char)a[i],b[i]);t+='*';for(i=872;i>=0;i--)t=t+t//\u000A\u002F\u002A
[i];Console.Write//\u002A\u002F.charAt(i);System.out.printf
(t);}}/*/}};)t(
ftnirp.tuo.metsyS;)i(tArahc.F200u\A200u\//etirW.elosnoC;]i[
A200u\F200u\A000u\//t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+""(
ecalperF200u\A200u\//ecalpeR
A200u\F200u\A000u\//.t=t)++i;9<i;0=i(rof;}s,"//","/","A200u\\","F200u\\","A000u\\","\\","n\",""\"{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,"/}};)t(^ftnirp.tuo.metsyS;)i(tArahc.#_?etirW.elosnoC;]i[^_#@?t+t=t)--i;0=>i;278=i(rof;'*'=+t;)]i[b,]i[a)rahc(+!!(^ecalper#_?ecalpeR^_#@?.t=t)++i;9<i;0=i(rof;}s,!?!,!`!,!_&!,!#&!,!@&!,!&&!,!n&!,!!&!{][gnirtS wen=b][gnirtS;}63,36,69,59,53,46,83,49,33{][tni wen=a][tni;i tni;s=t,!$!=s gnirtS{)z][gnirtS(^niam#_?niaM^_#@?diov citats cilbup{margorP ssalc^#_?;metsyS gnisu^_#@`?**`"=s gnirtS{)z][gnirtS(
niamF200u\A200u\//niaM
A200u\F200u\A000u\//diov citats cilbup{margorP ssalc
F200u\A200u\//;metsyS gnisu
A200u\F200u\A000u\///**/

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


2
Có bất kỳ quy tắc liên quan đến việc thực hiện poly-quine? Có hạn chế nào không? Nếu câu hỏi này là nguyên trạng, thì một giải pháp khả thi (tầm thường) là 1(sẽ xuất ra 1nhiều ngôn ngữ ở đây, và là palindromic).
clismique

Tôi đã thêm các quy tắc chính thức.
Ivan Kochurkin

2
À, tuyệt. Chà, chúc may mắn trong thử thách đầu tiên của bạn! Tuy nhiên, chỉ còn một số điều nữa: bạn không thực sự cần khối mã ở đó và có lẽ bạn nên di chuyển các quy tắc từ thử thách khác sang đây.
clismique

1
Câu trả lời 5 ngôn ngữ, 999 byte có đánh bại câu trả lời 4 ngôn ngữ, 100 byte không?
Sản xuất ETH

@ETHproductions, tôi nghĩ là có. Thêm ngôn ngữ mới khó hơn giảm số dòng.
Ivan Kochurkin

Câu trả lời:


14

CJam / GolfScript , 2 ngôn ngữ, 50 byte

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{

Hãy thử nó! Hãy thử nó trong GolfScript!

Huh, điều này đã không được trả lời lâu đáng ngạc nhiên.

Giải trình

Có lẽ dễ dàng nhất để giải thích điều này bằng cách chỉ ra cách tôi biến quine cơ bản trong mỗi ngôn ngữ thành một quine polyglot palindromic.

Vì vậy, các nguyên tắc cơ bản trong cả hai ngôn ngữ là:

{".~"}.~

{"_~"}_~

Trong GolfScript và CJam, tương ứng. Những thứ này khá giống nhau nhờ vào việc CJam ban đầu được lấy cảm hứng từ GolfScript (nhưng từ đó đã bị sai lệch khá nhiều). Sự khác biệt đầu tiên chúng tôi nhận thấy là một cách sử dụng .để sao chép đỉnh của ngăn xếp và các cách sử dụng khác _. Một mẹo phổ biến để tránh vấn đề này là sử dụng 0$, vì cả hai ngôn ngữ đều có toán tử "copy-nth-item-on-stack" $. Vì vậy, chúng tôi nhận được {"0$~"}0$~, mặc dù điều đó vẫn cần một dòng cấp dữ liệu trong GolfScript. Nhưng cuối cùng hãy lo lắng về điều đó.

Đầu tiên, chúng ta cần làm cho nó trở thành một bảng màu. Giải pháp rõ ràng cho vấn đề này là viết thêm một bình luận và đặt mã nguồn ở đó ngược lại. Điều này khá đơn giản, bởi vì CJam sử dụng e#cho các bình luận, và trong GolfScript ekhông làm gì cả, và #là một bình luận. Vì vậy, nếu chúng ta chắp thêm e#...hoạt động cho cả hai ngôn ngữ. Đây là những gì chúng ta đã có:

{"0$~"}0$~e##e~$0}"~$0"{

Tất nhiên, điều đó không thực sự in phần từ e#trở đi. Chúng ta có thể xây dựng lại điều này khá dễ dàng từ chính mã nguồn. Cả hai ngôn ngữ có thể biến khối ban đầu thành một chuỗi với `và nối thêm "0$~"phần +đó, để chúng ta có được toàn bộ mã nguồn chưa được kiểm duyệt trong một chuỗi. Để nối thêm một bản sao được nhân đôi, tất cả những gì chúng ta cần làm là nhân đôi chuỗi với 0$một lần nữa và sau đó đảo ngược nó -1%, nó cũng hoạt động trong cả hai ngôn ngữ. Vì vậy, bây giờ chúng tôi đã có điều này:

{`"0$~e#"+0$-1%}0$~e##e~$0}%1-$0+"#e~$0"`{

Đây là một quine palindromic hợp lệ trong CJam, và nó cũng hoạt động trong GolfScript nhưng vẫn in ra dòng thức ăn kéo dài phiền phức.

Cách thông thường để ngăn chặn điều này là gán một chuỗi trống n, bởi vì những gì GolfScript thực sự làm là in nội dung nở cuối. Vì vậy, những gì chúng ta cần là "":n. Vậy còn CJam thì sao? Rất may, điều này không có gì cả. ""cũng là một chuỗi trống (hoặc danh sách trống, chúng là cùng một thứ trong CJam) và :ánh xạ toán tử n(in bằng linefeed) qua danh sách. Nhưng vì danh sách trống, ánh xạ một toán tử trên nó không làm gì cả. Do đó, chúng ta có thể thoát khỏi nguồn cấp dữ liệu, mà không gây rối với CJam và kết thúc với giải pháp cuối cùng:

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{

5

Perl 5 / Ruby / PHP / JavaScript (Trình duyệt), 4 ngôn ngữ, 513 byte

$_='$z=0?"$&".next: eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);//#//;)_%s(lave;%s%s%s=_%s",$d=$z[0]||h^L,$q=$z[1]||h^O,$_,$q,$d,$d,$q,"0"?$_.split("").reverse().join(""):~~reverse,$q,$d)';eval($_);//#//;)_$(lave;')d$,q$,esrever~~:)""(nioj.)(esrever.)""(tilps._$?"0",q$,d$,d$,q$,_$,O^h||]1[z$=q$,L^h||]0[z$=d$,"s%_=s%s%s%;eval(s%_);//#//;)_s%(lave;s%s%s%=_s%"(ftnirp;)"`cCJ`bota;gol.elosnoc=ftnirp"(lave :txen."&$"?0=z$'=_$

Hãy thử Perl trực tuyến!
Hãy thử trực tuyến!
Hãy thử PHP trực tuyến!
Xác thực nó trực tuyến!

$_='$z=0?"$&".next: eval("printf=console.log;atob`JCc`");printf("%s_=%s%s%s;eval(%s_);//#//;)_%s(lave;%s%s%s=_%s",$d=$z[0]||h^L,$q=$z[1]||h^O,$_,$q,$d,$d,$q,"0"?$_.split("").reverse().join(""):~~reverse,$q,$d)';eval($_);//#//;)_$(lave;')d$,q$,esrever~~:)""(nioj.)(esrever.)""(tilps._$?"0",q$,d$,d$,q$,_$,O^h||]1[z$=q$,L^h||]0[z$=d$,"s%_=s%s%s%;eval(s%_);//#//;)_s%(lave;s%s%s%=_s%"(ftnirp;)"`cCJ`bota;gol.elosnoc=ftnirp"(lave :txen."&$"?0=z$'=_$

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.