Beschreibung
Imaginary Programming Language (IPL) verwendet die polnische Umkehrnotation. Es hat die folgenden Befehle:
- i - Nummer eingeben und auf den Stapel schieben
- o - zerstörungsfreie Ausgabe oben auf dem Stapel (Nummer bleibt auf dem Stapel)
- d - Stapel oben wegwerfen
- Ganzzahl - Schieben Sie diese Zahl auf den Stapel
- + - * - Zwei Zahlen aus dem Stapel ziehen, entsprechende Operation ausführen und das Ergebnis zurückschieben. Es gibt keine Unterteilung in IPL.
IPL funktioniert nur mit ganzen Zahlen und wird für einfache Berechnungen verwendet. Ein IPL-Programm wird in eine Zeile geschrieben und durch Leerzeichen getrennt. Leere Zeichenfolge ist ein gültiges IPL-Programm.
IPL-Programm:
i i + o
Gibt zwei Zahlen ein, addiert sie und gibt das Ergebnis aus.
Eingabenummern und Ganzzahlen, die zum Stapeln verschoben werden können, liegen im Bereich [-999, 999], die Ausgabe kann jedoch beliebig sein. Wenn Ihre Sprache keine großen Zahlen unterstützt, ist dies jedoch in Ordnung.
Eingabe- / Ausgabeformat
Sie können ein beliebiges Eingabe- / Ausgabeformat auswählen, sofern das Verstehen und Lesen / Schreiben klar ist: Zeichenfolge, Liste, Token usw.
Aufgabe
Sie erhalten ein IPL-Programm, das Sie optimieren müssen (Länge reduzieren):
i 12 + 3 + o d 2 3 + d
Nach der Optimierung werden
i 15 + o
Sie müssen den Stapelstatus nicht beibehalten, aber die Anzahl der Eingaben und Ausgaben sowie deren Reihenfolge sollten für das ursprüngliche und optimierte Programm übereinstimmen.
Also IPL-Programm:
-40 i * 2 * o i + 3 1 + o i 2 *
Nach der Optimierung werden
i -80 * o i 4 o i
oder
-80 i * o i 4 o i
(Beachten Sie, dass Sie alle Eingaben speichern müssen, auch wenn sie irrelevant sind).
Es sollte keine Hardcodierung für Testfälle geben, Code sollte auf jedem beliebigen IPL-Programm funktionieren und ein möglichst kurzes IPL-Programm erstellen, das die Anforderungen erfüllt.
Wertung
Standard-Code-Golf-Wertung.
UPDATE: Die Wertung wurde gemäß @Sanchises-Vorschlag in reine Code-Golfwertung geändert.
Testfälle:
Eingang:
(empty string)
Mögliche Ausgabe:
(empty string)
Eingang:
i 4 * 2 + 3 * 6 - o
Mögliche Ausgabe:
i 12 * o
Eingang:
1 1 + o
Mögliche Ausgabe:
2 o
Eingang:
i 2 + 3 + o d 2 3 + d
Mögliche Ausgabe:
i 5 + o
Eingang:
-40 i * 2 * o i + 3 1 + o i 2 *
Mögliche Ausgabe:
-80 i * o i 4 o i
Eingang:
i i 1 + i 1 + i 1 + i 1 + d d d d o
Mögliche Ausgabe:
i i i i i d d d d o
Eingang:
i i i 0 * * * o
Mögliche Ausgabe:
i i i 0 o
Eingang:
i i i 1 * * * o
Mögliche Ausgabe:
i i i * * o
Eingang:
i 222 + i 222 - + o
Mögliche Ausgabe:
i i + o
Eingang:
i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Mögliche Ausgabe:
i i i i i o 1 o
Eingang:
i 1 + 2 * 1 + o
Mögliche Ausgabe:
i 2 * 3 + o
Eingang:
1 1 + o i 2 + 3 + o d 2 3 + d 4 i * 2 * o i + 3 1 + o i 2 * i i 1 + i 1 + i 1 + i 1 + d d d d o i i i 0 * * * o i i i 1 * * * o i 2 + i 2 - + o i 2 + 3 * 2 + 3 * 2 + 3 * i * d i 2 + 3 * i + d i o 2 + 2 - 0 * 1 o
Mögliche Ausgabe:
2 o i 5 + o 8 i * o i 4 o i i i i i i d d d d o i i i 0 o i i i * * * o i i + o i i i i i o 1 o
quelle
i i d o
umi o i
(der Eingang in Ordnung ist und der Ausgang ist in Ordnung) oder sollten Sie es nicht vereinfachen? (Der Satz von Ein- und Ausgängen sollte in Ordnung sein)Antworten:
Wolfram Language (Mathematica) ,
733728690564516506513548 BytesProbieren Sie es online!
Dies ist eine vierstufige Tour-de-Force, die (1) "-" durch "-1 * +" ersetzt, damit wir uns nicht mit Subtraktionen befassen müssen, (2) die Liste der Befehle ein wenig vereinfacht, ( 3) erstellt eine Liste aller Permutationen dieser Befehlsliste und wählt diejenigen aus, die beim Parsen (Ausführen) das gleiche Ergebnis liefern, und (4) vereinfacht diese Befehlslisten ein wenig und wählt die kürzesten aus, nachdem bestimmte Operationen zurück in konvertiert wurden Subtraktionen.
Dieser Code ist schrecklich ineffizient, da er die Liste aller Permutationen des Eingabecodes durchläuft. Für lange Eingabecodes empfehle ich nicht, diesen Code auszuführen. aber wie ich es lese, gibt es keine Laufzeit- oder Speicherbeschränkungen in dieser Herausforderung.
Dieser Code führt den Optimierungsschritt aus, nachdem alle "-" Operationen in "+" Operationen mit gespiegelten Vorzeichen konvertiert wurden, und führt den "-" Operator erst am Ende wieder ein, wenn der Code wieder in Zeichenfolgen konvertiert wird. Dies impliziert zum Beispiel, dass "i -1 i * + o" korrekt auf "ii - o" optimiert ist.
Da das E / A-Format ziemlich locker ist, nimmt dieser Code den Code als Listen und gibt ihn zurück, wobei die Symbole "+", "-", "*" jeweils durch p, m, t, Token dargestellt werden. Die Konvertierung von und nach Strings erfolgt in der Wrapper-Funktion von TIO:
Ungolf-Version, einschließlich des Wrappers für das String-Format und Minimierung der endgültigen Länge des Code-Strings anstelle der Anzahl der Tokens, und einige weitere Feinheiten bei der Transformation:
Dank an @redundancy für das Erkennen eines Fehlers: Der Parser benötigt ein
Expand
auf die Ausgabe angewendetes Element , um die Verteilungsäquivalenz zu handhaben. 506 → 513aktualisieren
Optimiert jetzt auch
1 o 1 + o
zu1 o 2 o
. Dies war ein überraschend schwieriger Fall und machte den Code viel langsamer. 513 → 548quelle
i i 1 + i 1 + i 1 + i 1 + d d d d o
.i 2 * i 2 * + o
sollte eine optimierte Ausgabe erzeugeni i + 2 * o
, aber dieser Code gibt die (nicht optimierte) Eingabe zurück.