Napisz Palindrome-Polyglot-Quine

25

Napisz „palipoliquine”: program, który jest quine , poliglotą i palindromem .

Zasady:

  • Liczba języków polyglot jest bardziej preferowana niż rozmiar kodu.
  • Najkrótsza odpowiedź (w bajtach) wygrywa w przypadku remisu.
  • Zasady Polyglot i Quine patrz tutaj: Napisz Polyquine .

Mój przykład (mam repozytorium Freaky-Sources z testami):

C # / Java (1747 bajtów):

/**///\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\///**/

Kompilacja dostępna na ideone.com: C # , Java .

Ivan Kochurkin
źródło
2
Czy są jakieś zasady związane z produkcją poli-chinu? Jakieś ograniczenia? Jeśli to pytanie jest takie, jakie jest, to możliwe (trywialne) rozwiązanie to 1(które wyświetli się 1w wielu językach i jest palindromiczne).
clismique
Dodałem bardziej formalne zasady.
Ivan Kochurkin
2
A, fajnie. Powodzenia w pierwszym wyzwaniu! Jeszcze tylko kilka rzeczy: tak naprawdę nie potrzebujesz bloku kodu i prawdopodobnie powinieneś przenieść reguły z innego wyzwania tutaj.
clismique
1
Czy 5-językowa, 999-bajtowa odpowiedź przewyższa 4-językową, 100-bajtową odpowiedź?
ETHproductions
@ETHproductions, myślę, że tak. Trudniej jest dodać nowy język niż zmniejszyć liczbę wierszy.
Ivan Kochurkin

Odpowiedzi:

14

CJam / GolfScript , 2 języki, 50 bajtów

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

Wypróbuj CJam! Wypróbuj w GolfScript!

Huh, to zaskakująco długo trwało bez odpowiedzi.

Wyjaśnienie

Prawdopodobnie najłatwiej to wytłumaczyć, pokazując, jak zamieniłem podstawowy quine w każdym języku na palindromiczny poliglotyczny quine.

Podstawowe quiny w obu językach to:

{".~"}.~

{"_~"}_~

Odpowiednio w GolfScript i CJam. Są one dość podobne dzięki temu, że CJam został pierwotnie zainspirowany przez GolfScript (ale od tego czasu sporo się zmienił). Pierwszą różnicą, którą zauważamy, jest to, że jedna wykorzystuje .do powielania góry stosu, a druga używa _. Częstym sposobem uniknięcia tego problemu jest użycie 0$, ponieważ oba języki mają operator „kopiuj n-ty-element na stosie” $. Tak więc otrzymujemy {"0$~"}0$~, chociaż nadal wymaga to końca wiersza w GolfScript. Ale martwmy się o to na końcu.

Po pierwsze, musimy uczynić z niego palindrom. Oczywistym rozwiązaniem tego jest dodanie komentarza i odwrócenie kodu źródłowego. Jest to dość proste, ponieważ CJam używa e#komentarzy, aw GolfScript enic nie robi i #jest komentarzem. Jeśli dodamy e#..., działa to dla obu języków. Oto, co mamy:

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

Oczywiście to nie drukuje części od początku e#. Możemy to dość łatwo zrekonstruować z samego kodu źródłowego. Oba języki mogą przekształcić blok początkowy w ciąg znaków `i dołączyć do niego "0$~"część +, dzięki czemu otrzymamy cały nieznany kod źródłowy w jednym ciągu. Aby dołączyć kopię lustrzaną, wystarczy zduplikować ciąg 0$ponownie, a następnie odwrócić go -1%, co działa również w obu językach. Więc teraz mamy to:

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

Jest to poprawna palindromiczna quine w CJam, działa również w GolfScript, ale nadal drukuje to irytujące końcowe podawanie linii.

Zwykłym sposobem, aby temu zapobiec, jest przypisanie pustego łańcucha n, ponieważ tak naprawdę GolfScript naprawdę drukuje zawartość nna końcu. Więc potrzebujemy "":n. A co z CJamem? Na szczęście nic to nie robi. ""jest również pustym ciągiem (lub pustą listą, są takie same w CJam) i :mapuje operatora n(drukuj z podawaniem liniowym) na liście. Ale ponieważ lista jest pusta, odwzorowanie nad nią operatora nic nie robi. W ten sposób możemy pozbyć się kanału, bez bałaganu w CJam, i ostatecznie otrzymać ostateczne rozwiązanie:

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{
Martin Ender
źródło
5

Perl 5 / Ruby / PHP / JavaScript (przeglądarka), 4 języki, 513 bajtów

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

Wypróbuj Perl online!
Wypróbuj online!
Wypróbuj PHP online!
Sprawdź to online!

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

Dom Hastings
źródło