Pyth ist vielleicht die erfolgreichste Allzweck-Golfsprache. Obwohl es aufgrund neuer Sprachen etwas rückläufig ist, machte es von 2014 bis 2016 Pyths prägnante Syntax, ständige Aktualisierungen, Überladung und (für seine Ära) viele eingebaute Funktionen zu einem Favoriten für die meisten Fragen.
Pyth-Code ist oft schwer zu lesen. Sogar die Ausgabe des Debug-Modus (transpiliertes Python) besteht oft aus einer langen Zeile, manchmal mit zehn Klammern. Richtig formatiertes Pyth ist jedoch sehr gut lesbar.
Hier ist ein Teil des Pyth-Codes, der von @isaacg in Play the Word Chain geschrieben wurde .
.MlZfqhMtTeMPT+Lzs.pMyQ
So ist es viel besser lesbar.
.M Filter by gives-maximal-value of
l Z lambda Z:length(Z) over
f filter by (lambda T:
q equal
hM t T head-map tail T
eM P T end-map Pop T)
+L Append z to each element in
z
s .pM y Q flattened permutations of each subset of Q
Für diese Herausforderung beseitigen wir den Aspekt der Kolmogorov-Komplexität bei der Kategorisierung von Pyth-Zeichen und konzentrieren uns auf die Formatierung. Anstatt Pyth-Code zu sein, besteht die Eingabe aus Zeichen in 0123456789M
. Die Ziffer n
stellt eine Funktion der Arität dar n
und M
repräsentiert einen Operator. Beispielsweise wird der obige Code als dargestellt 210221M101M102M011M10
. Hier sind die Schritte, um die Minimierung aufzuheben:
Teilen Sie die Zeichenfolge in Token.
Ein Token stimmt überein [0-9]M*
. 0M
wird nicht in der Eingabe auftreten.
Fügen Sie nachfolgende Nullen hinzu.
Wenn nicht genügend Argumente vorhanden sind, hängt Pyth so viele implizite Variablen (Lambda-Variablen oder Q
s) an den Code an, wie erforderlich sind, um die Argumente des Programms zu füllen. diese sollten durch 0
s dargestellt werden.
Gruppieren Sie Token in Zeilen.
Die Arität eines Tokens ist der Wert seiner Ziffer.
Ein arity-0-Token (dh eine 0) beendet eine Zeile.
Für ein Arity-1-Token sollte sich das nächste Token in derselben Zeile befinden, die durch ein Leerzeichen getrennt ist.
Bei einem arity> = 2-Token werden die Argumente in verschiedenen Zeilen in der Reihenfolge aufgeführt, in der sie im Code erscheinen, gefolgt von jeweils eigenen Unterargumenten und so weiter. Argumente zu einem Token werden bis zum Ende des Tokens plus ein Leerzeichen eingerückt.
Eingang
Eine nicht leere Zeichenfolge (oder ein Zeichenfeld, ein Feld mit Zeichenfolgen der Länge 1 usw., wie es nach den Standard-E / A-Methoden zulässig ist), bestehend aus einer Zeichenfolge, die die Teilzeichenfolge 0123456789M
nicht enthält 0M
.
Ausgabe
Die Zeichenfolge wurde gemäß den obigen Regeln formatiert.
Testfälle
210221M101M102M011M10
2
1 0
2
2
1M 1 0
1M 1 0
2M
0
1 1M 1 0
123M4M
1 2
3M
4M
0
0
0
0
0
0
0
2MM
2MM
0
0
11011100
1 1 0
1 1 1 0
0
9000000
9
0
0
0
0
0
0
0
0
0
210221M101M102M011M10
wäre[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
s einen anderen Datentyp als die ganzen Zahlen haben dürfen.M
?Antworten:
JavaScript (ES8),
160 bis159 ByteProbieren Sie es online!
Kommentiert
quelle
Haskell ,
192190187 BytesProbieren Sie es online!
Es muss einen besseren Weg geben, um den Arity-1-Fall zu behandeln. Er benötigt derzeit 45 Bytes.
Bearbeitungen:
pred
stattdessen verwendenn-1
.Probieren Sie es online!
quelle
Kohle , 75 Bytes
Probieren Sie es online! Link ist eine ausführliche Version des Codes. Erläuterung:
Machen Sie eine Schleife über die eingegebenen Zeichen und wandeln Sie sie in eine Ziffernliste mit optionalen
M
Suffixen um.Kehren Sie diese Liste um, damit wir sie verwenden
Pop
können.Diese Variable ist ein Stapel von Token, deren Arität noch nicht erfüllt wurde.
Diese Variable ist ein Stapel der verbleibenden Menge der nicht erfüllten Token.
Wiederholen, bis alle Token aufgebraucht und der Stapel geleert sind.
Holen Sie sich das nächste Token oder
0
wenn keines.Drucken Sie den Token aus und bewegen Sie den Cursor dann horizontal, wenn er mit einer
1
anderen Diagonale beginnt .Fügen Sie den Token und seine Arität zu den entsprechenden Variablen hinzu.
Wiederholen, während der Arity-Stapel nicht leer ist, aber die oberste Arity Null ist.
Verwerfen Sie die Nullstelle.
Entferne seinen Marker und verschiebe so viele Zeichen wie möglich.
Wenn noch Aritäten übrig sind, dekrementieren Sie die oberste Arität.
quelle