Escreva um Palindrome-Polyglot-Quine

25

Escreva uma "palipolyquine": um programa que é um quine , um poliglota e um palíndromo .

Regras:

  • O número de idiomas poliglotas é mais preferível que o tamanho do código.
  • A resposta mais curta (em bytes) vence, em caso de empate.
  • Regras de Poliglota e Quine veja aqui: Escreva uma Poliquina .

Meu exemplo (eu tenho um repositório Freaky-Sources com testes):

C # / Java (1747 bytes):

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

Compilação disponível em ideone.com: C # , Java .

Ivan Kochurkin
fonte
2
Existe alguma regra envolvida na fabricação da polyquine? Alguma limitação? Se esta pergunta for como está, então uma solução (trivial) possível é 1(que será exibida 1em vários idiomas aqui e é palindrômica).
Clismique 15/09/16
Eu adicionei regras mais formais.
Ivan Kochurkin 15/09/16
2
Ah legal. Bem, boa sorte no seu primeiro desafio! Porém, apenas mais algumas coisas: você realmente não precisa do bloco de código e provavelmente deve migrar as regras do outro desafio para aqui.
Clismique 15/09/16
1
Uma resposta de 5 idiomas e 999 bytes supera uma resposta de 4 idiomas e 100 bytes?
ETHproductions 15/09/16
@ ETHproductions, acho que sim. É mais difícil adicionar um novo idioma do que reduzir o número de linhas.
Ivan Kochurkin 15/09/16

Respostas:

14

CJam / GolfScript , 2 idiomas, 50 bytes

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

Experimente CJam! Experimente no GolfScript!

Huh, isso ficou sem resposta surpreendentemente longo.

Explicação

Provavelmente é mais fácil explicar isso, mostrando como eu transformei a solução básica em cada idioma em uma solução poliglota palindrômica.

Portanto, os quines básicos nos dois idiomas são:

{".~"}.~

{"_~"}_~

No GolfScript e CJam, respectivamente. Isso é bem parecido graças ao fato de o CJam ter sido originalmente inspirado pelo GolfScript (mas, desde então, se desviou bastante). A primeira diferença que notamos é que um deles é usado .para duplicar a parte superior da pilha e o outro _. Um truque comum para evitar esse problema é usar 0$, pois os dois idiomas têm o operador "copiar-n-item-na-pilha" $. Então chegamos {"0$~"}0$~, embora isso ainda precise de um avanço de linha à direita no GolfScript. Mas vamos nos preocupar com isso no final.

Primeiro, precisamos torná-lo um palíndromo. A solução óbvia para isso é anexar um comentário e colocar o código fonte lá no sentido inverso. Isso é bastante simples, porque o CJam usa e#para comentários, e no GolfScript enão faz nada, e #é um comentário. Portanto, se acrescentarmos e#...isso funciona para os dois idiomas. Aqui está o que temos:

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

Obviamente, isso não imprime a peça a partir de então e#. Podemos reconstruir isso com bastante facilidade a partir do próprio código fonte. Os dois idiomas podem transformar o bloco inicial em uma sequência `e anexar a "0$~"parte +, para que possamos obter todo o código-fonte não espelhado em uma única sequência. Para anexar uma cópia espelhada, tudo o que precisamos fazer é duplicar a string 0$novamente e depois revertê-la -1%, o que também funciona nos dois idiomas. Então agora temos o seguinte:

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

Esta é uma solução palindrômica válida no CJam e também funciona no GolfScript, mas ainda imprime esse avanço de linha traquina.

A maneira usual de evitar isso é atribuir uma string vazia n, porque o que o GolfScript realmente faz é imprimir o conteúdo nno final. Então, o que precisamos é "":n. E o CJam? Felizmente, isso não faz nada. ""também é uma sequência vazia (ou lista vazia, é a mesma coisa no CJam) e :mapeia o operador n(imprimir com avanço de linha) sobre a lista. Mas como a lista está vazia, o mapeamento de um operador sobre ela não faz nada. Portanto, podemos nos livrar do avanço de linha, sem mexer com o CJam, e acabar com a solução final:

{`"0$~e#"+0$-1%"":n}0$~e##e~$0}n:""%1-$0+"#e~$0"`{
Martin Ender
fonte
5

Perl 5 / Ruby / PHP / JavaScript (Navegador), 4 idiomas, 513 bytes

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

Experimente o Perl online!
Experimente online!
Experimente o PHP online!
Valide 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
fonte