ES6 (JavaScript), 250, 171, 154, 149, 147 bajtów
Czysta wersja Javascript.
„Metaprogramowanie” (jak większość innych odpowiedzi tutaj) konwertuje tekst programu wejściowego na odpowiedni program Javascript, stosując do niego szereg bezpośrednich podstawień tekstu (tj. Zachowując aktualną strukturę programu).
Prawdopodobnie można dalej grać w golfa.
AKTUALIZACJA (v2.1)
- Minus dwa bajty (usunięto nawias w wyrażeniu potrójnym)
- Grał o 5 bajtów więcej, używając zmiennej do ekstrakcji wyników i pozbywając się dodatkowego „[]”
AKTUALIZACJA (v2)
Właśnie zdałem sobie sprawę, że oczekujące przecinki w tablicach ES są całkowicie poprawne, więc cały kod normalizacji przecinków można usunąć. Postępował również zgodnie ze świetną radą @Titus, dotyczącą optymalizacji wyszukiwania alfabetu.
AKTUALIZACJA (v1)
Usunięto zduplikowany alias „zamień”.
AKTUALIZACJA (v1)
Użyj lepszego alfabetu: () => 1+ [] => 0 {} => 2 * <> => 2 / (każdy znak może być bezpośrednio ponownie użyty jako wartość lub operator)
Zamienione zmniejsz () na replace () (odwzorowanie alfabetu)
Scalona stała obróbka nachylenia, otwierania i zamykania zamka w jeden krok
Gra w golfa (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
Gra w golfa (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"))
Gra w golfa (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"))
Wyjaśnione (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
Test
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)
Wyjście testowe
() 0 OK
(()()) 0 OK
([][]) -2 OK
({}<>) 2 OK
({}[]) 0 OK
[] -1 OK
[[][]] 0 OK
[()<>] -1 OK
{()} 0 OK
{([]<>)} 0 OK