অর্ডার অপারেশন


13

ভূমিকা

শৈশবে একটি পয়েন্ট আসে যখন আপনি ভাবেন যে আপনি যোগ এবং গুণে দক্ষতা অর্জন করেছেন, তখন কেউ এসে আপনাকে জানিয়ে দেয় যে:

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

এবং এটি এত সহজ বা লিনিয়ার প্রক্রিয়া ছিল না যতটা আপনাকে আগে শেখানো হয়েছিল। আপনি শিখলেন যে ক্রমের ক্রম নামে কিছু আছে । এটি বন্ধুত্বের কিছু না পেয়ে কিছুটা ধারাবাহিকতা এবং মত প্রকাশের একটি অত্যন্ত গুরুত্বপূর্ণ উপায়।

জেনেরিক কাহিনী

একদিন, আপনি রাস্তায় আতঙ্কের শব্দে জেগে উঠলেন। " দ্য 2560 " নামে একটি উগ্রপন্থী গোষ্ঠী ("অর্গানাইজেশন অ্যাগেইন্টস অফ অর্ডার অফ অপারেশনস" এর শর্ট ফর ডর্কি হেক্স-ইশ টুইস্ট সহ) তাদের খারাপ পদ্ধতিগুলি বিশ্বের সমস্ত পারমাণবিক অস্ত্রের নিয়ন্ত্রণ নিতে ব্যবহার করেছে। তারা পুরো গ্রহকে জিম্মি করে রেখেছে, এবং তাদের একটি সহজ চাহিদা রয়েছে: পরিচালিত ক্রিয়াকলাপটিকে স্বীকার করুন বা নির্মূলকরণের মুখোমুখি করুন (বন্ধনী তাদের অগ্রাধিকার বজায় রাখতে হবে)। নতুন সিস্টেমে PSADME (বন্ধনী, বিয়োগ / সংযোজন, বিভাগ / গুণ), এবং এক্সপ্রেশন ডান থেকে বাম মূল্যায়ন বলা হয়:

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

দিন কেটে গেছে, এবং স্থানান্তর চলছে in গণিতবিদ এবং পদার্থবিজ্ঞানীরা সকলেই তাদের সমীকরণ পুনর্লিখনে ব্যস্ত রয়েছেন, কম্পিউটার বিজ্ঞানীরা ফ্যাশন পরিবর্তনের কাজটির মুখোমুখি হলেন যেখানে কম্পিউটার দ্বারা গাণিতিক অভিব্যক্তি ব্যাখ্যা করা হয়েছে। আপনি একটি গোপন বিদ্রোহী প্রোগ্রামিং গোষ্ঠীর অন্তর্ভুক্ত যার লক্ষ্য নতুন গ্লোবাল ওভারলর্ডদের জন্য যতটা যন্ত্রণা সৃষ্টি করা - এবং সম্ভবত, আপনাকে এলোমেলোভাবে দ্য 2560 দ্বারা নির্বাচিত করা হয়েছে এবং বেঞ্চমার্ক গণনা কর্মসূচী তৈরির দায়িত্ব দেওয়া হয়েছে।

আপনার মিশন

13+4=17=6.

সরলতার জন্য, প্রদত্ত সমস্ত সংখ্যা পূর্ণসংখ্যার হবে এবং গণনাগুলি পূর্ণসংখ্যার ফলাফল তৈরি করবে।

বিধি এবং স্কোরিং

  • প্রোগ্রামটির দৈর্ঘ্য পর্যন্ত 128 টি অক্ষর পর্যন্ত ইনপুট গ্রহণ করা উচিত - যদি আপনার ভাষা / প্ল্যাটফর্মের সর্বাধিক ইনপুট দৈর্ঘ্য কম থাকে তবে এটি গ্রহণযোগ্য অজুহাত।
  • স্ট্যান্ডার্ড লুফোলগুলি নিষিদ্ধ।
  • বিজয়ী কোডটি 18 নভেম্বর (এই পোস্টের তারিখ থেকে 4 সপ্তাহ) বেছে নেওয়া হবে।
  • গল্ফ-যোগ্য বিবেচিত হবে না এমন পোস্ট পোস্ট করতে নির্দ্বিধায়। এই মজা সম্পর্কে। যদি আপনার এটি করার একটি আকর্ষণীয় উপায় থাকে তবে এটি নিজেই গল্ফ করতে না পারেন (বা আপনার পদ্ধতির প্রকৃতি অনুসারে) আপনি যেভাবে পোস্ট করতে পারেন।

যথারীতি উইনডিং কোডটি হ'ল বিনোদনের সাথে কিছু বিনোদন-মূল্য বোনাস সহ ন্যূনতম সংখ্যক বাইট সহ:

  • প্রদত্ত অভিব্যক্তিতে অক্ষরের কোনও ব্যবহার এড়ানোর জন্য -5 : + , - , ( , ) , ^ , * , /
  • -5 উপার্জন গণনার একটি প্রমিত কম্পিউটারে নিরূপণ করা চেয়ে বেশি 5 মিনিট করে (কিন্তু কোন আরো তুলনায় 10 থেকে মিনিট) গ্রহণ পদ্ধতি সুস্পষ্ট হচ্ছে (ঘড়ি বা অপ্রয়োজনীয় লুপ ব্যবহার করে) ছাড়া জন্য; লক্ষ্যটি হ'ল নতুন ওভারলর্ডদের বোঝানো যে আপনি তাদের ডুমের গণনা ব্যাহত করার চেষ্টা করছেন না ।
  • - (5 + এন) সরাসরি আপত্তিকর বার্তার জন্য (দৈর্ঘ্যের এন এর দৈর্ঘ্যের এন, শীর্ষস্থানীয় / পিছনের শ্বেত স্পেস সহ নয়) 2550 এর সদস্যদের সম্পর্কে আপনার কোডের মধ্যে সরল দৃষ্টিতে লিখতে হবে, কেন এটি হওয়া দরকার তা সম্পর্কে কিছু হাস্যকর ব্যাখ্যা সহ আছে। যদি মুছে ফেলা হবে, কোড না সঠিক ভাবে কাজ। হ্যাঁ, বিনোদন মূল্যের জন্য বিনামূল্যে পয়েন্ট।

উদাহরণ এবং ব্যাখ্যা

[program] 2 - 2 - 2
2

2 - (2 - 2) = 2

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

(4 * 6) / (3 + 3) = 4

[program] 3 + 2 + 1 ^ 3
216

(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
@ এলএলএএমএনওয়াইওয়াইপি সংযোজন এবং বিয়োগগুলি একইভাবে "গ্রুপ" এ রয়েছে ঠিক যেমন পেমডাসের মতো, সুতরাং সেগুলি ডান থেকে বামে ঘটে। গুণ / বিভাজন একই। এটা আরও পছন্দ P(SA)(DM)E
Geobits

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
ETH প্রোডাকশনগুলি

আমি নিশ্চিত ছিলাম, ম্যাথমেটিকায় এটি সম্ভব ছিল, বা কমপক্ষে একটি অনুরূপ পন্থা ছিল, তবে দ্রুত উপলব্ধি হয়েছিল, এটি করার জ্ঞানের আমার অভাব রয়েছে।
LLlAMnYP

1
নিম্নলিখিত পরামর্শটি এই ফোরামে সাধারণত গ্রহণযোগ্য কিনা তা সম্পর্কে আমি নিশ্চিত না হওয়ার জন্য আমি এখানে যথেষ্ট নতুন। এটি সম্পূর্ণরূপে আপনার কোডের উপর ভিত্তি করে তৈরি হয়েছে তবে এটি একটি বাশ স্ক্রিপ্ট যা পার্ককে হাস্কেল ফাইল উত্পন্ন করতে এবং এটি জিএইচসিআই-তে প্রেরণে ব্যবহার করে। এটি করার মাধ্যমে, আমি একটি সম্পূর্ণ বাইটি সংরক্ষণ করি। 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 বাইট হারাতে পারে এবং আমার 'উন্নতি' মারধর করে।
জেক

@ জেআরকিনস্টল এর মূল্য কী, তার জন্য আমার উত্তরটি কার্যকরভাবে sedশেল কোড উত্পন্ন এবং মূল্যায়ন করতে ব্যবহার করছে। সম্ভবত একটি ভাল মেটা প্রশ্ন।
ডিজিটাল ট্রমা

এটি সত্য, এবং আমি সত্যিই আপনার পদ্ধতির পছন্দ করি - তবে কোনও ভাষায় একটি ফাইল তৈরি করার জন্য একটি সরঞ্জাম (পারল বা সেড) ব্যবহার করে যা অন্য ভাষায় পড়া হয় তার আরও একধাপ এগিয়ে মনে হয়। অন্য জেনারেটরের মাধ্যমে উপরের কোডটি উত্পাদন করার কোনও উপায় উপস্থিত থাকলে আমি অত্যধিক অবাক হব না (যদিও পদ্ধতিটি আমার কাছে সুস্পষ্ট নয়), এবং আমরা নিজেকে পার্স-সিপিশনে আবিষ্কার করব। যদি এটি অনুমোদিত হয় তবে কেউ আপনার কোডে এই পদ্ধতির প্রয়োগ করতে পারে (এবং এই বোর্ডে কিছু চ্যালেঞ্জের জন্য আরও পঠনযোগ্য ভাষাগুলির উত্তরগুলিতে আমি কয়েকটি উদাহরণ দেখেছি)।
জেক

2

GNU সেড -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

বিশেষত সংক্ষিপ্ত নয়, তবে কাজটি সম্পন্ন হয়।

সেড অগ্রাধিকারটি পার্স করার জন্য ঠিক আছে তবে গাণিতিকটি করে না। সুতরাং আমরা sশেলটিতে প্রয়োজনীয় গাণিতিককে আউটসোর্স করতে কমান্ডটিতে GNU sed exec এক্সটেনশন ব্যবহার করি ।

^সামনের ও পিছনে ঠিক এক স্থান বাদে আপাতত সমস্ত অপারেটরকে ধরে নিই ।

পরীক্ষার আউটপুট:

$ 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
$ 

সুন্দর প্রোফাইল ছবি. এক্সডি
অলিভার নি

1

জাভাস্ক্রিপ্ট (ES6) 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>

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.