tło
Alice i Bob tworzą język golfowy, aby wygrać każde wyzwanie PPCG. Alicja chce stworzyć dwuwymiarowy język, taki jak> <>, ale Bob woli składnię przedrostka-przedrostka jak w J. Jako kompromis decyduje się stworzyć dwuwymiarowy język przedrostka-przedrostka. Parser jest trudny do napisania i potrzebuje twojej pomocy!
Specyfikacja składni
W języku Alicji i Boba istnieją zmienne , które są reprezentowane małymi literami ASCII a-z
, oraz funkcje , które są reprezentowane wielkimi literami ASCII A-Z
. Funkcję można wywołać z jednym lub dwoma argumentami. Program jest prostokątna siatka liter a-zA-Z
i spacji, a lewym górnym rogu nie może zawierać spacji. To jest przykład poprawnego programu:
F Gy
H
R x
Po przeanalizowaniu program przekształca się w wyrażenie języka w stylu C (C, Java, Python ...) zawierające zmienne jednoliterowe i wywołania funkcji w formacie <func>(<arg>)
lub <func>(<arg1>,<arg2>)
. Na przykład powyższy program powoduje wyrażenie:
F(H(R(x)),G(x,y))
Szczegóły procesu analizowania są następujące:
- Spacje są tylko wypełnianiem, więc nie są analizowane.
- Każda zmienna
a-z
jest zawsze analizowana jako sama. - Każda funkcja
A-Z
jest analizowana jako wywołanie funkcji. Jego argumenty są najbliższymi wyrażeniami pod nim i po prawej stronie siatki, w tej kolejności. Jeśli obecny jest tylko jeden z nich, podaje się go jako jedyny argument. Możesz założyć, że wszystkie funkcje mają co najmniej jeden argument w siatce.
W powyższym przykładzie zmienne x
i y
są analizowane jako one same. Funkcja R
nie ma nic poniżej i x
po prawej stronie, więc jest analizowana jako wywołanie jednoparametrowe R(x)
. Podobnie H
jest analizowany jako H(R(x))
, ponieważ ma R
go poniżej. Funkcja G
ma x
poniżej i y
po prawej stronie, więc jest analizowana jako G(x,y)
i podobnie dla F
. Wyrażenie przeanalizowane w lewym górnym rogu jest wynikiem analizy.
Wejście i wyjście
Twoje dane wejściowe to niepusty prostokątny układ znaków. Zawsze będzie to poprawny program w języku Alicji i Boba, ale może zawierać wyrażenia, które nie są używane w danych wyjściowych. Twój wynik będzie parsowanym wyrażeniem wynikającym z powyższego procesu.
Zasady i punktacja
Możesz napisać pełny program funkcji. Wygrywa najniższa liczba bajtów, a standardowe luki są niedozwolone.
Przypadki testowe
Są one podane w formacie grid <newline> expression
z łącznikami ---
między przypadkami. Format SE pozostawia niektóre wiersze puste, ale powinny być wypełnione spacjami.
x
x
---
x y
z
x
---
Fx
F(x)
---
Fx
y
F(y,x)
---
ABu
A(B(u))
---
G
H
k
G(H(k))
---
ABCA
x xs
DFk
A(x,B(D(F(k)),C(x,A(s))))
---
A B
C D x
A(C(D(x)),B(D(x)))
---
RT Hq
I xR k
R(I(x),T(H(R(k),q)))
---
A A A a
S A b
B C Dx
d X u f
A(B(d,C(D(f,x))),A(X(u),A(u,a)))
(A (B (D x)) (C (D x)))
byłoby odpowiednie, czy format jest ustalony?Odpowiedzi:
CJam,
676260585754 bajtówDzięki Dennis za oszczędność 4 bajtów.
Definiuje nazwany blok (funkcję)
J
i pozostawia go na stosie. Sama funkcja oczekuje tablicy ciągów na stosie, która reprezentuje siatkę wejściową, i pozostawia żądany ciąg zamiast niego.Sprawdź to tutaj.
Chciałem rozwiązać ten problem, odkąd został opublikowany, ale najwyraźniej potrzebowałem nagrody i zbyt długiego rozwiązania w języku Pyth, aby zmotywować się wystarczająco.
Wyjaśnienie
Rozwiązanie jest oczywiście rekurencyjne i stopniowo buduje ciąg.
źródło
Python 2,
227223192182179177 bajtów(Cztery spacje to tak naprawdę tabulatory)
Bierze listę 2d znaków jako pierwszy argument r.
źródło
Pyth, 97 bajtów
Mój bóg, którego zrobienie zajęło dużo czasu (około 5/6 godzin?). Pyth tak naprawdę nie został zaprojektowany do tego ...
Wypróbuj tutaj .
Próba wyjaśnienia, a także odpowiednik w języku Python
Gdzie funkcje
Pprint
iassign
zwracają to, co podano.źródło
Haskell,
124122120119 bajtówPrzykład użycia:
(#id) ["RT Hq ","I xR k"]
->"R(I(x),T(H(R(k),q)))"
.Jak to działa: oprócz siatki wejściowej
r
funkcja#
przyjmuje inną funkcjęg
jako argument, który jest stosowany,r
gdy lewy górny znak jest spacją. Jeśli zamiast tego jest to mały znak, zwróć go. W przeciwnym razie musi to być duża litera i#
jest wywoływana rekurencyjnie, raz,tail
aby zejść na dół, a raz,map tail
aby przejść w prawo.!
łączy wyniki z połączeń rekurencyjnych z,
, jeśli to konieczne. Wszystko zaczyna się od siatki wejściowej i funkcji tożsamości.źródło
Python 3, 187 bajtów
Wciąż szukam sposobów na grę w golfa, ale cieszę się, że udało mi się przekształcić go w jedno-liniowy.
źródło