Diese Herausforderung steht im Zusammenhang mit einigen Funktionen der MATL-Sprache im Rahmen des Events Sprache des Monats im Mai 2018 . Assoziierte Herausforderung : Funktion Zwischenablage: Einfügen .
Einführung
MATL verfügt über mehrere Zwischenablagen , in denen Sie Werte speichern (kopieren) und später abrufen (einfügen) können. Einige Zwischenablagen sind automatisch , was bedeutet, dass das Kopieren automatisch durch bestimmte Ereignisse ausgelöst wird. Diese Herausforderung konzentriert sich auf eine der automatischen Zwischenablagen, die als Funktionseingabe-Zwischenablage oder einfach als Funktionszwischenablage bezeichnet wird .
In dieser Zwischenablage werden die Eingaben zu den vier letzten Aufrufen für normale Eingabeaufnahmefunktionen gespeichert. Normale Funktionen sind der häufigste Funktionstyp in MATL. Eingaben annehmen bedeutet, dass die Funktion mindestens eine Eingabe annimmt (Funktionen, die keine Eingabe annehmen, werden von der Funktions-Zwischenablage nicht berücksichtigt).
Dies wird am besten anhand der folgenden Beispiele erläutert, in denen zwei normale Funktionen verwendet werden:
+
, der zwei Zahlen vom Stapel wirft und ihre Summe schiebt.U
, der eine Zahl knallt und sein Quadrat drückt.
Beispiel 1 :
3 2 + 6 + 12 4 U + +
erzeugt das Ergebnis 39
. Der Code wird wie folgt interpretiert:
- Zahlenliterale wie
3
oder12
werden auf den Stapel geschoben - Funktionen wie
+
Pop ihre Eingänge und Push ihre Ausgänge auf den Stapel.
Die Funktionsaufrufe sind in chronologischer Reihenfolge:
3 2 +
gibt5
5 6 +
gibt11
4 U
gibt16
12 16 +
28
11 28 +
gibt39
.
Die Zwischenablage kann als Liste von vier Listen angezeigt werden. Jede innere Liste enthält die Eingaben für einen Funktionsaufruf, wobei die letzten Aufrufe zuerst angezeigt werden . In jeder inneren Liste sind die Eingaben in ihrer ursprünglichen Reihenfolge .
Nach dem Ausführen des Codes lautet der Inhalt der Zwischenablage (in Python-Notation):
[[11, 28], [12, 16], [4], [5, 6]]
Beispiel 2 :
10 20 U 30 +
hinterlässt Zahlen 10
und 430
auf dem Stapel. Der Stapel wird am Ende des Programms von unten nach oben angezeigt.
Die Funktionsaufrufe sind
20 U
gibt400
400 30 +
gibt430
Da es nur zwei Funktionsaufrufe gab, sind einige der inneren Listen, die die Zwischenablage definieren, leer . Beachten Sie auch, wie 10
keine Funktion als Eingabe verwendet wird.
Somit sind die Inhalte der Zwischenablage nach dem Ausführen des Codes:
[[400, 30], [20], [], []]
Beispiel 3 (ungültig):
10 20 + +
wird als ungültig angesehen, da eine Eingabe für die Sekunde +
fehlt (in MATL würde dies implizit Benutzereingaben auslösen).
Die Herausforderung
Eingabe : ein String S mit Zahlenliteralen +
und U
durch Leerzeichen getrennt.
Ausgabe : der Inhalt der Zwischenablage - Funktion nach der String Auswertung S .
Klarstellungen:
- Sie können zwei beliebige konsistente Symbole verwenden, um diese Funktionen darzustellen, die keine Ziffern sind. Sie können anstelle des Leerzeichens auch ein beliebiges konsistentes Symbol als Trennzeichen verwenden.
- Es werden nur die beiden angegebenen Funktionen berücksichtigt.
- Die Eingabezeichenfolge enthält mindestens ein Zahlenliteral und mindestens eine Funktion.
- Alle Zahlen sind positive ganze Zahlen, möglicherweise mit mehr als einer Ziffer.
- Es ist möglich, dass einige Zahlenliterale von keiner Funktion verwendet werden, wie im Beispiel 2.
- Die Eingabe ist garantiert ein gültiger Code, ohne dass zusätzliche Nummern erforderlich sind. Ein String wie in Beispiel 3 wird also niemals vorkommen.
- Nachgestellte leere innere Listen in der Ausgabe können weggelassen werden. So kann das Ergebnis in Beispiel 2 sein
[[400, 30], [20]]
- Jedes vernünftige, eindeutige Ausgabeformat ist akzeptabel. Zum Beispiel wird eine Zeichenkette mit Komma als inneres Trennelement und Semikolon als äußeren Trenn:
400,30;20;;
.
Zusätzliche Regeln:
Eingabe und Ausgabe können mit jedem vernünftigen Mittel erfolgen .
Programme oder Funktionen sind in jeder Programmiersprache zulässig . Standardlücken sind verboten .
Kürzester Code in Bytes gewinnt.
Testfälle
Input
Output
3 2 + 6 + 12 4 U + +
[[11, 28], [12, 16], [4], [5, 6]]
15 3 4 + 2 U 8 + U +
[[7, 144], [12], [4, 8], [2]]
3 6 9 12 + + 10 8 U 6
[[8], [6, 21], [9, 12], []]
8 41 12 25 4 5 33 7 9 10 + + + + + + + +
[[41, 105], [12, 93], [25, 68], [4, 64]]
10 1 1 + U U U U U
[[65536], [256], [16], [4]]
M
?
M
. Ich werde es in der "Paste" Herausforderung tun
[[28, 11], [16, 12], [4], [6, 5]]
die Ausgabe für das erste Beispiel gültig?