ES6 (자바 스크립트) 250, 171, 154, 149147 바이트
순수한 자바 스크립트 버전.
"메타 프로그래밍"(여기의 대부분의 다른 답변과 마찬가지로)은 입력 프로그램 텍스트를 여러 개의 직접 텍스트 대체를 적용하여 (즉, 프로그램 구조를 그대로 유지) 해당 Javascript 프로그램으로 변환합니다.
아마 더 골프를 칠 수 있습니다.
업데이트 (v2.1)
- 빼기 2 바이트 (3 진 표현식에서 제거 된 괄호)
- 결과 추출을 위해 변수를 사용하고 추가 "[]"를 제거하여 5 바이트를 더 줄였습니다.
업데이트 (v2)
ES 어레이에서 보류중인 쉼표는 완전히 유효하므로 전체 쉼표 정규화 코드를 제거 할 수 있습니다. 또한 알파벳 조회 최적화에 대한 @Titus의 훌륭한 조언을 따랐습니다.
업데이트 (v1)
중복 된 "대체"별칭이 제거되었습니다.
업데이트 (v1)
더 나은 알파벳을 사용하십시오 : () => 1+ [] => 0 {} => 2 * <> => 2 / (각 문자는 값 또는 연산자로 직접 재사용 될 수 있습니다)
reduce ()를 replace ()로 대체했습니다 (알파벳 매핑)
일정한 인라인, 오픈 및 클로징 브래킷 처리를 한 단계로 병합
골프 (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
골프 (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"))
골프 (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"))
설명 (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
테스트
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)
테스트 출력
() 0 OK
(()()) 0 OK
([][]) -2 OK
({}<>) 2 OK
({}[]) 0 OK
[] -1 OK
[[][]] 0 OK
[()<>] -1 OK
{()} 0 OK
{([]<>)} 0 OK