Pyth jest prawdopodobnie najbardziej popularnym językiem golfa ogólnego zastosowania. Choć jest nieco w spadku , w wyniku nowych języków, od 2014 do 2016 składnia zwięzły Pyth za Constant aktualizacje, przeciążenia, oraz (dla jego epoki) wielu builtins stało się ulubionym miejscem dla większości pytań.
Kod Pyth jest często trudny do odczytania. Nawet dane wyjściowe trybu debugowania (transponowany Python) często składają się z długiej linii, czasem z nawiasami zagnieżdżonymi na dziesięciu. Jednak poprawnie sformatowany Pyth jest bardzo czytelny.
Oto fragment kodu Pyth napisany przez @isaacg w Play the Word Chain .
.MlZfqhMtTeMPT+Lzs.pMyQ
Jest o wiele bardziej czytelny jak ten.
.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
Aby sprostać temu wyzwaniu, eliminujemy aspekt złożoności Kołmogorowa polegający na kategoryzowaniu znaków Pyth i koncentrujemy się na formatowaniu. Zamiast być kodem Pyth, wejście będzie się składać ze znaków w 0123456789M
. Cyfra n
reprezentuje funkcję arity n
i M
reprezentuje operator. Na przykład powyższy kod jest reprezentowany jako 210221M101M102M011M10
. Oto kroki, aby unminify:
Podziel ciąg na tokeny.
Token pasuje [0-9]M*
. 0M
nie pojawi się na wejściu.
Dodaj końcowe 0.
Gdy nie ma wystarczającej liczby argumentów, Pyth dołącza do kodu tyle ukrytych zmiennych (zmiennych lambda lub Q
s), ile jest niezbędnych do wypełnienia argumentów programu; powinny być reprezentowane przez 0
s.
Grupuj tokeny w linie.
Liczebność tokena to wartość jego cyfry.
Token arity-0 (tj. 0) kończy linię.
W przypadku żetonu arity-1 następny żeton powinien przejść w tym samym wierszu, oddzielony spacją.
W przypadku tokena arity> = 2, jego argumenty idą w osobnych wierszach, w kolejności, w jakiej występują w kodzie, a po nich każdy z własnymi podrzędnymi dokumentami i tak dalej. Argumenty do tokena są wcięte na końcu tego tokena plus jedna spacja.
Wejście
Niepusty łańcuch znaków (lub tablica znaków, tablica łańcuchów długości 1 itd., Na co pozwalają standardowe metody we / wy) składający się z 0123456789M
, który nie będzie zawierał podłańcucha 0M
.
Wynik
Ciąg sformatowany zgodnie z powyższymi zasadami.
Przypadki testowe
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
może być[2,1,0,2,2,1,'M',1,0,1,'M',1,0,2,'M',0,1,1,'M',1,0]
M
pozwolono, by były innym typem danych niż liczby całkowite.
M
?