ES6 (Javascript), 250, 171, 154, 149, 147 byte
Một phiên bản Javascript thuần túy.
"Siêu lập trình" (giống như hầu hết các câu trả lời khác ở đây), chuyển đổi văn bản chương trình đầu vào thành chương trình Javascript tương ứng, bằng cách áp dụng một số thay thế văn bản trực tiếp cho nó (nghĩa là giữ nguyên cấu trúc chương trình).
Có lẽ có thể được chơi golf hơn nữa.
CẬP NHẬT (v2.1)
- Trừ hai byte (loại bỏ dấu ngoặc đơn trong biểu thức ternary)
- Đã giảm thêm 5 byte, bằng cách sử dụng biến để trích xuất kết quả và loại bỏ thêm "[]"
CẬP NHẬT (v2)
Chỉ cần nhận ra rằng dấu phẩy đang chờ xử lý trong mảng ES là hoàn toàn hợp lệ, vì vậy toàn bộ mã chuẩn hóa dấu phẩy có thể được xóa. Cũng theo một lời khuyên tuyệt vời của @Titus, về việc tối ưu hóa việc tra cứu bảng chữ cái.
CẬP NHẬT (v1)
Loại bỏ bí danh "thay thế" trùng lặp.
CẬP NHẬT (v1)
Sử dụng bảng chữ cái tốt hơn: () => 1+ [] => 0 {} => 2 * <> => 2 / (mỗi char có thể được sử dụng lại trực tiếp dưới dạng giá trị hoặc toán tử)
Đã thay thế less () bằng thay thế () (ánh xạ bảng chữ cái)
Sáp nhập liên tục nội tuyến, mở và đóng khung xử lý thành một bước
Chơi gôn (v2.1)
s=>eval("o="+s.replace(/./g,r=>"2+1-3*3/"["()[]{}<>".indexOf(r)]).replace(/\d\D?|\D/g,r=>r[1]?r[0]-2+",":r*1?'([':`].reduce((r,a)=>r${r}a)),`)+"o
Chơi gôn (v1)
(s,A="(2)+[1]-{3}*<3>/")=>eval(s[R="replace"](/./g,r=>A[A.indexOf(r)+1])[R](/\d\D?|\D/g,r=>r[1]?r[0]-2+",":(r[0]*1?'([':`].reduce((r,a)=>r${r}a)),`))[R](/,(\])|,$/g,"$1"))
Chơi gôn (v0)
([...s],A="(a)b[c]d{e}f<g>h",R="replace")=>eval(s.reduce((r,c)=>r+=A[A.indexOf(c)+1],'')[R](/ab|cd|ef|gh/g,r=>({d:-1,b:'0'}[r[1]]||1) + ',')[R](/[aceg]/g,"([")[R](/[bdfh]/g,r=>`].reduce((r,a)=>r${"+*-/"["bfdh".indexOf(r)]}a)),`)[R](/,(\])|,$/g,"$1"))
Giải thích (v0)
//BEGIN
//s - input text, A - alphabet, R - "String.replace()" alias
E=([...s],A="(a)b[c]d{e}f<g>h",R="replace")=>eval(
//Replace input alphabet by a more friendly one, to avoid too much escaping and quoting
// () - ab, [] -cd, {} - ef, <> - gh
s.reduce((r,c)=>r+=A[A.indexOf(c)+1],'')
//Replace no-arg invocations with a corresponding constant value
// () => 0, [] => -1, {} => 1, <> => 1
[R](/ab|cd|ef|gh/g,r=>({d:-1,b:'0'}[r[1]]||1) + ',')
//Replace opening brackets with "(["
[R](/[aceg]/g,"([")
//Replace closing brackets with "].reduce(...)),"
//An arithmetic operation to apply (+-*/) is chosen based on the bracket type
//and is substituted into the template
[R](/[bdfh]/g,r=>`].reduce((r,a)=>r${"+*-/"["bfdh".indexOf(r)]}a)),`)
//Strip excessive commas
[R](/,(\])|,$/g,"$1")
);
//END: eval() the result
Example:
E("{([]<>()<>{})(<><>)}")
=> eval("([([-1,1,0,1,1].reduce((r,a)=>r+a)),([1,1].reduce((r,a)=>r+a))].reduce((r,a)=>r*a))")
=> 4
Kiểm tra
E=([...s],A="(a)b[c]d{e}f<g>h",R="replace")=>eval(s.reduce((r,c)=>r+=A[A.indexOf(c)+1],'')[R](/ab|cd|ef|gh/g,r=>({d:-1,b:'0'}[r[1]]||1) + ',')[R](/[aceg]/g,"([")[R](/[bdfh]/g,r=>`].reduce((r,a)=>r${"+*-/"["bfdh".indexOf(r)]}a)),`)[R](/,(\])|,$/g,"$1"))
T=(s,a)=>{
console.log(s,r=E(s),r==a?"OK":"NOT OK");
}
T("()",0)
T("(()())",0)
T("([][])",-2)
T("({}<>)",2)
T("({}[])",0)
T("[]",-1)
T("[[][]]",0)
T("[()<>]",-1)
T("{()}",0)
T("{([]<>)}",0)
Đầu ra thử nghiệm
() 0 OK
(()()) 0 OK
([][]) -2 OK
({}<>) 2 OK
({}[]) 0 OK
[] -1 OK
[[][]] 0 OK
[()<>] -1 OK
{()} 0 OK
{([]<>)} 0 OK