Pyth ist eine auf Python basierende Golfsprache . Es wird die Präfixnotation verwendet, wobei jeder Befehl eine andere Arität hat (Anzahl der akzeptierten Argumente).
Ihre Aufgabe ist es, einen Syntax-Checker für eine (nicht existierende) Pyth-ähnliche Sprache, Pith, zu schreiben.
Markensyntax
Pith hat nur 8 Single-Char-Befehle:
01234()"
01234
Jeder hat die Arität der entsprechenden Zahl und erwartet daher viele Argumente danach. Beispielsweise,
400010
ist ein korrektes Pith-Programm, da 4
auf dieses vier Argumente folgen 0
0
0
und auf 10
das letzte ein 1
einzelnes Argument folgt 0
. Um dies zu veranschaulichen, können wir uns den folgenden Baum ansehen:
R
|
4
|
-------------
| | | |
0 0 0 1
|
0
wo R
ist der Wurzelknoten. Eine alternative Möglichkeit, dies zu überdenken, besteht darin, dass sich jede Zahl auf die Anzahl der untergeordneten Knoten im obigen Baum bezieht.
Hier ist ein weiteres gültiges Pith-Programm mit mehr als einem Basisbefehl:
210010
korrespondierend zu
R
|
-------------
| |
2 1
| |
--------- 0
| |
1 0
|
0
Auf der anderen Seite,
3120102100
ist kein korrektes Pith-Programm, da die Initiale 3
nur zwei Argumente enthält, die wir anhand des folgenden Baums erkennen können:
R
|
3
|
------------------------ ??
| |
1 2
| |
2 ------
| | |
------ 1 0
| | |
0 1 0
|
0
Als nächstes (
beginnt eine unbegrenzte und )
endet eine unbegrenzte. Ein unbegrenztes Argument akzeptiert eine beliebige Anzahl von Argumenten (gierig) und zählt als ein einziges Argument für jeden übergeordneten Befehl. Am Ende des Programms noch offene unbegrenzte Karten werden automatisch geschlossen. Ein )
Befehl ist kein Fehler, wenn keine unbegrenzten Möglichkeiten offen sind - er führt einfach nichts aus. *
Zum Beispiel das Mark-Programm
)31(0)0(201000100
entspricht dem Baum
R
|
3
|
------------------------------
| | |
1 0 (
| |
( -----------------------------
| | | | | |
0 2 0 0 1 0
| |
------- 0
| |
0 1
|
0
Leere unbegrenzte Felder sind in Ordnung, ebenso ()
ein gültiges Pith-Programm.
Ein ungültiges Pith-Programm mit einem unbegrenzten ist
12(010
da 2
bekommt der nur ein argument (das unbegrenzte).
Schließlich "
beginnt und endet ein String, der immer 0 ist und als einzelnes Argument zählt, z
2"010""44)()4"
Das ist nur ein 2
Wesen, dem zwei String-Argumente übergeben werden "010"
und "44)()4"
. Wie unbegrenzte Zeichenfolgen können auch Zeichenfolgen leer sein, und nicht geschlossene Zeichenfolgen am Ende des Programms werden automatisch geschlossen.
* Dieser Teil unterscheidet sich von dem ursprünglichen Pyth, der in einem Fall wie dem Beenden der 1-Arität und dem Auslösen eines Fehlers tatsächlich etwas tut1)
.
Input-Output
Die Eingabe ist eine einzelne nicht leere Zeichenfolge, die nur aus den Zeichen besteht 01234()"
. Optional können Sie davon ausgehen, dass immer eine zusätzliche nachgestellte Zeile vorhanden ist. Sie können eine Funktion oder ein vollständiges Programm für diese Herausforderung schreiben.
Sie sollten einen Wahrheitswert ausgeben, wenn die Eingabe syntaktisch gültig ist, oder einen falschen Wert, wenn dies nicht der Fall ist. Die Wahrheits- und Falschheitswerte müssen festgelegt werden, damit Sie nicht 1
für ein gültiges Programm und 2
für ein anderes ausgeben können .
Wertung
Das ist Code-Golf, also gewinnt der Code mit den wenigsten Bytes.
Testfälle
Wahrheit:
0
)
(
"
()
""
10
400010
210010
("")00
3"""""
(0)))0)1)0
2(2(2(0)0)0)0
2"010""44)()4"
)31(0)0(201000100
())2)1))0"3())"))
3("4321("301(0)21100"4")"123"00)40"121"31000""01010
Falsch:
1
1(310
(1)0)
12(010
4"00010"
3120102100
20(2((0)(0)))
2(2(2(0)0)0)01)
4(0102)00)00000
2"00"("00"2(""))
())2)1))0"3())"))
(was meiner Meinung nach zutreffen sollte).
()210""
mit vielen No-Ops ist)
[( [2 [0] [1 [0] ] ] [0] [1 [0]] [0] ]
? Der eine hat Zweige von 2, 0, 0, 1 und 0 - der zweite sollte nicht da sein.