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
?Odpowiedzi:
JavaScript (ES8),
160159 bajtówWypróbuj online!
Skomentował
źródło
Haskell ,
192190187 bajtówWypróbuj online!
Musi istnieć lepszy sposób obsługi przypadku arity-1, który obecnie zajmuje 45 bajtów.
Edycje:
pred
zamiast nichn-1
.Wypróbuj online!
źródło
Węgiel drzewny , 75 bajtów
Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:
Zapętl znaki wejściowe i zamień je w listę cyfr z opcjonalnymi
M
przyrostkami.Odwróć tę listę, abyśmy mogli ją wykorzystać
Pop
.Ta zmienna jest stosem żetonów, których arity nie zostały jeszcze spełnione.
Ta zmienna jest stosem pozostałej arii niespełnionych tokenów.
Powtarzaj, aż zużyjemy wszystkie żetony i opróżnimy stos.
Zdobądź następny token lub
0
jeśli nie.Wydrukuj token, a następnie przesuń kursor w poziomie, jeśli zaczyna się
1
inaczej po przekątnej.Dodaj token i jego arity do odpowiednich zmiennych.
Powtarzaj, gdy stos arity jest niepusty, ale najwyższy arity ma wartość zero.
Odrzuć arity zero.
Usuń jego żeton i przenieś tyle znaków, które pozostały.
Jeśli pozostały jakieś arie, zmniejsz arseum górne.
źródło