tło
(Na podstawie prawdziwej, budzącej grozę historii)
W swoim czasie często bawiłem się Lispem i podobnymi językami. Pisałem z nimi, prowadziłem je, interpretowałem, projektowałem i zmuszałem maszyny, aby pisały z nimi dla mnie ... A jeśli coś mnie niepokoi, to widzi Lisp, który nie jest zgodny z moim specyficznym stylem formatowania.
Niestety, niektóre edytory tekstowe ( kaszel XCode kaszel ) wydają się rozebrać moje piękne karty i spacji, gdy kod jest skopiowany i wklejony ... Weź to pięknie rozmieszczone Lisp podobną składnię:
(A
(B
(C)
(D))
(E))
(Gdzie ABCDE
są arbitralne funkcje)
NIEKTÓRE edytory tekstu rzeźą ten piękny kod w następujący sposób:
(A
(B
(C)
(D))
(E))
Co za bałagan! To nieczytelne!
Pomóż mi tutaj?
Wyzwanie
Twoim celem w tym wyzwaniu jest przejęcie szeregu funkcji oddzielonych znakami nowej linii w formacie opisanym poniżej i zwrócenie piękniejszej aranżacji podkreślającej czytelność i elegancję.
Wejście
Definiujemy funkcję argumentów F
arity N
jako konstrukcję podobną do następującej:
(F (G1 ...) (G2 ...) (G3 ...) ... (GN ...))
gdzie G1, G2, ..., GN
wszystkie funkcje są same w sobie. Arity 0
funkcja A
jest po prostu (A)
, natomiast arity 2
funkcja B
jest postaci(B (...) (...))
Twój kod powinien przyjmować dane wejściowe jako serię funkcji z pojedynczym znakiem nowej linii przed nawiasiem wiodącym każdej funkcji (z wyjątkiem pierwszej funkcji). Powyższy przykład jest prawidłowym wejściem.
Możesz założyć:
- Nawiasy są zrównoważone.
- Funkcja nigdy nie będzie musiała być wcięta więcej niż 250 razy.
- KAŻDA funkcja jest otoczona nawiasami:
()
- Nazwa funkcji będzie zawierać tylko drukowalne znaki ASCII.
- Nazwa funkcji nigdy nie będzie zawierać nawiasów ani spacji.
- Istnieje opcjonalny końcowy znak nowej linii na wejściu.
Wyjście
Twój kod powinien wypisywać ten sam zestaw funkcji, a jedynymi wprowadzonymi zmianami są dodawanie spacji lub tabulatorów przed nawiasami wiodącymi funkcji. Dane wyjściowe powinny być zgodne z następującymi zasadami:
- Pierwsza podana funkcja (a później funkcje najwyższego poziomu) nie powinna zawierać poprzedzających spacji
- Argumentem do poziomego położenia funkcji jest dokładnie jedna zakładka po prawej stronie poziomego położenia tej funkcji.
- Zakładka jest zdefiniowana w implementacji, ale musi mieć co najmniej 3 spacje.
- Opcjonalnie możesz wydrukować maksymalnie dwie spacje po każdej linii.
Zasady
- Oto kod-golf: wygrywa najkrótszy kod!
- Standardowe luki są niedozwolone.
Przykłady
Wkład:
(A
(B
(C)
(D))
(E))
Wydajność:
(A
(B
(C)
(D))
(E))
Wkład:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Wydajność:
(!@#$%^&*
(asdfghjklm
(this_string_is_particularly_long
(...))
(123456789)))
(THIS_IS_TOP_LEVEL_AGAIN
(HERE'S_AN_ARGUMENT))
Wkład:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
Wydajność:
(-:0
(*:0
(%:0
(Arg:6)
(Write:0
(Read:0
(Arg:30))
(Write:0
(Const:-6)
(Arg:10))))
(%:0
(Const:9)
(/:0
(Const:-13)
(%:0
(Arg:14)
(Arg:0)))))
(WriteArg:22
(-:0
(Const:45)
(?:0
(Arg:3)
(Arg:22)
(Arg:0)))))
()
?