IMP: Trình phân tích cú pháp nhân


9

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ề abhbiể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:

  1. 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,
  2. 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.


1
Trong ví dụ đầu tiên của bạn, tôi tin ab*clà một phân tích không chính xác, vì ckhông phải là một biến được phép.
isaacg

1
Với quét đệ quy tôi tìm thấy chính xác kết quả của bạn trong mẫu. Nhưng đó là câu hỏi: tại sao a*aaa aaa*avà khôngab*c c*ab
edc65

Vì quy tắc 1. phân tích cú pháp. Đúng, phép nhân thường là giao hoán, nhưng chúng ta không đi xa - chúng ta chỉ muốn "tái cấu trúc" phép nhân theo thứ tự đã được thực hiện. Thực tế trong ngôn ngữ của Jack, chúng ta có thể có một loại ma trận - phép nhân không phải là giao hoán. Và "aaaa" có thể là cả hai vị trí kề nhau của "aaa" và "a" hoặc "a" và "aaa" - điều này không phải vì tính giao hoán, thay vì mơ hồ, chúng tôi đang tính đến cả hai.
pawel.boczarski

Câu trả lời:


4

Bình, 18 ký tự

mj\*dfqzsTsm^Qkhlz

Giải pháp này được điều chỉnh từ giải pháp Cá phiên dịch của tôi . Các vấn đề thực sự rất giống nhau.

Yêu cầu đầu vào như vậy:

aaaa
"a", "aaa"

Cung cấp đầu ra như thế này:

['a*aaa', 'aaa*a', 'a*a*a*a']

Hãy thử nó ở đây.

  • sm^Qkhlz: Tạo tất cả các chuỗi biến chứa có độ dài bằng số chuỗi biến đầu vào.

  • fqzsT: Lọc các chuỗi biến phù hợp với chuỗi đầu vào

  • mj\*d: Chèn *ký hiệu và bản in.


3

Python 2 - 147 94 byte


R=lambda S,V,F=[]:S and[R(S[len(v):],V,F+[v])for v in V if v==S[:len(v)]]or print("*".join(F))

Điều này xác định một chức năng Rsẽ được sử dụng như:

>>> R("abc", ["a", "bc", "ab", "c"])

In đầu ra như:

a*bc
ab*c

1

JavaScript (ES6) 111

Chuyển thể từ câu trả lời "cá" của tôi , sự khác biệt chính là tìm tất cả các giải pháp, không chỉ là giải pháp đầu tiên.

F=(v,t)=>(k=(s,r)=>s?v.map(v=>s.slice(0,l=v.length)==v&&k(s.slice(l),[...r,v])):console.log(r.join('*')))(t,[])

Đầu ra được in ra bàn điều khiển. Kết quả chức năng không có ý nghĩa và phải được loại bỏ.

Kiểm tra trong bảng điều khiển Firefox / FireBug

F(['a','c','ab','bc'],'abc')  
a*bc  
ab*c

F(['ab','bc'],'abc')

F(['aaa','a'],'aaaa')
aaa*a
a*aaa
a*a*a*a

F(['xyz'],'xyz')
xyz
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.