एक साधारण संख्या प्रणाली


19

आपको एक साधारण संख्या प्रणाली के बारे में बताता हूं। (जो मैंने इस चुनौती के लिए बनाया है)

इस प्रणाली के कार्यों में शामिल है (), [], {}, और <>

1। ()

जब ()कोई तर्क नहीं दिया जाता है, यह मूल्यांकन करता है 0

जब ()एक या अधिक तर्क दिए जाते हैं, तो यह तर्कों के योग का मूल्यांकन करता है।

2। []

जब []कोई तर्क नहीं दिया जाता है, यह मूल्यांकन करता है -1

जब []एक या अधिक तर्क दिए जाते हैं, तो यह पहले तर्क का मूल्यांकन करता है और अन्य तर्कों का योग घटाता है।

3। {}

जब {}कोई तर्क नहीं दिया जाता है, यह मूल्यांकन करता है 1

जब {}एक या अधिक तर्क दिए जाते हैं, तो यह उन तर्कों के उत्पाद का मूल्यांकन करता है।

4। <>

जब <>कोई तर्क नहीं दिया जाता है, यह मूल्यांकन करता है 1

जब <>एक या अधिक तर्क दिए जाते हैं, तो यह पहले तर्क पूर्णांक का मूल्यांकन करता है जो अन्य तर्कों के उत्पाद से विभाजित होता है।

आपका कार्य

एक स्ट्रिंग को देखते हुए जिसमें एक वैध संख्या होती है (इसका मतलब है कि कोष्ठक संतुलित हैं, 0s, कोई विभाजन नहीं है) इस सरल संख्या प्रणाली में, अपना मान मुद्रित करें।

परीक्षण के मामलों

() -> 0
(()()) -> 0
([][]) -> -2
({}<>) -> 2
({}[]) -> 0
[] -> -1
[[][]] -> 0
[()<>] -> -1
{()} -> 0
{([]<>)} -> 0

याद रखें, यह , इसलिए सबसे कम बाइट्स वाला कोड जीत जाता है।


13
मेरे पास इसके लिए एक महान नाम है, जिसे मैंने पूरी तरह से बनाया था और कहीं और से नहीं मिला: ब्रेन-फ्लेक!
ETHproductions

4
@ETHproductions नंबर
ओलिवर नी


2
क्या विभाजन फ्लोट डिवीजन या पूर्णांक विभाजन है?
xnor

1
@ ओलिवर एक या दोनों ऑपरेंड नकारात्मक होने पर पूर्णांक विभाजन कैसे काम करना चाहिए? के लिए 4 परिणाम की उम्मीद क्या हैं 5/3, 5/-3, -5/3और -5/-3?
मार्टिन एंडर

जवाबों:


2

डायलॉग एपीएल , 94 बाइट्स

o←{(⊂(1⊃⍵),⍺⍺⊃⍵),2↓⍵}⋄u←{(⊃⍵,⍺⍺1)⍺⍺⍵⍵/1↓⍵}⋄⍎⍕'+/o' '-u+o' '×/o' '÷u×o' '(⊂⍬),'[')]}>'⍳⌽⍞],'⊂⍬'

का उपयोग करता है ⎕IO←0

)]}>एक फ़ंक्शन कॉल के साथ प्रतिस्थापित करता है जो एक स्टैक लेता है, अपने शीर्ष फ्रेम पर एक ऑपरेशन लागू करता है, इसे हटाता है, और इसके अगले फ्रेम के परिणाम को जोड़ता है (इसके लिए monadic ऑपरेटर oका उपयोग किया जाता है; dyadic ऑपरेटर uअधिक जटिल मामलों को संभालता है -और ÷)

([{<कोड के साथ प्रतिस्थापित करता है जो स्टैक में एक फ्रेम जोड़ता है ( (⊂⍬),)

एक खाली फ्रेम के प्रारंभिक ढेर के साथ परिणामी अभिव्यक्ति (एपीएल के निष्पादन के आदेश से मेल खाने के लिए उलट)⊂⍬ ) के


5

हास्केल, 357 306 277 251 228 224 188 185 180 बाइट्स

एक स्पष्ट स्टैक के साथ एक टोकन-आधारित पार्सर। (%)एक टोकन स्टैक और एक चरित्र लेता है और या तो (opcode, defaultnumber) या (0, संख्या) के लिए पुश करता है({[< , या सबसे ऊपरी संख्या और एक opcode को पॉप करता है और इसके लिए उत्तर को धकेलता है )}]>। Opcodes को एक एएससी एन्यूमरेशन हैक द्वारा एन्कोड किया गया है।

कुदोस अपने महान के लिए @ChristianSievers जवाब के ने कहा कि मैंने कुछ विचारों को उधार लिया है।

एक लाइन!

s%c|elem c"([<{",g<-div(fromEnum c)25=(g,[0,0,1,-1,1]!!g):s|(a,(o,n):b)<-span((==0).fst)s=(0,[foldr1(flip$[(+),quot,(-),(*)]!!(o-1))$snd<$>a,n]!!(0^length a)):b
snd.head.foldl(%)[]

अब कम त्रुटि-हैंडलिंग के साथ! उपयोग:

*Main> map (snd.head.foldl(%)[]) ["()","(()())","([][])","({}<>)","({}[])","[]","[[][]]","[()<>]","{()}","{([]<>)}"]
[0,0,-2,2,0,-1,0,-1,0,0]

14 + 3 बाइट्स बचाने के लिए @ChristianSievers धन्यवाद!

कुछ + 4 बाइट्स बचाने के लिए @Zgarb धन्यवाद!


1
(0,[0,0,1,-1,1]!!o):sपांचवीं पंक्ति में कैसे ?
क्रिश्चियन सिवर्स

@ChristianSievers बेशक!
एंग्स

की परिभाषाओं को स्विच करें !, ताकि आप (s:_)!_=d sदूसरे मामले के रूप में कर सकें । इसके अलावा, मुझे लगता है कि आप x<-p$d<$>init a,y<-d$last aके अंतिम मामले में बांध सकते हैं %
ज़र्गब

@Zgarb धन्यवाद! मुझे मूल्यांकन को और अधिक एकीकृत करने का एक तरीका मिला।
एंग्स

1
%आप की तीसरी पंक्ति पर चारों ओर के परदे गिरा सकते हैं _:bऔर g c
ज़र्गब

3

पायथन 2, 292 265 248 235 223 206 204 बाइट्स

r=reduce
s=input()
for n in')]}>':s=s.replace(n,'),')
for a in'(*x:sum(x)','[a=-1,*x:a-sum(x)','{*x:r(int.__mul__,x,1)','<a=1,*x:r(int.__div__,x,a)':s=s.replace(a[0],'(lambda %s)('%a[1:])
print eval(s)[0]

सभी ब्रैकेट को लैम्बडा के साथ प्रतिस्थापित करता है जो ब्रैकेट करता है, फिर परिणामी पायथन कोड का मूल्यांकन करता है। अपने इनपुट की तरह उद्धरण से घिरा की आवश्यकता है, '[<><>([]{})]'

यह प्रोग्राम प्रत्येक स्ट्रिंग में पहले अक्षर के रूप में ब्रैकेट के प्रकार forऔर कीवर्ड के बाद सब कुछ संग्रहीत करता हैlambda बाकी के रूप में । यह तब विकल्प के पहले अक्षर का उपयोग करता है; इसके बाकी हिस्से को एक मेमने की तरह जोड़ा जाता है (lambda*x:sum(x))()

Ideone पर यह कोशिश करो!


3

PEG.js (ES6) , 132 बाइट्स

x=a:[([{<]b:x*[)\]}>]{var x='([<'.indexOf(a)
b.length^1||b.push(0)
return~~eval(b.length?b.join(('+-/'[x]||'*')+' '):~-('10'[x]||2))}

अब तय होना चाहिए।

व्याख्या

अधिक पठनीय:

x=a:[([{<]
  b:x*
  [)\]}>]
{
  var x='([<'.indexOf(a)
  b.length^1||b.push(0)
  return ~~eval(
    b.length?
      b.join(('+-/'[x]||'*')+' ')
    :~-('10'[x]||2))
  )
}

PEG.js विशेष रूप से पार्सिंग के लिए बनाया गया जावास्क्रिप्ट का एक विस्तारित संस्करण है। यह बहुत सख्त है, यही वजह है कि मुझे इसका इस्तेमाल करना पड़ाvar । इसके अलावा, स्ट्रिंग्स के अंदर कोष्ठक के साथ एक बग प्रतीत होता है, जिसने कोड को महत्वपूर्ण रूप से फूला दिया।

शुरू करने के लिए, हम एक नियम को परिभाषित करते हैं जो xकिसी भी ब्रैकेट से मेल खाता है aजिसमें नियम से मेल खाने वाले कई भाव हो सकते हैं या नहीं हो सकते हैं x

प्रत्येक मैच के लिए शासन करने के लिए x, हम आंतरिक मैच के सरणी के लिए 0 को धक्का देते हैं bयदि bलंबाई 1 है।

अगर bकी लंबाई> 0, तो हम के सूचकांक को खोजने aमें ([<और से एक चरित्र मिलता है +-/कि सूचकांक का उपयोग कर। यदि परिणाम अपरिभाषित है (जिसका अर्थ aथा {), तो हम परिणाम को चालू करते हैं *। अंत में, हम एक स्थान पर काम करते हैं और bपरिणाम के साथ जुड़ते हैं ।

अगर bकी लंबाई = 0, तो हम के सूचकांक को खोजने aमें ([<और से एक चरित्र मिलता है 10कि सूचकांक का उपयोग कर। यदि परिणाम अपरिभाषित है (जिसका अर्थ है कि या aथा ), तो हम परिणाम को 2. में बदल देते हैं।{<

अंत में, हम केवल अभिव्यक्ति का मूल्यांकन कर सकते हैं और परिणाम को मंजिल दे सकते हैं।


3

पर्ल, 113 + 2 = 115 बाइट्स

-lp(2 बाइट पेनल्टी) के साथ चलाएं ।

/\W/,eval"sub $`\{\$#_?(shift)$&&$'1}"for qw'a+a:1- b-a:- c*c: d/c:';y/([{</a-d/;s/\W/0),/g;s/\pL\K/(/g;$_=eval

अधिक पठनीय (ध्यान दें: यह "अधिक पठनीय संस्करण" वास्तव में नहीं चलेगा, क्योंकि मैंने उन स्थानों पर टिप्पणियाँ डाल दी हैं जो उन्हें वाक्यविन्यास की अनुमति नहीं हैं):

              # -p option: read a line of input into $_ at program start
              # -l option: remove the final newline whenever reading
do {          # for each element of a list, given later:
  /\W/;       # place an initial identifier in $`, the next character in
              # $&, and the rest of the element in $'
  eval qq{    # then evaluate the following template, with substitutions:
    sub $` {  # define a subroutine named $`, that does this:
      \$#_ ?  # if there is more than one argument                   
      (shift) # then return the first argument $&-ed with
      $& &$'  # the result of a recursive call with the tail of the arguments
              # else (the "else" is a colon taken from $', not the template)
      1       # return (the remainder of $' applied to) 1
    }
  }
} for qw'     # specify the list by splitting the following on whitespace:        
  a+a:1-      # a(head,tail) = len(tail>1) ? head+a(tail) : 1-1
  b-a:-       # b(head,tail) = len(tail>1) ? head-a(tail) : -1
  c*c:        # c(head,tail) = len(tail>1) ? head*c(tail) : 1
  d/c:        # d(head,tail) = len(tail>1) ? head/c(tail) : 1
';
y/([{</a-d/;  # replace ( [ { < with a b c d in $_
s/\W/0),/g;   # replace whitespace, punctuation in $_ with the string "0),"
s/\pL\K/(/g;  # place a ( after (\K) each letter (\pL) in $_
$_=eval       # evaluate $_ as a Perl program, storing the result back in $_
              # -p option: print $_ to the user at program end
              # -l option: output a newline whenever printing

मूल विचार यह है कि हम टेक्स्ट प्रोसेसिंग के माध्यम से [()<>]पर्ल प्रोग्राम जैसे इनपुट को परिवर्तित कर रहे हैं b(a(0),d(0),0),; अनुगामी अल्पविराम के साथ पर्ल ठीक है। इससे पहले, हम कार्यों में परिभाषित किया गया a, b, c, dके रूप में ही प्रभाव है (), [], {}, <>भाषा हम लागू कर रहे हैं से निर्माणों; वे प्रत्येक अपने अंतिम तर्क (अंत में 0) की अवहेलना करते हैं, जो यह सुनिश्चित करने के लिए शामिल है कि सभी इनपुट सही ढंग से पार्स करें, और आमतौर पर कार्यात्मक प्रोग्रामिंग में देखा गया कार्यान्वयन का उपयोग करके काम करें जहां सिर और पूंछ को अलग-अलग संसाधित किया जाता है। क्योंकि b(e,f,g,0)इसका मतलब है e-f-g, अर्थात इसके पहले तर्क को विशेष रूप से aमानता है , जबकि इसके तर्कों को सममित रूप से ( मानता है)a(e,f,g,0) मतलब e+f+g) , हम लागू करते हैंaपुनरावर्ती और bकॉलिंग के माध्यम से acऔर dएक समान संबंध है। इन सभी कार्यों में बहुत समान हैं, इसलिए हम उन्हें अलग से लागू करने के बजाय रनटाइम पर उत्पन्न करते हैं; हम एक टेम्पलेट को संग्रहीत करते हैं जो एक स्ट्रिंग में सभी चार कार्यों पर लागू होता है, फिर टेम्पलेट में वर्णों को प्रतिस्थापित करके फ़ंक्शन उत्पन्न करता है।

क्योंकि पर्ल /फ्लोटिंग-पॉइंट डिवीज़न {}करता है , कार्यान्वित भी करता है। मैं मान रहा हूँ कि या तो यह अपने आप में कोई समस्या नहीं है, या -Minteger(किसी भाषा संस्करण का चयन करना जहाँ सभी अंकगणितीय संक्रियाएँ पूर्णांक संक्रियाएँ हैं) मुफ़्त है, क्योंकि अन्यथा मुझे पर्ल में पूर्णांक विभाजन लिखने के लिए अतिरिक्त बाइट्स खर्च करने पड़ेंगे, जो प्रतीत नहीं होता है कि समस्या मूल रूप से क्या है। (मुझे लगता है कि आपको बदलने के (shift)लिए चार बाइट्स खर्च करने होंगे int+(shift); मैंने यह परीक्षण नहीं किया है।)



2

PHP, 315 300 285 258 250 244 बाइट्स

for($s=$argv[1];$r=!$r;)foreach(["(+)1","[-]0","{*}2","</>2]as$p)if(preg_match("#$e$p[0]([-_\d]*)$e$p[2]#",$s,$m)){if(""==$v=strtok($m[1],_))$v=$p[3]-1;while(""<$n=strtok(_))eval("\$v$p[1]=$n;");$s=strtr($s,[$m[$r=0]=>_.$v]);}echo substr($s,1);

अंडरस्कोर + मूल्य के साथ उप-अभिव्यक्तियों को बदलता है; लूप टूट जाता है जब पुनरावृत्ति ने कोई प्रतिस्थापन नहीं किया।

19 साल जब मैंने पहली बार सी से मुलाकात की, 17 साल PHP के साथ काम करते रहे;
यह पहली बार है जो strtokसमझ में आता है ... 24 बाइट बचाने में मदद करता है!

टूट - फूट

for($s=$argv[1];    // take input from argument
    $r=!$r;)        // toggle $r; loop until no replacement has taken place
    foreach(["(+)1","[-]0","{*}2","</>2]as$p) // loop through operations
        if(preg_match("#$e$p[0]([-_\d]*)$e$p[2]#",$s,$m))   // find a match
        {
            if(""==$v=strtok($m[1],_))  // init $v with first token from sub-match
                $v=$p[3]-1;             // if no token, init with default value
            while(""<$n=strtok(_))      // loop through tokens
                eval("\$v$p[1]=$n;");       // operate
            $s=strtr($s,[$m[$r=0]=>_.$v]);  // reset $r; replace match with underscore+value
        }
echo substr($s,1);  // print result

@ किसी के यहाँ पिटाई नहीं की; लेकिन मज़ा के लिए धन्यवाद!
टाइटस

2

ईएस 6 (जावास्क्रिप्ट), 250, 171, 154, 149, 147 बाइट्स

एक शुद्ध जावास्क्रिप्ट संस्करण।

"मेटाप्रोग्रामिंग" (यहां अन्य उत्तरों की तरह), इनपुट प्रोग्राम टेक्स्ट को संबंधित जावास्क्रिप्ट प्रोग्राम में परिवर्तित करता है, इसके लिए कई तरह के डायरेक्ट टेक्स्ट सब्स्क्रिप्शन्स लागू करता है (जैसे कि प्रोग्राम स्ट्रक्चर को जैसा है) रखना।

शायद आगे गोल्फ हो सकता है।

अद्यतन (v2.1)

  • माइनस दो बाइट्स (टर्नरी अभिव्यक्ति में कोष्ठक हटा दिया गया)
  • परिणाम निष्कर्षण के लिए चर का उपयोग करके और अतिरिक्त "[]

अद्यतन (v2)

बस एहसास हुआ कि ईएस सरणियों में लंबित कॉमा पूरी तरह से वैध हैं, इसलिए पूरे कॉमा सामान्यीकरण कोड को हटाया जा सकता है। वर्णमाला देखने के अनुकूलन पर @Titus द्वारा एक उत्कृष्ट सलाह का भी पालन किया।

अद्यतन (v1)

हटाए गए डुप्लिकेट "बदलें" उपनाम।

अद्यतन (v1)

  • बेहतर वर्णमाला का उपयोग करें: () => 1+ [] => 0 {} => 2 * <> => 2 / (प्रत्येक चार्ट को सीधे मूल्य या ऑपरेटर के रूप में फिर से उपयोग किया जा सकता है)

  • बदला हुआ कम () बदलें के साथ () (वर्णमाला मानचित्रण)

  • निरंतर इनलाइनिंग, ओपन और क्लोजिंग ब्रैकेट प्रोसेसिंग को एक स्टेप में मिला दिया

गोल्फ (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

1
अपने v0 संस्करण s.reduce((r,c)=>r+="abcdefgh"["()[]{}<>".indexOf(c)],'')(-5) के साथ जा सकते हैं ? यदि ऐसा है, तो आप indexOfएक चर में याद कर सकते हैं और ऑपरेटर को तीसरे स्ट्रिंग शाब्दिक से ले सकते हैं।
टाइटस

2

हास्केल, 184 179 172 161 160 159 151 148 145 बाइट्स

s%(c:i)|elem c")}]>"=([1?(*),sum,1?quot,(-1)?(-)]!!mod(fromEnum c)5$s,i)|(r,j)<-[]%i=(s++[r])%j
[v]%e=(v,e)
(v?_)[]=v
(_?o)s=foldl1 o s
fst.([]%)

पुनरावर्ती वंश, इनपुट को फैलाना क्योंकि हास्केल। हमेशा की तरह, अंतिम पंक्ति एक परिभाषा नहीं है, लेकिन उस फ़ंक्शन को बताती है जो समस्या को हल करती है। इसलिए परीक्षण करने के लिए, एक फ़ाइल में पिछले एक को छोड़कर लाइनें डालें, इसे लोड करें और ऐसा कुछ करें:

*Main> fst.([]%) $ "{([][][])([][])}"
6

@Zgarb के लिए प्रेरणा और बहुत सारे विस्तृत संकेत के लिए धन्यवाद, और @Angs को उनके समाधान और आगे के संकेत से प्रेरणा के लिए।

यह निर्दिष्ट नहीं किया गया था कि विभाजन को नकारात्मक पूर्णांक के साथ कैसे व्यवहार करना चाहिए। वैसे भी, बार-बार उपयोग करना divगलत लगता है, क्योंकि यह divशेष मूल्यों के उत्पाद के साथ एक बार उपयोग करने के समान नहीं है । अब का उपयोग कर quot, मैं के लिए एक ही परिणाम प्राप्त <{}([][])[]>और <{}{([][])[]}>

पहले संस्करण में अच्छे, लगभग पठनीय कोड के लिए। मध्यवर्ती संस्करणों में सभी प्रकार के अच्छे और डराने वाले कोड होते हैं और इस संस्करण को समझने में मदद करते हैं।


मुझे लगता है कि आप स्पष्ट tuples के बजाय परिभाषित (!)=(,)और उपयोग करके कुछ बाइट्स बचा सकते हैं !
ज़र्गब

यदि आप को परिभाषित m xऔर d xके रूप में 1#xऔर 0#x, आप मामलों मर्ज कर सकते हैं m[x]और d[x]एक है, जो मुझे लगता है कि बचाता में कुछ भी बाइट्स।
ज़गर्ब

@Zgarb धन्यवाद! मैंने लगभग आखिरी जोड़ी को याद किया, जिसके बिना !चाल का भुगतान नहीं हुआ। आपका दूसरा सुझाव बुराई है, मेरा लगभग पठनीय कोड है ... चालाक!
क्रिश्चियन सिवर्स

हे, मुझे बस एहसास हुआ कि परिभाषित करना s%(c:i)=(s?c,i)और s?')'=sum sआदि बहुत छोटा होगा, क्योंकि आप दोहराया iएस से छुटकारा पा सकते हैं । ..नहीं रुको, क्योंकि शायद s%(_:i)मामले के कारण काम नहीं करेगा ।
जरगब

1
बैकटिक्स को खो दें elemऔर div, कि कुछ और बाइट्स बचाएं।
15

1

जावास्क्रिप्ट (ईएस 6), नहीं eval, 156 बाइट्स

f=s=>s==(s=s.replace(/(.) ?([- \d]*)[\]})>]/,(_,c,s)=>` `+(s?s.split` `.reduce((l,r)=>c<`<`?l- -r:c<`[`?l/r|0:c<`{`?l-r:l*r):c==`[`?-1:c==`(`?0:1)))?+s:f(s)

स्पष्टीकरण: regexp पहला अप्रतिबंधित क्लोजिंग ब्रैकेट पाता है, और (संभवतया) संबंधित ओपनिंग ब्रैकेट और बीच में किसी भी तर्क से मेल खाता है। तर्कों को ऑपरेशन के अनुसार विभाजित और कम किया जाता है (दुख की बात है '(' और '[' के लिए इष्टतम जोड़ी नहीं हैं ) +और -), या यदि कोई तर्क नहीं हैं, तो उचित मूल्य की गणना की जाती है (फिर से मूल्यों के लिए वर्णों का मिलान उपसमिति है) मेरे दृष्टिकोण से)। परिणाम को एक अग्रणी स्थान के साथ प्रतिस्थापित किया जाता है ताकि इसे अन्य परिणामों से अलग किया जा सके। फ़ंक्शन तब तक खुद को पुनरावर्ती कहता है जब तक कि कोई और अधिक परिवर्तन नहीं होते हैं, जिस स्थिति में यह परिणामी मूल्य वापस करता है। उदाहरण:

[()<>]
[ 0<>]
[ 0 1]
 -1

f ("([[[]])" = = ० (२ के बजाय)
zeppelin

मेरे लिए कुछ अन्य परीक्षण भी विफल हो रहे हैं (आप मेरे उत्तर में एक कोशिश में परीक्षा कोड दे सकते हैं ), संभवतः: f ("[]") => 0 के रूप में, "[]" हर असफल परीक्षा का एक हिस्सा है।
ज़ेपेलिन

@zeppelin ऊप्स, जो कुछ खराब गोल्फिंग के कारण था। मैं एक पिछले संस्करण में वापस आ गया हूं, लेकिन दुख की बात है कि मुझे कुछ बाइट्स की लागत है।
नील
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.