Schreiben Sie eine Quine dritter Ordnung

17

Diese Herausforderung ist eine Erweiterung von " Golf a mutual quine ".

Erstellen Sie mit drei Sprachen Ihrer Wahl ein Ouroboros- Programm dritter Ordnung .

Das heißt, in Sprache A schreiben Sie ein Programm pA, das Programm pB in Sprache B ausgibt. Programm pB sollte Programm pC in Sprache C ausgeben, das seinerseits das ursprüngliche Programm pA in Sprache A ausgibt.

Keine zwei Sprachen in A, B und C können gleich oder Teilmengen oder Obermengen voneinander sein. Keines von pA, pB oder pC darf identisch sein.

Beispielsweise gibt ein Haskell-Programm ein Perl-Programm aus, das ein Java-Programm ausgibt, das das ursprüngliche Haskell-Programm ausgibt, das gültig wäre.

Andererseits ist ein C # 4-Programm, das ein C # 3-Programm ausgibt, das ein C # 2-Programm ausgibt, ungültig. Sogar eine Perl -> Ruby -> Bash-Kombination wäre ungültig, wenn beispielsweise das Perl-Programm und das Ruby-Programm identisch wären.

Dies ist Codegolf, daher gewinnt das kürzeste Programm pA.

Peter Olson
quelle

Antworten:

21

Python -> Perl -> Ruby, 48 Zeichen

Anpassung meiner bisherigen Antwort . Laufen

s='print q<puts %%q{s=%r;print s%%s}>';print s%s

Mit Python wird dieses Perl-Snippet generiert

print q<puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}>

Dadurch wird der folgende Ruby-Code generiert

puts %q{s='print q<puts %%q{s=%r;print s%%s}>';print s%s}

Daraufhin wird das ursprüngliche Python-Snippet gedruckt:

diff -s <(ruby <(perl <(python thirdorderquine.py))) thirdorderquine.py 
Files /dev/fd/63 and thirdorderquine.py are identical
Ventero
quelle
13

Perl -> PHP -> HTML + JavaScript, 105 Zeichen

Ich wollte die Sprachenkette irgendwie aussagekräftig machen, also dachte ich, ich würde ein PHP-Skript schreiben, das eine HTML-Seite mit JavaScript generiert. Für die dritte Sprache habe ich Perl gewählt, nur weil ich Perl mag. :)

Einige mögen diese vier Sprachen in Betracht ziehen , aber ich zähle HTML hier nicht wirklich als getrennt von JavaScript - es ist eine Auszeichnungssprache, keine Programmiersprache. Wie auch immer, hier sind die drei Versionen:

Perl (105 Zeichen):

printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/

PHP (165 Zeichen):

<script>alert(unescape("<?=urlencode(<<<E
printf+(q(<script>alert(unescape("<?=urlencode(<<<E%sprintf+(q(%s),$/)x2,$/%sE%s)?>"))</script>),$/)x2,$/
E
)?>"))</script>

HTML + JavaScript (235 Zeichen):

<script>alert(unescape("printf%2B%28q%28%3Cscript%3Ealert%28unescape%28%22%3C%3F%3Durlencode%28%3C%3C%3CE%25sprintf%2B%28q%28%25s%29%2C%24%2F%29x2%2C%24%2F%25sE%25s%29%3F%3E%22%29%29%3C%2Fscript%3E%29%2C%24%2F%29x2%2C%24%2F"))</script>

(Ps. Ja, ich weiß, ich hätte den PHP-Schritt fast zum Kinderspiel machen können, z. B. einfach HTML + JS-Code in Perl generieren und <?phpan diesen anhängen , aber das fühlte sich zu sehr nach Schummeln an. In dieser Lösung ist der Code tatsächlich in PHP verarbeitet, anstatt nur wörtlich kopiert zu werden.)

Ilmari Karonen
quelle
3

Unterlast → sed → Perl, 23 Bytes

Kann dies wahrscheinlich mit einer besseren Auswahl an Sprachen senken. Vermutlich nicht konkurrierend, da die Regel "sed-Programme können eine leere Zeile als Argument verwenden" den Wettbewerb beendet.

Das Unterlastprogramm:

((iprint+q)Sa(:^)*aS):^

generiert das sed Programm:

iprint+q(((iprint+q)Sa(:^)*aS):^)

was das Perl-Programm erzeugt:

print + q (((print + q) Sa (: ^) * aS): ^)


(Hinweis: Es gibt hier zwei nachgestellte Zeilenumbrüche), die das ursprüngliche Unterlastprogramm erneut generieren:

((iprint+q)Sa(:^)*aS):^

Das Hauptziel hierbei ist es, Sprachen zu finden, in denen Zeichenfolgen verschachtelbar sind (dh Sie können eine Zeichenfolge einfach zitieren, indem Sie sie in Trennzeichen einschließen, anstatt sie zu maskieren). Unterlast hat (), Perl hat q(), und in sed wird eine Zeichenfolge bis zum Leerzeichen fortgesetzt (das implizit verschachtelbar ist, wenn das Programm kein Leerzeichen enthält). Es gibt wahrscheinlich eine Esolang- oder Golfsprache mit der Anweisung "Rest der aktuellen Zeile drucken, nicht gefolgt von Zeilenumbrüchen", die hier ideal wäre, aber ich habe nicht allzu viel Zeit damit verbracht, nach einer zu suchen. Sie könnten in diesem Fall 8 Bytes abzüglich der Länge des Befehls einsparen. (Jelly funktioniert fast, aber seine Anweisung zitiert sich nicht von selbst. Außerdem datiert es die Herausforderung nach.)

Sie können dies auf 22 Bytes wie folgt reduzieren :

((csay + q) Sa (: ^) * aS): ^

(mit einer nachgestellten Zeile, wie bei einer normalen Textdatei, anstelle der Null, die Sie normalerweise beim Golfen erhalten). Dies setzt jedoch einen Unterlast-Interpreter voraus, der Zeilenumbruch als No-Op behandeln kann. Probieren Sie es doch mal online aus, aber ich denke, es ist das Datum der Herausforderung.


quelle