Lý lịch
Alice và Bob đang tạo ra một ngôn ngữ chơi gôn để giành chiến thắng trong mọi thử thách PPCG. Alice muốn tạo một ngôn ngữ hai chiều, như> <>, nhưng Bob thích cú pháp tiền tố như trong J. Như một sự thỏa hiệp, họ quyết định tạo ra một ngôn ngữ tiền tố hai chiều. Trình phân tích cú pháp là một nỗi đau để viết, và họ cần sự giúp đỡ của bạn!
Đặc tả cú pháp
Trong ngôn ngữ của Alice và Bob, có các biến , được biểu thị bằng các chữ cái ASCII chữ thường a-z
và các hàm , được biểu thị bằng các chữ cái ASCII viết hoa A-Z
. Một hàm có thể được gọi với một hoặc hai đối số. Một chương trình là một lưới hình chữ nhật gồm các chữ cái a-zA-Z
và khoảng trắng, và góc trên cùng bên trái không được chứa một khoảng trắng. Đây là một ví dụ về một chương trình hợp lệ:
F Gy
H
R x
Khi chương trình được phân tích cú pháp, nó được chuyển thành biểu thức của ngôn ngữ kiểu C (C, Java, Python ...) có chứa các biến đơn và các lệnh gọi hàm theo định dạng <func>(<arg>)
hoặc <func>(<arg1>,<arg2>)
. Ví dụ, chương trình trên dẫn đến biểu thức này:
F(H(R(x)),G(x,y))
Các chi tiết của quá trình phân tích cú pháp như sau:
- Các khoảng trắng chỉ là phụ, vì vậy chúng không được phân tích cú pháp.
- Mỗi biến
a-z
luôn được phân tích cú pháp như chính nó. - Mỗi chức năng
A-Z
được phân tích cú pháp như một cuộc gọi chức năng. Đối số của nó là các biểu thức gần nhất bên dưới nó và bên phải của nó trong lưới, theo thứ tự này. Nếu chỉ có một trong số này là hiện tại, nó được đưa ra như là đối số duy nhất. Bạn có thể giả sử rằng tất cả các hàm có ít nhất một đối số trong lưới.
Trong ví dụ trên, các biến x
và y
được phân tích cú pháp như chính chúng. Hàm R
không có gì bên dưới nó và x
bên phải của nó, vì vậy nó được phân tích cú pháp như là một lời gọi một đối số R(x)
. Tương tự, H
được phân tích cú pháp như H(R(x))
, vì nó có R
bên dưới nó. Hàm G
này x
nằm bên dưới nó và y
bên phải của nó, vì vậy nó được phân tích cú pháp G(x,y)
và tương tự như vậy F
. Biểu thức được phân tích cú pháp ở góc trên cùng bên trái là kết quả của quá trình phân tích cú pháp.
Đầu vào và đầu ra
Đầu vào của bạn là một mảng các ký tự hình chữ nhật không trống. Nó sẽ luôn là một chương trình hợp lệ trong ngôn ngữ của Alice và Bob, nhưng nó có thể chứa các biểu thức không được sử dụng trong đầu ra. Đầu ra của bạn sẽ là biểu thức được phân tích cú pháp từ quá trình trên.
Quy tắc và tính điểm
Bạn có thể viết một chương trình đầy đủ của một chức năng. Số byte thấp nhất sẽ thắng và các sơ hở tiêu chuẩn không được phép.
Các trường hợp thử nghiệm
Chúng được đưa ra trong định dạng grid <newline> expression
, với dấu gạch nối ---
giữa các trường hợp. Định dạng SE để trống một số dòng, nhưng chúng nên được lấp đầy bằng khoảng trắng.
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)))
là phù hợp hay là định dạng cố định?