Python: Ich wünschte ich wäre PHP [geschlossen]

8

Es gibt eine alte Geschichte über einen Steinmetz, der nie zufrieden war mit dem, was er war. Er wünschte, er könnte die Sonne werden, und so war er. Von den Wolken blockiert, wollte und wurde er eine Wolke. Als der Wind wehte, wünschte er sich, der Wind zu sein. Vom Berg angehalten, wollte er ein Berg sein und wurde so einer. Bald jedoch wurde er von einem Steinmetz gehackt und wollte Steinmetz werden.

Ebenso besteht Ihre Aufgabe darin, ein Programm zu schreiben, das mit der Sprache, in der es sich befindet, niemals zufrieden ist. Ihr Programm muss eine Reihe von Regex-Ersetzungen ausgeben, um es in eine andere Sprache umzuwandeln. Und so weiter.

Regeln

  1. Schreiben Sie ein Programm in einer Sprache Ihrer Wahl.
  2. Das Programm sollte eine Reihe von mindestens zwei Segmenten ausgeben. Ein Segment ist ein Textbündel, der durch Semikolons getrennt ist. Wenn jedoch ein Semikolon in einem regulären Ausdruck enthalten ist, sodass das Aufbrechen dort zu einer ungültigen Syntax führt, werden keine Segmente getrennt. Siehe das Beispiel.
  3. Das erste Segment ist ein zu findendes Regex-Muster, und das zweite Segment ist das Ersatzmuster. Das dritte ist ein anderes "Such" -Muster, und das vierte ist ein "Ersetzen" -Muster und so weiter.
  4. Wenden Sie die Regex-Muster auf das Programm an. Ersetzen Sie das Muster im ersten Segment durch eines im zweiten. Ersetzen Sie das dritte Muster durch das vierte Muster und so weiter.
  5. Das Ergebnis sollte ein Programm in einer anderen Sprache sein, das selbst den Regeln 2 bis 4 folgt.
  6. Die verwendeten Sprachen müssen einen unendlichen, sich wiederholenden Zyklus bilden.
    • Zum Beispiel Python -> PHP -> C ++ -> Python -> PHP -> C ++ -> Python -> ...
  7. Ihre Punktzahl ist die Periode des Zyklus. Krawatten werden durch die kürzeste anfängliche Codelänge unterbrochen.
    • Im obigen Beispiel beträgt die Punktzahl drei.
  8. In jeder Iteration des Zyklus darf keine Sprache mehr als einmal verwendet werden.
  9. Für die Regeln 5 und 7 werden kompatible Sprachen (C und C ++) und verschiedene Versionen derselben Sprache (Python 2 und Python 3) als gleich angesehen.
  10. Die Programme selbst müssen nicht wiederholt werden.
    • Im obigen Beispiel können das erste und das vierte Programm unterschiedlich sein.
  11. Jede Version von Regex ist akzeptabel, muss jedoch für alle Programme gleich verwendet werden.
  12. Die Gesamtausgabe für jedes Programm darf 100 Zeichen nicht überschreiten.
  13. Jede Ausgabe muss Anweisungen enthalten, um das Programm tatsächlich zu ändern. Das heißt, keine zwei aufeinanderfolgenden Programme im Zyklus dürfen gleich sein.

Beispiel

Python -> Ruby -> Python -> ...

print "uts;Z;rint;uts;Z(?=;Z);rint"

Ausgänge:

uts;Z;rint;uts;Z(?=;Z);rint

Die Segmente sind:

FIND     ;    REPLACE
uts      ;    Z
rint     ;    uts
Z(?=;Z   ;    rint   (breaking the first segment in two would result in invalid syntax)

Wenn wir die Regex-Ersetzungen der Reihe nach anwenden, erhalten wir:

print "Z;Z;rint;Z;Z(?=;Z);rint"      # replace each "uts" with "Z"
puts "Z;Z;uts;Z;Z(?=;Z);uts"         # replace each "rint" with "uts"
puts "rint;Z;uts;rint;Z(?=;Z);uts"   # replace each "Z" followed by ";Z" with "rint"

Wenn Sie die letzte Zeile ausführen, erhalten Sie die Anweisungen, wie Sie dies wieder in Python-Code umwandeln können.

Ypnypn
quelle
Wenn Sie die Codegröße als Verbindungsunterbrecher verwenden, benötigen wir wirklich die Beschränkung auf 100 Zeichen?
Martin Ender
@ MartinBüttner Ja; warum nicht?
Ypnypn
Sicher, aber es ist ein Charakter länger als \;;)
Martin Ender
C ++ ist nicht unbedingt kompatibel mit C.
golfer9338
8
Ich denke, Sie möchten wahrscheinlich verlangen, dass alle Programme im Zyklus unterschiedlich sind. Wenn ich falsch liege, geben Sie dies bitte an - und ich beanspruche die offensichtliche Lösung als vorrangig.
Peter Taylor

Antworten:

6

2 Sprachen: Python, Ruby; 33 29 Bytes

Hier ist eine andere Möglichkeit, Python und Ruby zu erstellen, die etwas kürzer ist als die in der Herausforderung:

Python:   print'^;puts"^.*?\\42#\\73"#'
prints:   ^;puts"^.*?\42#\73"#

Ruby:     puts"^.*?\42#\73"#print'^;puts"^.*?\\42#\\73"#'
prints:   ^.*?"#;

Es sollte nicht zu schwierig sein, PHP in die Mischung aufzunehmen.

Martin Ender
quelle
1

2 Sprachen: Python 2 und Befunge-93, 77 Bytes

Nachdem ich diesmal die Regeln sorgfältig gelesen hatte , fand ich eine echte Antwort. Es wird keine Preise gewinnen, aber Befunge macht einfach zu viel Spaß, um es zu programmieren.

u=u">>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u"
print u

Dieses Python-Programm gibt Folgendes aus:

>>>>>:#,_@;Z;print;>>>>>:#,_@;Z(?=;Z);print;<v;Y;u;<v;Y(?=;Y);u

Was diese Ersetzungen ergibt:

FIND         REPLACE
>>>>>:#,_@   Z
print        >>>>>:#,_@
Z(?=;Z)      print
<v           Y
u            <v
Y(?=;Y)      u

Was das Programm in dieses Befunge-Programm verwandelt:

<v=<v"print;Z;>>>>>:#,_@;print;Z(?=;Z);>>>>>:#,_@;u;Y;<v;u;Y(?=;Y);<v"
>>>>>:#,_@ <v

Vielleicht werde ich sehen, ob ich es in einer Zeile schaffen kann. Ehrlich gesagt bin ich ein wenig überrascht, dass Befunge überhaupt für diese Art von Problem arbeitet.

(Tut mir leid, dass ich ein paar gelöscht und wieder gelöscht habe. Ich geriet für eine Sekunde in Panik, weil ich dachte, das Programm hätte möglicherweise nicht funktioniert.)

Kasran
quelle