Các biểu thức ngoặc đơn đầy đủ


11

Hôm nay, thách thức của bạn là tạo ra tất cả các dấu ngoặc đơn có thể có của một biểu thức.

Đầu vào của bạn là một dòng ASCII có thể in được chứa một hoặc nhiều thuật ngữ được phân tách bởi các toán tử. Đầu vào cũng có thể chứa khoảng trắng - bạn phải bỏ qua những khoảng này. Một thuật ngữ là [a-zA-Z0-9], một nhà điều hành là [^ ()a-zA-Z0-9]. Bạn có thể cho rằng đầu vào luôn hợp lệ.

Xuất ra tất cả các cách có thể để ngoặc đơn hoàn toàn biểu thức đã cho, được phân tách bằng các dòng mới với một dòng mới tùy chọn.

Do không :

  • Các thuật ngữ ngoặc đơn - chỉ ngoặc đơn xung quanh các toán tử.
  • Sắp xếp lại các điều khoản.
  • Đầu ra bất kỳ không gian.

Ví dụ đầu vào / đầu ra:

N
N

a * b
(a*b)

x_x_0
(x_(x_0))
((x_x)_0)

a * b|c|d
(a*(b|(c|d)))
(a*((b|c)|d))
((a*b)|(c|d))
((a*(b|c))|d)
(((a*b)|c)|d)

Mã nhỏ nhất trong byte thắng.


Bạn phải liệt kê các toán tử chính xác mà chúng tôi phải xem xét. Là !một nhà điều hành? Thế còn ?
Tối ưu hóa

@Optimizer Tôi đã liệt kê chính xác biểu thức chính xác của những gì được coi là một toán tử. Tuy nhiên, !phù hợp với regex, do đó , không thể là một phần của đầu vào vì nó không thể in được ASCII.
orlp

À được rồi. Vì vậy, bất cứ điều gì ngoại trừ một thuật ngữ là một nhà điều hành ...
Trình tối ưu hóa

Vì vậy, cả thuật ngữ và toán tử luôn dài một ký tự?
dùng81655

1
chèn chữ bắt buộc liên quan đến LISP tại đây
mèo

Câu trả lời:


2

Bình thường, 38 byte

L?tbsmmjj@bdk"()"*y<bdy>bhd:1lb2bjy-zd

Hãy thử trực tuyến.

Nó định nghĩa một hàm đệ quy rằng:

  • trả về đầu vào nếu độ dài của nó là 1
  • lấy tất cả hai phần tách của đầu vào trên các toán tử và cho mỗi phần tách:
    • gọi chính nó theo cách đệ quy trên mỗi nửa
    • lấy sản phẩm của Cartesian về kết quả của mỗi nửa
    • tham gia mỗi kết quả của toán tử tại phần tách
    • ngoặc đơn kết quả đã tham gia
  • và cuối cùng nối các mảng kết quả.

Hàm sau đó được gọi với chuỗi đầu vào với khoảng trắng được loại bỏ và kết quả được nối bằng dòng mới.


3

JavaScript (ES6), 208 197 byte

s=>((q=x=>x.map((_,i)=>(a=[...x.slice(0,i*=2),p="("+x[i]+x[++i]+x[++i]+")",...x.slice(i+1)],x[i]?a[1]?q(a):r.push(p):0)))([...s.replace(/ /g,o="")],r=[]),r.map((l,i)=>r.indexOf(l)<i?0:o+=l+`
`),o)

Giải trình

Sử dụng hàm đệ quy lấy một mảng [ t, o, t, o, etc... ]và ngoặc đơn mỗi cặp hai số hạng liên tiếp giống nhau [ (tot), o, etc... ]và lặp lại quá trình này cho đến khi chỉ có một phần tử trong mảng, sau đó lọc ra các giá trị trùng lặp.

s=>(                                  // s = input string
  (q=x=>                              // q = parenthesise array function
    x.map((_,i)=>(
      a=[                             // a = p with parenthesised pair of terms
        ...x.slice(0,i*=2),
        p="("+x[i]+x[++i]+x[++i]+")", // parenthesise and join 2 terms and an operator
        ...x.slice(i+1)
      ],
      x[i]?a[1]                       // make sure the loop is not over
        ?q(a)                         // check next level of permutations
        :r.push(p)                    // add the permutation to the results
      :0
    ))
  )([...s.replace(/ /g,               // remove spaces and parenthesise all expressions
    o="")],                           // o = output string
    r=[]),                            // r = array of result strings
  r.map(                              // filter out duplicates
    (l,i)=>r.indexOf(l)<i?0:o+=l+`
`
  ),o)                                // return o

Kiểm tra

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.