आदेश का संचालन


13

परिचय

बचपन में एक बिंदु आता है जब आपको लगता है कि आपको जोड़ने और गुणा करने में महारत हासिल है, तो कोई आपके साथ आता है और आपको सूचित करता है कि:

a * b + c = (a * b) + c! = a * (b + c);

और जैसा कि पहले पढ़ाया गया था, यह उतनी सरल या रैखिक प्रक्रिया नहीं थी। आप सीखते हैं कि कुछ मौजूद है जिसे संचालन का क्रम कहा जाता है । यह कुछ स्तर की संगति और भावों को बनाए रखने का एक बहुत ही महत्वपूर्ण तरीका है, बिना हर चीज के रास्ते में कोष्ठक प्राप्त करना।

सामान्य कहानी

एक दिन, आप सड़कों पर घबराहट की आवाज़ के लिए उठते हैं। " द 2560 " (शॉर्ट फॉर "ऑर्गनाइज़ेशन अगेंस्ट द ऑर्डर ऑफ ऑपरेशंस", एक डॉर्की हेक्स-ईश ट्विस्ट नाम के तहत एक चरमपंथी समूह ने दुनिया के सभी परमाणु हथियारों पर नियंत्रण करने के लिए अपने बुरे तरीकों का इस्तेमाल किया है। वे पूरे ग्रह को बंधक बनाए हुए हैं, और उनकी एक सरल मांग है: संचालन या चेहरे के उन्मूलन के स्वीकृत आदेश को उल्टा करना (कोष्ठक अपनी प्राथमिकता बनाए रखना है)। नई प्रणाली को PSADME (कोष्ठक, घटाव / जोड़, विभाजन / गुणा, घातांक) कहा जाता है, और अभिव्यक्तियाँ दाएं-से-बाएं मूल्यांकन करती हैं:

a - b - c = a - (b - c) = a + c - b

दिन बीतते जा रहे हैं, और संक्रमण जारी है। जबकि गणितज्ञ और भौतिक विज्ञानी सभी अपने समीकरणों को फिर से लिखने में व्यस्त हैं, कंप्यूटर वैज्ञानिकों को फैशन को बदलने के कार्य का सामना करना पड़ता है जिसमें गणितीय अभिव्यक्तियों की व्याख्या कंप्यूटर द्वारा की जाती है। आप एक गुप्त विद्रोही प्रोग्रामिंग समूह से संबंधित हैं, जिसका उद्देश्य नई वैश्विक अधिपतियों के लिए उतनी ही पीड़ा देना है - और, संयोग से, आपको 2560 द्वारा बेतरतीब ढंग से चुना गया है और बेंचमार्क गणना कार्यक्रम का उत्पादन करने का काम सौंपा गया है।

आपका मिशन

एक प्रोग्राम (या फ़ंक्शन) लिखें जो इनपुट के रूप में (संख्यात्मक) गणितीय अभिव्यक्ति लेता है, ऑपरेशन के आदेश के रूप में PSADME का उपयोग करके अभिव्यक्ति की गणना करता है और परिणाम को आउटपुट करता है। अभिव्यक्तियों को दाएं-से-बाएं मूल्यांकन करना चाहिए, इसलिए

13+4=17=6.

सादगी के लिए, प्रदान की गई सभी संख्या पूर्णांक होंगी, और गणना पूर्णांक परिणाम उत्पन्न करेगी।

नियम और स्कोरिंग

  • कार्यक्रम को लंबाई में 128 वर्णों तक इनपुट को स्वीकार करना चाहिए - यदि आपकी भाषा / प्लेटफ़ॉर्म में कम से कम अधिकतम इनपुट लंबाई है, तो यह एक स्वीकार्य बहाना है।
  • मानक खामियों को मना किया जाता है।
  • विजेता कोड 18 नवंबर को चुना जाएगा (इस पोस्ट की तारीख से 4 सप्ताह)।
  • ऐसे पोस्ट-कोड को बेझिझक समझें जो गोल्फ-योग्य नहीं माना जाएगा। यह मस्ती के बारे में है। यदि आपके पास ऐसा करने का एक दिलचस्प तरीका है, लेकिन इसे स्वयं (या अपनी विधि की प्रकृति से) गोल्फ नहीं कर सकते, तो आप इसे वैसे भी पोस्ट कर सकते हैं।

हमेशा की तरह, जीतने वाला कोड कम से कम बाइट्स के साथ होता है, जिसमें कुछ मनोरंजन-मूल्य बोनस होते हैं:

  • -5 प्रदान की गई अभिव्यक्ति में पात्रों के किसी भी उपयोग से बचने के लिए: + , - , ( , ) , ^ , * , /
  • -5 की गणना के लिए मानक कंप्यूटर पर गणना करने के लिए 5 मिनट से अधिक (लेकिन 10 मिनट से अधिक नहीं) लगता है, बिना विधि स्पष्ट होने के बिना (घड़ी या अनावश्यक लूप का उपयोग करके); उद्देश्य नए अधिपतियों को यह विश्वास दिलाना है कि आप कयामत की उनकी गणना को बाधित करने की कोशिश नहीं कर रहे हैं।
  • - (5 + N) एक प्रत्यक्ष आपत्तिजनक संदेश (लंबाई N के लिए, जिसमें प्रमुख / अनुगामी व्हाट्सएप शामिल नहीं है) 2560 के सदस्यों के बारे में आपके कोड के भीतर सादे दृष्टि से लिखे जाने के बारे में, कुछ हास्यास्पद स्पष्टीकरण के साथ कि क्यों इसकी आवश्यकता है। वहाँ। यदि इसे हटा दिया जाता है, तो कोड को सही ढंग से काम नहीं करना चाहिए । हां, मनोरंजन मूल्य के लिए मुफ्त अंक।

उदाहरण और स्पष्टीकरण

[program] 2 - 2 - 2
2

2 - (2 - 2) = 2

[program] (2 + 2 * 3 + 3) / 3 + 3
4

(४ * ६) / (३ + ३) = ४

[program] 3 + 2 + 1 ^ 3
216

(३ + २ + १) ^ ३ = २१६

[program] -5^2
25

(-5) ^ 2 = 25

[program] 32 / 8 * 3 - 1
2

32 / (8 * (3 - 1)) = 32/16 = 2


1 - 3 + 4 = 1 - 7? दाएं से बाएं इतना सुझाव होगा, लेकिन यह घटाव के आगे, PSADME के ​​विपरीत है, नहीं?
LLLAMnYP

1
@ LLlAMnYP जोड़ और घटाव PEMDAS की तरह ही "समूह" में होते हैं, इसलिए वे दाएं से बाएं होते हैं। गुणा / भाग से समान। यह अधिक पसंद है P(SA)(DM)E
ज्योबिट्स

2
कथन का अर्थ दाएं-से-बाएँ संसाधित होना नहीं है - बल्कि, समान पूर्वता के संचालन का मूल्यांकन पहले-पहले किया जाता है। तो 4/2 = 2, 2-1 = 1, लेकिन सामान्य से (ए / बी) * सी के बजाय एक / बी सी = ए / (बी सी)। मै उम्मीद करता हू कि यह बातें अब साफ है।
जेक

संभवतः ऐसा करने का सबसे आसान तरीका एक फ्लेक्स / बाइसन या लेक्स / याक व्याकरण लिखना है।

5
आपको PADME को संक्षिप्त नाम बदलना चाहिए , क्योंकि इस तरह के एक दुष्ट संगठन के सदस्य निश्चित रूप से मूल से अधिक नए स्टार वार्स त्रयी पसंद करेंगे। यह याद रखना भी आसान है।
mbomb007

जवाबों:


9

हास्केल, 134 बाइट्स

import qualified Prelude as P
infixl 6 ^
(^)=(P.^)
infixr 8 + 
(+)=(P.+)
infixr 8 - 
(-)=(P.-)
infixr 7 /
(/)=P.div
infixr 7 *
(*)=(P.*)

नए सुधारों और प्राथमिकताओं के साथ गणित ऑपरेटरों को पुनर्परिभाषित करना। अभी:

*Main> 32 / 8 * 3 - 1
2

1
वाह। बस वाह। क्या यह किसी अन्य भाषा में भी संभव है? +1
ETHproductions

मुझे काफी यकीन था, यह गणितज्ञ, या कम से कम एक समान दृष्टिकोण में संभव था, लेकिन जल्दी से एहसास हुआ, मुझे इसे बनाने के लिए ज्ञान की कमी है।
LLLAMnYP

1
मैं इस बात के लिए काफी नया हूं कि इस मंच पर आमतौर पर निम्नलिखित सुझाव स्वीकार्य हैं या नहीं। यह पूरी तरह से आपके कोड पर आधारित है, लेकिन एक बैश स्क्रिप्ट है जो पर्ल का उपयोग हास्केल फ़ाइल को जेनरेट करने के लिए करती है और इसे जीएचसीआई को पास करती है। ऐसा करके, मैं एक WHOLE BYTE को सहेजता हूं। perl -e'$_="import qualified Prelude as Pl 6^r 8+r 8-r 7*r 7/";s/(. \d(.))/\ninfix\1\n(\2)=(P.\2)/g;s~\./~.div~;print'>a.hs;ghci a.hs दुर्भाग्य से, एक टाइपो ने उत्पन्न कोड को अंक और प्रतीक के बीच जगह की कमी है, लेकिन अभी भी ठीक चलता है। इसका मतलब है कि आपका कोड 5 बाइट्स खो सकता है, और मेरे 'सुधार' को हरा सकता है।
जेक

@JArkinstall इसकी कीमत क्या है, इसके लिए मेरा उत्तर sedशेल कोड को जेनरेट करने और मूल्यांकन करने के लिए प्रभावी रूप से उपयोग होता है। शायद एक अच्छा मेटा सवाल।
डिजिटल ट्रॉमा

यह सच है, और मैं वास्तव में आपके दृष्टिकोण को पसंद करता हूं - हालांकि, किसी भाषा में एक फ़ाइल उत्पन्न करने के लिए एक उपकरण (पर्ल या सेड) का उपयोग करना, जो तब दूसरी भाषा में पढ़ा जाता है, एक कदम आगे लगता है। यदि किसी अन्य जनरेटर के माध्यम से उपरोक्त कोड का उत्पादन करने का एक तरीका मौजूद है, तो मुझे बहुत आश्चर्य नहीं होगा (हालांकि विधि मेरे लिए स्पष्ट नहीं है!), और हम खुद को पार्स-सीमेंटेशन में पाएंगे। यदि यह स्वीकार्य है, तो कोई भी आपके कोड पर इस दृष्टिकोण को लागू कर सकता है (और कुछ उदाहरण मैंने इस बोर्ड में कुछ चुनौतियों के लिए अधिक पठनीय-भाषा के उत्तर में देखे हैं)।
जेक

2

GNU sed -r निष्पादन के विस्तार के साथ, 398

s@ *\^ *@ ** @
:
s@\((-?[0-9]+)\)@\1@
t
s@(-?[0-9]+ - )+(-?[0-9]+ - -?[0-9]+)@\1(\2)@
t
s@(.*(^| |\())(-?[0-9]+ [-+] -?[0-9]+)(.*)@echo '\1'$((\3))'\4'@e
t
s@(-?[0-9]+ / )+(-?[0-9]+ / -?[0-9]+)@\1(\2)@
t
s@(.*(^| |\())(-?[0-9]+ [*/] -?[0-9]+)(.*)@echo '\1'$((\3))'\4'@e
t
s@(-?[0-9]+ \*\* )+(-?[0-9]+ \*\* -?[0-9]+)@\1(\2)@
t
s@(.*(^| |\())(-?[0-9]+ \*\* -?[0-9]+)(.*)@bash -c 'echo \1$[\3]\4'@e
t

विशेष रूप से कम नहीं, लेकिन काम हो जाता है।

पूर्ववर्ती को बाहर करने के लिए sed ठीक है, लेकिन अंकगणित नहीं करता है। इसलिए हम sशेल के लिए आवश्यक अंकगणित को आउटसोर्स करने के लिए आदेश में GNU sed निष्पादन एक्सटेंशन का उपयोग करते हैं ।

अभी के लिए सभी ऑपरेटरों को लगता है, अपवाद के साथ ^सामने और पीछे एक बिल्कुल जगह है।

परीक्षण उत्पादन:

$ cat psadme.txt 
2 - 2 - 2
(2 + 2 * 3 + 3) / 3 + 3
3 + 2 + 1 ^ 3
-5^2
32 / 8 * 3 - 1
$ sed -rf psadme.sed psadme.txt 
2
4
216
25
2
$ 

बढ़िया प्रोफाइल फोटो। xD
ओलिवर नी

1

जावास्क्रिप्ट (ईएस 6) 287 300

बग को संपादित करें (बस एक टाइपो, 6 को 4 होना चाहिए था) - स्निपेट के अंत में एक पूर्ण विवरण जोड़ा गया

संपादित करें 2 एक और चुनौती पर काम कर कुछ सुधार पाया

अभी तक केवल कुछ न्यूनतम अंतर के साथ एक ही पार्सर का एक और पोर्टिंग। (इससे तुलना करें )

f=(x,W=[],Q=['('],z=1,h=p=>'+-*/^^))('.indexOf(p)>>1,C=n=>{for(;h(q=Q.pop())<h(n);W.push(q=='^'?Math.pow(a,b):eval(`a${q}b`)))a=W.pop(b=W.pop());z&&Q.push(q,n)})=>((x+')').replace(/\d+|\S/g,t=>t>'('?t>'('?~h(t)?z&&t=='-'?z=-z:C(t,z=1):(W.push(z*t),z=0):C(t,z=0):(Q.push(t),z=1)),W.pop())

// More readable
U=(x,W=[],Q=['('],z=1,
  h=p=>'+-*/^^))('.indexOf(p)>>1,
  C=n=>{
    for(;h(q=Q.pop())<h(n);
        W.push(q=='^'?Math.pow(a,b):eval(`a${q}b`)))
      a=W.pop(b=W.pop());
    z&&Q.push(q,n)
  }
)=>(
  (x+')')
  .replace(/\d+|\S/g,t=> 
       t>'('
       ?t>'('
       ?~h(t)
       ?z&&t=='-'?z=-z:C(t,z=1)
       :(W.push(z*t),z=0)
       :C(t,z=0)
       :(Q.push(t),z=1)
  ),
  W.pop()
)

// TEST
console.log=(...x)=>O.innerHTML+=x.join` `+'\n'

console.log(f('1 - 3 + 4')) // -6
console.log(f('2-2-2')) // 2
console.log(f('(2 + 2 * 3 + 3) / 3 + 3')) // 4
console.log(f('3 + 2 + 1 ^ 3')) // 216
console.log(f('-5^2')) // 25
console.log(f('32 / 8 * 3 - 1')) // 2

// Explained
X=(x,W=[],Q=['('],z=1,
  h=p=> // operator priority '+-:1, */:3, ^:5, ):7, (:9. If an operand then -1
     '+-*/^^))('.indexOf(p)>>1,
  C=n=>{ // Evaluate operators present on stack if they have upper priority, then push new operator on stack
    //console.log('Operand '+n)
    while( h(q = Q.pop()) < h(n) ) // pop operator from op stack and compare priority with current
    {
      // Pop operands from stack and push result
      b = W.pop();
      a = W.pop();
      r = q=='^' ? Math.pow(a,b) : eval('a'+q+'b')
      // console.log('Evaluate '+a+q+b+'='+r)
      W.push(r);
    }
    // if z == 0 do nothing, because the current operands are '(' and ')' that must be discarded
    // else Push again the last operator popped and the current one
    z && Q.push(q, n) // 
  }
)=>(
  (x+')')
  .replace(/[\d.]+|\S/g,t=> {
    //console.log('Q:'+Q,'W:'+W,'T:'+t,'U:'+h(t),'Z:'+z), // display status
    if (t == '(') 
    { // open parenthesis
      z = 1
      Q.push(t) // push a operator, its the highest priority
    }
    else if (t == ')')
    { //close parenthesis
      z = 0
      C(t) 
    }
    else if (h(t) < 0)
    { // operand
      W.push(z*t) // push operand with right sign
      z = 0 // set z to 0 to mark that we just pushed an operand, so next '-' (if present) is a binary operator 
    }
    else
    { // operator
      if (z && t=='-') // the minus is an unary operator (the only unary operator allowed is '-', '+' will not work)
        z =-z // change the sign
      else
        z = 1, // no unary minus
        C(t)
    }    
  }),
  W.pop() // return the value at top of operand stack
)
<pre id=O></pre>

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.