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]]
[[28, 11], [16, 12], [4], [6, 5]]
die Ausgabe für das erste Beispiel gültig?M
?M
. Ich werde es in der "Paste" Herausforderung tunAntworten:
05AB1E , 20 Bytes
Probieren Sie es online!
-4 danke an Emigna (sowie -8 danke an ihn, der mich über Regeln auf dem Laufenden hält ).
a
b
quelle
Bash , 43 Bytes
Probieren Sie es online!
Dadurch wird die Zwischenablage im folgenden Format gedruckt. Beachten Sie die Verwendung von \ x0F als Trennzeichen.
Die Schlüsselidee ist, dies in dc, eine stapelbasierte Sprache, zu übergeben, so dass die erforderlichen Stapelelemente gedruckt werden.
Die Eingabe wird an sed weitergeleitet, wo jedes
+
durch ersetztrdnFPrp+
wird. In dc wird die zweite Zahl auf dem Stapel gedruckt, gefolgt von \ x0F und der höchsten Zahl, bevor die Addition durchgeführt wird. sed ersetzt auch jedesU
durchp2^
, druckt das oberste Stapelelement und quadriert es.Das Ergebnis von sed wird als DC-Code ausgewertet und die gesamte Zwischenablage gedruckt.
Da die Zeilen in umgekehrter Reihenfolge sind, wird
tac
(reversecat
) verwendet, um dies zu beheben.Und schließlich wählt sed die ersten 4 Zeilen von tac aus.
quelle
Python 2 , 126 Bytes
Probieren Sie es online!
quelle
Haskell ,
113109 BytesDie erste Zeile definiert eine anonyme Funktion , die einen String, zum Beispiel
"3 2 + 6 + 12 4 U + +"
, und gibt eine Liste von Listen von Ints:[[11,28],[12,16],[4],[5,6]]
. Probieren Sie es online!quelle
Sauber , 140 Bytes
Probieren Sie es online!
Im klassischen Clean-Stil ist es die Haskell-Lösung mit einer um etwa 50% längeren Laufzeit.
quelle
JavaScript (ES6), 107 Byte
Nimmt die Eingabe als eine Liste bestehend aus ganzen Zahlen
'+'
und'U'
. Gibt eine weitere Liste zurück, die aus Ganzzahlen, Arrays mit 2 Ganzzahlen und'_'
für leere Slots besteht.Probieren Sie es online!
Kommentiert
quelle
Los,
305303295 Bytes8 Bytes dank @ovs gelöscht
Probieren Sie es online!
quelle
Oktave , 206 Bytes
Probieren Sie es online!
Wenn nur Octave eine
pop
Syntax hätte.m
ist die Speicher-Zwischenablage,t
der Stapel.quelle
m
undt
Elemente eher an der Vorderseite als am Ende anbringen?Python 3 ,
218204 Bytes-14 bytes dank ovs
Probieren Sie es online!
quelle
Rot ,
335.330BytesProbieren Sie es online!
Besser lesbar:
quelle
R ,
205182 BytesProbieren Sie es online!
M
ist die Speicher-Zwischenablage,P
ist das Programm undS
ist der Stapel.Technisch
S
wird es als Vektor mit einer einzelnen Null initialisiert, aber da wir nie eine ungültige Eingabe erhalten, erspart es mir ein Byte vonS={}
.quelle
C (gcc) , 264 Bytes
Ich habe die Rekursion verwendet, um den Funktionsstapel als Datenstapel zu verwenden: Die Eingabeliste wird durchlaufen und die Operationen werden ausgeführt: Die Ergebnisse werden in umgekehrter Reihenfolge angezeigt, wobei Stapelschübe nicht angezeigt werden.
Der Stack ist als verknüpfte Liste implementiert. So funktioniert das:
Ich habe ursprünglich eine Struktur für die Knoten verwendet, aber ich habe auf leere Zeiger gewechselt, um Platz zu sparen. Ein interessantes Merkmal dieser verknüpften Liste ist, dass sie sich selbst bereinigt, wenn die Rekursion abgeschlossen ist.
Probieren Sie es online!
quelle