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\///**/
code-challenge
quine
palindrome
polyglot
Ivan Kochurkin
fonte
fonte
1
(que será exibida1
em vários idiomas aqui e é palindrômica).Respostas:
CJam / GolfScript , 2 idiomas, 50 bytes
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 é usar0$
, 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 GolfScripte
não faz nada, e#
é um comentário. Portanto, se acrescentarmose#...
isso funciona para os dois idiomas. Aqui está o que temos: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 string0$
novamente e depois revertê-la-1%
, o que também funciona nos dois idiomas. Então agora temos o seguinte: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údon
no 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 operadorn
(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:fonte
Perl 5 / Ruby / PHP / JavaScript (Navegador), 4 idiomas, 513 bytes
Experimente o Perl online!
Experimente online!
Experimente o PHP online!
Valide online!
fonte