Spiegel quine (oder mein Kopf tut weh)


32

Ich habe gelesen, dass Sie Ihren Code rückwärts drucken - quine umkehren. Und ich dachte, dies könnte interessanter sein, wenn Ihr Rückwärtscode auch ausführbar ist . Diese Herausforderung hat also alle Regeln und Anforderungen der anderen, muss aber auch eine gültige Quelle sein, sobald sie umgekehrt ist (in derselben oder einer anderen Sprache und trotzdem die Quelle rückwärts drucken.

Es gelten alle Regeln und Bewertungen aus der umgekehrten Quine-Herausforderung. Alle Antworten auf diese Frage beantworten diese (aber nicht auch die Punkte).

Bearbeiten:

Auf Wunsch werden jetzt alle Regeln hier kopiert.

Regeln:

  • Schreiben Sie ein Programm p, das bei Ausführung die Ausgabe p 'erzeugt, wobei p' p rückwärts ist und p 'bei Ausführung p erzeugt.
  • Keine Verwendung anderer Dateien (zB reverse.txt)
  • Die Mindestcodelänge beträgt zwei Zeichen.
  • Ihr Programm kann kein Palindrom sein.

Wertung:

  • +50, wenn Sie Pull-Daten aus dem Internet verwenden.
  • +25, wenn Sie Ihren eigenen Quellcode lesen.
  • +1 Punkt pro Zeichen.
  • Die niedrigste Punktzahl gewinnt.

eval(eval(eval(eval(eval(eval(eval(eval(eval(p)))))))))
Andrew Larsson

Ich sage nur, dass Sie in der Lage wären, die Ausgabe von [...] Ausführen der Ausgabe von Ausführen der Ausgabe von p auszuführen (wie jedes Quine mit Ausnahme des Quine in Rückwärtsrichtung).
Andrew Larsson

@ Andrew Larsson In der Tat, obwohl der Proof of Concept, den ich baue, in c und p 'in Perl geschrieben wird.
Hildred

Oh, das wäre cool!
Andrew Larsson

1
Ja, habe das zu spät gesehen. Kein Duplikat.
Johannes Kuhn

Antworten:


22

GolfScript, 46 Zeichen

0{`".~#"+.-1%+\.!@@}.~##~.}@@!.\+%1-.+"#~."`{1

Nun, das ist hässlich, aber es funktioniert. Die Ausgabe entspricht dem umgekehrten Code und ist auch ein gültiges GolfScript-Programm, das den ursprünglichen Code erneut ausgibt.

OK, lassen Sie mich versuchen zu erklären, wie ich es aufgebaut habe. Zuerst ging ich von der Quine aus {".~"}.~und änderte sie wie in dieser Antwort , um sich selbst umzukehren. Um die Ausgabe zu einer ausführbaren Quine zu machen, habe ich vor dem Umkehren eine Kopie des Codes erstellt und ein #am Ende des Codes eingefügt, sodass die umgekehrte Version am Ende nur ein Kommentar wurde. So erhalten wir die palindromische Quine:

{`".~#"+.-1%}.~##~.}%1-.+"#~."`{

Nach den Regeln sind Palindrome jedoch nicht erlaubt, so dass ich die Symmetrie irgendwie brechen musste. Ich dachte, der einfachste Weg wäre, ein 0(was für sich genommen ein Quine in GolfScript ist) in den Code aufzunehmen und es nach dem Erstellen der umgekehrten Kopie 1mit zu spiegeln !. Der größte Teil der verbleibenden Komplexität ist eine hässliche Stapelmanipulation, um alles in die richtige Reihenfolge zu bringen.


Ist es umgekehrt auch Golfscript oder ist es eine andere Sprache?
Hildred

Ja, es ist GolfScript in beide Richtungen. In der Tat ist der Rest des Codes mit Ausnahme von 0und 1am Anfang und Ende ein Palindrom.
Ilmari Karonen

9
Wow. Okay, ich fühle mich für diese SE nicht mehr schlau genug :(
Cruncher

21

Perl und C 6478 1955

#!/usr/bin/perl -i//
$_=<<'rahc';eval $_; #//
print scalar reverse "#!/usr/bin/perl -i//\n\$_=<<'rahc';eval \$_; #//\n${_}rahc\n" #//
__END__
__END__ enifed#
};)"{ = ][cn\rahcn\n\"(p
};)'n\'( rahctup) 1 == 21%b ( fi
;)d(p;)]1-b[c,",d%",)d(foezis,d( ftnirpns{)b--;b;)c(foezis=b( rof
;)c(p;]9[d rahc;b tni{)(niam diov
}};)]1-b[c(rahctup )]1-b[c(fi{)b--;b;)c(nelrts=b(rof;b tni{)c*rahc(p diov
>h.gnirts< edulcni#
>h.oidts< edulcni#
;}
,0
,53,33,74,711,511,411,74,89,501,011,74,211
,101,411,801,23,54,501,74,74,01,63,59,16
,06,06,93,411,79,401,99,93,95,101,811,79
,801,23,63,59,95,23,53,74,74,01,211,411
,501,011,611,23,511,99,79,801,79,411,23,411
,101,811,101,411,511,101,23,43,53,33,74,711
,511,411,74,89,501,011,74,211,101,411,801,23
,54,501,74,74,29,011,29,63,59,16,06,06
,93,411,79,401,99,93,95,101,811,79,801,23
,29,63,59,95,23,53,74,74,29,011,63,321
,59,521,411,79,401,99,29,011,43,23,53,74
,74,01,59,59,96,87,86,59,59,01,59,59
,96,87,86,59,59,23,101,011,501,201,101,001
,53,01,521,95,14,43,321,23,16,23,39,19
,99,011,29,411,79,401,99,011,29,011,29,43
,04,211,01,521,95,14,93,011,29,93,04,23
,411,79,401,99,611,711,211,14,23,94,23,16
,16,23,05,94,73,89,23,04,23,201,501,01
,95,14,001,04,211,95,14,39,94,54,89,19
,99,44,43,44,001,73,43,44,14,001,04,201
,111,101,221,501,511,44,001,04,23,201,611,011
,501,411,211,011,511,321,14,89,54,54,95,89
,95,14,99,04,201,111,101,221,501,511,16,89
,04,23,411,111,201,01,95,14,99,04,211,95
,39,75,19,001,23,411,79,401,99,95,89,23
,611,011,501,321,14,04,011,501,79,901,23,001
,501,111,811,01,521,521,95,14,39,94,54,89
,19,99,04,411,79,401,99,611,711,211,23,14
,39,94,54,89,19,99,04,201,501,321,14,89
,54,54,95,89,95,14,99,04,011,101,801,411
,611,511,16,89,04,411,111,201,95,89,23,611
,011,501,321,14,99,24,411,79,401,99,04,211
,23,001,501,111,811,01,26,401,64,301,011,501
,411,611,511,06,23,101,001,711,801,99,011,501
,53,01,26,401,64,111,501,001,611,511,06,23
,101,001,711,801,99,011,501,53,01,95,521,01
{ = ][c
rahc

Bearbeiten:

Kurze Erklärung: Von Perl sind die beiden interessanten Zeilen die zweite und die dritte. Die zweite Zeile enthält zwei Anweisungen, von denen die erste den Rest des Dokuments in eine Zeichenfolge liest. Die Sekunde wertet die Zeichenfolge aus. Die dritte Zeile druckt alles rückwärts. alles andere wird ignoriert. Von der C-Seite haben Sie ein Array, das das Programm als String enthält, das als Array und String gedruckt wird, und der Rest ist ein Kommentar.


1
wat. : O Mein Kopf explodierte. Aber ich zähle 6536 Zeichen darin ...
Türknauf

Was ... wie ... 0_0
Der Kerl mit dem Hut

@DoorknobofSnow Ich habe die falsche Version gezählt. Aber hier ist eine kürzere Version.
Hildred

Das ist unglaublich! Ich denke, Haskell / C könnte eine andere mögliche Kombination sein.
theonlygusti

@theonlygusti, wenn du es postest und ich es kompilieren kann, werde ich es unterstützen.
Hildred

8

Rubin 145

DATA.read.tap {| a | setzt a.reverse, a.tr ("\ x79 \ x59", "\ x59 \ x79")}
: y
__ENDE__
__DNE__
Y:
}) "97x \ 95x", "95x \ 97x" (rt.a, esrever.a stup | a | {pat.daer.ATAD

Die Grundidee ist einfach: Setzen Sie einfach die erste Hälfte des Quellcodes zurück, nachdem der Code __END__mit DATAruby gelesen werden kann . Dann drucken Sie einfach die Rückseite dieser Daten, dann drucken Sie die Daten, und Sie erhalten den ursprünglichen Quellcode zurück

Das Problem ist, dass dies ein Palindrom wird (beachten Sie, dass die erste Zeile eine Endlinie benötigt), also müssen wir die Symmetrie aufheben. Ich :yhabe dem Code gerade ein Symbol hinzugefügt und einen Code, der dieses Symbol zwischen zwei Durchläufen zwischen Klein- und Großbuchstaben umwandelt und so nach zwei Durchläufen in den ursprünglichen Zustand zurückkehrt.

Test eins: Sie können ausgeführt werden

$ ruby rq2.rb > rq2t.rb
$ ruby rq2t.rb > rq2tt.rb

Test zwei: Das Ergebnis von zwei Läufen gibt die ursprüngliche Quelle zurück

$ diff rq2.rb rq2tt.rb
$

Test drei: Der Code ist kein Palindrom (der Mittelweg ist anders)

$ diff rq2.rb rq2t.rb
3c3
< :y
---
> :Y
6c6
< Y:
---
> y:

4

> <>, 21 bis 19 Bytes

'rd3*70.r l?!;o90.<

Probieren Sie es hier aus!

Verwendet zur Vereinfachung den Interpreter *> <>, dies ist jedoch gültiger Code> <>.


Wenn ein Fehler erlaubt ist, kann dies in 16 Bytes erfolgen:

'd3*}70.!r  !|o|

Probieren Sie es hier aus!


@JoKing danke! Es war 7 Uhr morgens und ich war einfach zu müde, um das zusammenzustellen. Ich werde es in ein paar Stunden bearbeiten.
Discordian

4

Gol> <> , 11 Bytes

":5-}H}+5:'

Ein ganzes Byte abgeschnitten! es ist fast ein Palindrom, aber technisch gesehen liegt es nicht am '+' und '-', haha!

Probieren Sie es online!

Die beiden folgenden funktionieren nicht oder erfüllen zumindest nicht die Spezifikationen der Herausforderung, der obige Code jedoch.

etwas jüngere Version, 12 Bytes

"r2ssrH}+5:'

Golfed off a byte, indem Sie einfach das doppelte Anführungszeichen verwenden und es um 5 erhöhen! Und diese neue Version sieht weniger wie ein Palindrom aus.

Probieren Sie es online!

ältere Version, 13 Bytes

"r2ssrHrss7r'

Es gab ein Problem mit dem vorherigen, auf das JoKing hingewiesen hat, danke dafür, jetzt funktioniert es, aber mit dem Preis von 4 zusätzlichen Bytes ...

Probieren Sie es online!


1

Hilfe, WarDoq! (27 Bytes)

25 Bytes wurden hinzugefügt, weil der Quellcode gelesen wurde.

<space>q

So funktioniert es:
<space>- Ein Kommentar, der mit einem Nicht-Leerzeichen endet
q- Der Quellcode wird umgekehrt ausgegeben (q "Leerzeichen").

Rückgängig gemacht:

q<space>

So funktioniert es:
q- Den Quellcode umgekehrt ausgeben (q für den Moment)
<space>- Ein Kommentar, der auf ein Zeichen ohne Leerzeichen endet, und ein Zeichen am Anfang des Befehls q hinzufügen ("Leerzeichen" q machen)

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.