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?