Schreiben Sie eine Palindrome-Polyglot-Quine


25

Schreiben Sie ein "Palipolyquin": ein Programm, das ein Quine , ein Polyglot und ein Palindrom ist .

Regeln:

  • Die Anzahl der mehrsprachigen Sprachen ist der Codegröße vorzuziehen.
  • Bei Gleichstand gewinnt die kürzeste Antwort (in Bytes).
  • Polyglot- und Quine-Regeln finden Sie hier: Polyquine schreiben .

Mein Beispiel (ich habe ein Repository Freaky-Sources mit Tests):

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

Auf ideone.com verfügbare Zusammenstellung: C # , Java .


2
Gibt es Regeln für die Herstellung des Polyquins? Irgendwelche Einschränkungen? Wenn diese Frage so ist, wie sie ist, dann ist dies eine mögliche (triviale) Lösung 1(die hier 1in vielen Sprachen ausgegeben wird und palindrom ist).
Clismique

Ich habe formellere Regeln hinzugefügt.
Ivan Kochurkin

2
Achso cool. Nun, viel Glück bei Ihrer ersten Herausforderung! Nur noch ein paar Dinge: Sie brauchen den Codeblock dort nicht wirklich, und Sie sollten wahrscheinlich die Regeln von der anderen Herausforderung hierher migrieren.
Clismique

1
Schlägt eine 5-sprachige 999-Byte-Antwort eine 4-sprachige 100-Byte-Antwort?
ETHproductions

@ETHproductions, ich denke ja. Es ist schwieriger, eine neue Sprache hinzuzufügen, als die Anzahl der Zeilen zu verringern.
Ivan Kochurkin

Antworten:


14

CJam / GolfScript , 2 Sprachen, 50 Bytes

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

Probieren Sie es aus CJam! Probieren Sie es in GolfScript!

Huh, das blieb überraschend lange unbeantwortet.

Erläuterung

Es ist wahrscheinlich am einfachsten, dies zu erklären, indem ich zeige, wie ich die Grundquine in jeder Sprache in eine palindromische polyglotte Quine verwandelt habe.

Die grundlegenden Quines in beiden Sprachen sind also:

{".~"}.~

{"_~"}_~

In GolfScript bzw. CJam. Diese sind ziemlich ähnlich, da CJam ursprünglich von GolfScript inspiriert war (aber seitdem ziemlich stark davon abgewichen ist). Der erste Unterschied, den wir bemerken, besteht darin, dass einer .zum Duplizieren der Oberseite des Stapels und der andere zum Verwenden verwendet wird _. Ein allgemeiner Trick, um dieses Problem zu vermeiden, ist die Verwendung 0$, da beide Sprachen den Operator "copy-nth-item-on-stack" haben $. So bekommen wir {"0$~"}0$~, obwohl das noch einen nachgestellten Zeilenvorschub in GolfScript braucht. Aber lassen Sie uns am Ende darüber nachdenken.

Erstens müssen wir daraus ein Palindrom machen. Die naheliegende Lösung besteht darin, einen Kommentar anzufügen und den Quellcode dort in umgekehrter Reihenfolge abzulegen. Dies ist recht einfach, da CJam e#für Kommentare verwendet und in GolfScript eüberhaupt nichts tut und #ein Kommentar ist. Wenn wir also anhängen e#..., funktioniert das für beide Sprachen. Folgendes haben wir:

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

Das druckt das Teil natürlich nicht wirklich ab e#. Wir können dies recht einfach aus dem Quellcode selbst rekonstruieren. Beide Sprachen können den anfänglichen Block in einen String mit verwandeln `und den "0$~"Teil mit anhängen +, so dass wir den gesamten nicht gespiegelten Quellcode in einem einzigen String erhalten. Um eine gespiegelte Kopie anzufügen, müssen wir den String nur noch 0$einmal duplizieren und dann umkehren -1%, was auch in beiden Sprachen funktioniert. Jetzt haben wir Folgendes:

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

Dies ist eine gültige Palindrom-Quine in CJam, und sie funktioniert auch in GolfScript, druckt aber immer noch diesen nervigen Zeilenvorschub.

Die übliche Möglichkeit, dies zu verhindern, besteht darin, eine leere Zeichenfolge zuzuweisen n, da GolfScript tatsächlich den Inhalt nam Ende ausgibt . Also, was wir brauchen, ist "":n. Was ist mit CJam? Zum Glück tut dies überhaupt nichts. ""ist auch eine leere Zeichenfolge (oder eine leere Liste, die in CJam identisch ist) und :ordnet den Operator n(Drucken mit Zeilenvorschub) der Liste zu. Da die Liste jedoch leer ist, führt das Zuordnen eines Operators dazu überhaupt nichts. Daher können wir den Zeilenvorschub loswerden, ohne uns mit CJam herumschlagen zu müssen, und am Ende die endgültige Lösung finden:

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

5

Perl 5 / Ruby / PHP / JavaScript (Browser), 4 Sprachen, 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$'=_$

Probieren Sie das Perl online!
Probieren Sie es online!
Probieren Sie das PHP online!
Online validieren!

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

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.