Pyramid Scheme to język rozwijany przez @ ConorO'Brien . W Pyramid Scheme kod, który piszesz, wygląda następująco:
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
Ten kod ma dwie oczywiste cechy: Trudno go analizować i pisać. Conor rozwiązał pierwszy, jednak Twoim zadaniem będzie rozwiązanie tego drugiego problemu.
Powyższy kod jest przetwarzany przez interpreter PyramidScheme w zagnieżdżoną tablicę ciągów:
[["+", ["9123", "3"]], "3"]
Twoim zadaniem jest napisanie programu lub funkcji, która poda zagnieżdżoną tablicę ciągów, wyprowadza lub zwraca odtworzony kod PyramidScheme. Możesz założyć, że tablica wejściowa zawsze będzie poprawna.
Piramida jest trójkątem równoramiennym. Wierzchołek jest ^
, boki nachylają się ukośnie z /
i \
, a dolny jest -
. Dwa dolne rogi są puste lub zawierają początek innych piramid, które są argumentami. Środek jest wypełniony nazwą piramidy, ignorując podział linii.
Oto jak parser konwertuje kod na użyteczny format. Najpierw skanuje piramidę najwyższego poziomu. Jeśli nie przyjmuje żadnych argumentów, reprezentuje go jednym ciągiem znaków i przechodzi dalej. W przeciwnym razie reprezentuje jako tablica ["name",[arg1,arg2]]
lub ["name",[arg1]]
. Argumentami są piramidy w lewym dolnym rogu i prawym dolnym rogu piramidy, które mogą być łańcuchami lub więcej tablic opisanych powyżej. Możesz zauważyć, że to trochę przypomina Lisp, w którym to przypadku mogłeś zauważyć okropną grę słów, jaką jest nazwa języka. Po pełnym przedstawieniu piramidy parser przechodzi do następnego.
To jest golf golfowy , wygrywa najkrótszy kod!
Przypadki testowe: nie są to jedyne prawidłowe dane wyjściowe, to przykład prawidłowych danych wyjściowych.
[["+", ["9123", "3"]], "3"]
^ ^
/ \ /3\
/ \ ---
/ + \
^-------^
/9\ /3\
/123\ ---
-----
[["out", [["chr", ["72"]], ["chr", ["101"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["108"]]]], ["out", [["chr", ["111"]]]]]
^ ^ ^ ^
/ \ / \ / \ / \
/out\ /out\ /out\ /out\
^-----^ -----^----- -----^
/ \ / \ / \ / \
/chr\ /chr\ /chr\ /chr\
^----- -----^ -----^ ^-----
/ \ / \ / \ / \
/72 \ /101\ /108\ /111\
----- ----- ----- -----
[ ["+", [ ["asdfghjkl"], ["do", [ "1" ]] ]] ]
^
/ \
/ + \
/ \
^-------^
/a\ /d\
/sdf\ /o \
/ghjkl\ ^-----
-------/1\
---
Zauważ, że w drugim przypadku testowym out
obie piramidy druga i trzecia mają ["chr", ["108"]]
jako parametr parametr, który jest zwinięty w jeden stos piramidy wspólny dla dwóch najwyższych poziomów. Jest to poprawna optymalizacja, którą Twój kod może obsługiwać, ale jest ona całkowicie opcjonalna; ocena nie zależy od długości twoich wyników.
Dla ciekawskich pierwszy przypadek wyświetla się z 9126 3
powodu niejawnego drukowania piramid najwyższego poziomu, drugi drukuje Hello
, a ostatni to błąd składniowy, zawarty tylko dlatego, że ma schludną strukturę.
Można zakładać, że wejście do druku zawiera tylko ASCII, z wyjątkiem miejsc, ^
, /
, \
, i -
. Dane wejściowe zawsze będą prawidłowe i będą zawierać co najmniej jedną piramidę. Nie ma ograniczeń co do wielkości tablicy ani ciągów wejściowych, jednak możesz napisać kod tak, jakby domyślną liczbą całkowitą w twoim języku była nieskończona precyzja i że twój komputer ma dowolną pamięć. Biorąc dane wejściowe jako pojedynczy ciąg znaków, możesz użyć dowolnej rozsądnej wartości (przecinek, spacja itp., Pod warunkiem, że jest w postaci drukowanej ascii, a nie "
lub []
) do rozgraniczenia tablic. Nie musisz dołączać nawiasów otaczających całą rzecz, zamiast tego weź wiele tablic oddzielonych separatorem.
Twój wynik nie musi być golfa, możesz wstawić dodatkowe miejsce lub zwiększyć swoje piramidy, niż to konieczne. Piramidy najwyższego poziomu powinny znajdować się w pierwszej linii. Dane wyjściowe powinny być ciągiem z nowymi wierszami lub listą ciągów.
Każdy, kto ma zawierać wersję swojego kodu, który optymalnie golfs piramidy mogą otrzymać jakąś rep w postaci upvotes / dobrodziejstw (ale prawdopodobnie tylko upvotes).
Odpowiedzi:
Common Lisp -
25241890 bajtówDzięki @coredump za wiele sztuczek golfowych. Przykładowy wynik pytania:
Oto oryginalna, (głównie) nie golfowa wersja:
Wypróbuj online!
źródło
()
; czasem można także użyć zmiennych czytnikaloop while (not x)
jestloop until x
,(cdr (cdr x))
jest(cddr x)
,(setf a b c d)
jest krótszy niż(setf a b)
po nim(setf c d)
itd. Ale to już dobra odpowiedź