Jack thích ngôn ngữ lập trình C, nhưng ghét viết các biểu thức muốn V=a*b*h;
nhân các giá trị.
Ông muốn viết V=abh;
thay vào đó, tại sao trình biên dịch phải rên rỉ về abh
biểu tượng không được xác định kể từ khi int a, b, h;
được xác định, vì vậy chúng ta có thể suy ra phép nhân?
Giúp anh ta thực hiện một trình phân tích cú pháp giải mã một thuật ngữ nhân, với điều kiện là đã biết tập hợp các biến được xác định trong phạm vi hiện tại.
Để đơn giản, nhân với số (như trong 2*a*b
) không được tính đến, chỉ có các biến xuất hiện.
Đầu vào là một thuật ngữ nhân T , đáp ứng regrec:
[a-zA-Z_][a-zA-Z_0-9]*
và một biến bộ Z .
Phân tích cú pháp P của thuật ngữ T trên tập biến Z là một chuỗi hoàn thành sau:
- sau khi loại bỏ tất cả các lần xuất hiện
*
từ P, chúng tôi nhận được T, - hoặc là một tên biến từ Z hoặc bao gồm các tên biến thích hợp từ Z được phân tách bằng các
*
ký tự đơn .
Các giải pháp nên in tất cả các phân tích của một thuật ngữ.
Mẫu vật:
Vars a, c, ab, bc
Term abc
Solution ab*c, a*bc
Vars ab, bc
Term abc
Solution -
Vars -
Term xyz
Solution -
Vars xyz
Term xyz
Solution xyz
Vars width, height
Term widthheight
Solution width*height
Vars width, height
Term widthheightdepth
Solution -
Vars aaa, a
Term aaaa
Solution aaa*a, a*aaa, a*a*a*a
Đầu vào (danh sách các biến và thuật ngữ) có thể được cung cấp theo bất kỳ cách nào phù hợp với ngôn ngữ.
Đầu ra có thể ở bất kỳ dạng hợp lý nào (một phân tích cú pháp trên mỗi dòng hoặc danh sách được phân tách bằng dấu phẩy, v.v.) - nhưng nó phải rõ ràng và có thể đọc được.
Đầu ra trống có thể được chấp nhận nếu không có khả năng phân tích cú pháp của một thuật ngữ (trong các ví dụ tôi đã sử dụng '-' cho rõ ràng).
Đây là một mã golf, vì vậy mã ngắn nhất sẽ thắng.
a*aaa aaa*a
và khôngab*c c*ab
ab*c
là một phân tích không chính xác, vìc
không phải là một biến được phép.