Phân tích ngôn ngữ 1D


13

Cho một chuỗi chỉ chứa 0 '1, 2 và ngoặc, xuất ra cây ngữ pháp của chuỗi.

A 2yêu cầu 2 đối số - một bên trái và một bên phải

A 1yêu cầu một đối số duy nhất - sang trái hoặc phải

A 0không yêu cầu bất kỳ đối số và là trường hợp cơ sở

Một cặp dấu ngoặc được tính là một đối số và nội dung của dấu ngoặc được đánh giá tách biệt với phần còn lại của chuỗi. Dấu ngoặc lồng là có thể

Một chuỗi đầu vào sẽ luôn là một cây hoàn chỉnh không có ký tự rơi ra. Chuỗi cũng sẽ chỉ có một giải pháp đúng duy nhất. Lưu ý rằng các hàm là giao hoán và bất kỳ sự sắp xếp các đối số cho 2sẽ được chấp nhận. Bạn sẽ không phải xử lý đầu vào không phù hợp với các yêu cầu này.

Định dạng ngữ pháp đầu ra sẽ ở dạng function(arguments)đệ quy

Các trường hợp thử nghiệm

0 --> 0
01 --> 1(0)
020 --> 2(0,0)
101 --> 1(1(0))
0120 --> 2(1(0),0)
0120210 --> 2(1(0),2(0,1(0)))
01210 --> 2(1(0),1(0))
(020)210 --> 2(2(0,0),1(0))
((020)20)1 --> 1(2(0,2(0,0)))

10201đầu vào hợp lệ?
Neil

Không, nó có thể là 1 (2 (0,1 (0))) hoặc 2 (1 (0), 1 (0))
Màu xanh

Thật ra tôi đã nghĩ đó là 1 (2 (1 (0), 0)) ;-)
Neil

1
Tôi vẫn không thấy lý do tại sao 0120210cũng không thể được phân tích cú pháp khi 2[4](2[2](1[1](0[0]), 0[3]), 1[5](0[6]))các số được đặt trong ngoặc chỉ vị trí trong chuỗi.
frageum

101cũng mơ hồ.
frageum

Câu trả lời:


3

Python 3.6 (tiền phát hành), 199

Đã lưu 6 byte nhờ Morgan Thrapp

import re
def f(s):s=s.strip('()');i,j=[m.start()if m else-1for m in(re.search(c+'(?![^(]*\))',s)for c in'21')];return i>0and f'2({f(s[:i])},{f(s[i+1:])})'or j>=0and f'1({f(s[:j])or f(s[j+1:])})'or s

Phiên bản giải thích & không có ý thức:

import re

def f(s):
    s=s.strip('()')
    # Search for '2' and '1' outside of brackets
    i, j = [m.start() if m else -1
            for m in (re.search(c + '(?![^(]*\))', s) for c in '21')]

    if i > 0:
        # Call `f(s[:i])` and `f(s[i+1:])`, concatenate the results
        return f'2({f(s[:i])},{f(s[i+1:])})'
    elif j>=0:
        # Call `f(s[:j])` and `f(s[j+1:])`, choose the non-empty result
        return f'1({f(s[:j]) or f(s[j+1:])})'
    else:
        return s
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.