অপ্রয়োজনীয় প্রথম বন্ধনী সরান


32

আপনাকে অক্ষরগুলির সমন্বয়ে একটি স্ট্রিং দেওয়া হবে 0123456789+*()। আপনি ধরে নিতে পারেন যে স্ট্রিং সর্বদা একটি বৈধ গাণিতিক এক্সপ্রেশন।

আপনার কাজটি অপ্রয়োজনীয় বন্ধনীগুলি অপসারণ করা, ধরে নেওয়া গুণকে সংখ্যার চেয়ে বেশি অগ্রাধিকার রয়েছে।

যখন প্রথম কাঠামোগত কাঠামোগত প্রয়োজন না হয় কেবল তখনই তা বন্ধ করা উচিত :

  • কারণ গুণনের কারণে উচ্চ অগ্রাধিকার: 3+(4*5)=>3+4*5
  • কারণ গুণ বা সংযোজন সহায়তার কারণে: 3*(4*5)=>3*4*5
  • যখন তারা একটি অভিব্যক্তি: 3*((4+5))=> এর চারপাশে অপ্রয়োজনীয়3*(4+5)

নির্দিষ্ট সংখ্যার মানগুলির কারণে যখন প্যারেন্থিসগুলি সরল করা যায় তখন তাদের রাখা উচিত :

  • 1*(2+3) সরল করা উচিত নয় 1*2+3
  • 0*(1+0) সরল করা উচিত নয় 0*1+0

উদাহরণ:

(4*12)+11         ==>    4*12+11
(1+2)*3           ==>    (1+2)*3
3*(4*5)           ==>    3*4*5
((((523))))       ==>    523
(1+1)             ==>    1+1
1*(2*(3+4)*5)*6   ==>    1*2*(3+4)*5*6
1*(2+3)           ==>    1*(2+3)
0*(1+0)           ==>    0*(1+0)


(((2+92+82)*46*70*(24*62)+(94+25))+6)    ==>    (2+92+82)*46*70*24*62+94+25+6

1
আরও টেস্টকেস দয়া করে?
ফাঁস নুন

2
1*(2*(3+4)*5)*6একটি আকর্ষণীয় টেস্টকেস হওয়া উচিত (যা আমার সমাধানটি বর্তমানে ব্যর্থ হয়)।
ফাঁস নুন

8
"অপ্রয়োজনীয়" কাঠামোগত বা প্রতি কেস ভিত্তিতে সংজ্ঞায়িত করা হয়? অন্য কথায়, এখানে প্রথম বন্ধনীগুলি কি অপ্রয়োজনীয়? (2+2)*1
লুইস মেন্ডো

2
@ লুইস মেন্ডো আমি মনে করি এটি যে কোনও উপায়ে ব্যাখ্যা করা
ন্যায়সঙ্গত

2
@ অ্যান্টোলিগ আমি মনে করি না যে এটি ন্যায্য হবে, কারণ এই দুজনের জন্য পন্থাটি খুব আলাদা হবে। আমরা কিছু স্পষ্টতা পেলে ভাল হবে।
Sp3000

উত্তর:


15

গণিত, 105 97 91 বাইট

-6 বাইট ধন্যবাদ রোমানকে !

a=StringReplace;ToString@ToExpression@a[#,{"*"->"**","+"->"~~"}]~a~{" ** "->"*","~~"->"+"}&

যথাক্রমে ( ) এবং ( ) প্রতিস্থাপন করে +এবং এর *সাথে মূল্যায়ন করে, স্ট্রাইফাইজ করে এবং অপারেটরদের পিছনে প্রতিস্থাপন করে।~~StringExpression**NonCommutativeMultiply


কি? গণিতের কোনও বিল্ট-ইন নেই?
এরিক দ্য আউটগল্ফার

@ এরিক্থে গল্ফার এটি মূলত করে; আমি এটি অপারেটরদের মূল্যায়ন না করার চেষ্টা করছি ।
LegionMammal978

এই কারণেই ম্যাথমেটিকাকে এত বিজ্ঞাপন দেওয়া এবং এত ব্যয়বহুল ... আমার মনে হয় বিল্ট-ইনগুলির কারণে। তবে, ধাঁধাটি যথেষ্ট শক্ত থাকলে ম্যাথমেটিকা ​​অন্য ভাষার তুলনায় কোনও পরিবর্তন করতে পারেনি, তবুও "অন্যান্য ভাষাগুলি" এখানে মোটেও প্রতিযোগিতা করে না।
এরিক আউটগল্ফার

এরStringExpression পরিবর্তে 91 টি বাইট ব্যবহার করে Dotএবং " "->""ধারাটি সরিয়ে :a=StringReplace;ToString@ToExpression@a[#,{"*"->"**","+"->"~~"}]~a~{" ** "->"*","~~"->"+"}&
রোমান

@ রোমান ধন্যবাদ! দেখে মনে হচ্ছে আপনি আর একটি ভাল মিশ্রণাত্মক অ-পরিবহিত অবমূল্যায়নকারী অপারেটর পেয়েছেন যা সংখ্যার সাথে একত্রিত হয় না।
লিজিয়নম্যামাল 978

7

জাভাস্ক্রিপ্ট (ES6) 163 178

15 বাইট সম্পাদনা করুন thx @ ইসমাইলমিগুয়েল

a=>eval(`s=[]${_=';for(b=0;a!=b;a=b.replace(/'}\\(([^()]*)\\)(?=(.?))/,(x,y,z,p)=>~y.indexOf('+')?-s.push(b[p-1]=='*'|z=='*'?x:y):y))b=a;${_}-\\d+/,x=>s[~x]))b=a`)

কম গল্ফড

a=>{
  for(s=[],b='';
      a!=b;
      a=b.replace(/\(([^()]*)\)(?=(.?))/,(x,y,z,p)=>y.indexOf('+')<0?y:-s.push(b[p-1]=='*'|z=='*'?x:y)))
    b=a;
  for(b=0;
      a!=b;
      a=b.replace(/-\d+/,x=>s[~x]))
    b=a;
  return a
}

পরীক্ষা

f=a=>eval(`s=[]${_=';for(b=0;a!=b;a=b.replace(/'}\\(([^()]*)\\)(?=(.?))/,(x,y,z,p)=>~y.indexOf('+')
?-s.push(b[p-1]=='*'|z=='*'?x:y)
:y))b=a;${_}-\\d+/,x=>s[~x]))b=a`)

console.log=x=>O.textContent+=x+'\n'

test=`(4*12)+11         ==>    4*12+11
(1+2)*3           ==>    (1+2)*3
3*(4*5)           ==>    3*4*5
((((523))))       ==>    523
(1+1)             ==>    1+1
1*(2*(3+4)*5)*6   ==>    1*2*(3+4)*5*6
1*(2+3)           ==>    1*(2+3)
0*(1+0)           ==>    0*(1+0)
(((2+92+82)*46*70*(24*62)+(94+25))+6)    ==>    (2+92+82)*46*70*24*62+94+25+6`

test.split`\n`.forEach(r=>{
  var t,k,x
  [t,,k]=r.match(/\S+/g)
  x=f(t)
  console.log((x==k?'OK ':'KO ')+t+' -> '+x+(x==k?'':' expected '+k))
})
<pre id=O></pre>


কেন আপনি লিখেছেন হয়নি y.indexOf('+')পরিবর্তে y.indexOf`+`[...]? ([...] ফরম্যাটিংটি ট্রিপিং এড়াতে যোগ করা হয়েছে) এটি কি এভাবেই বাড়ছে?
ইসমাইল মিগুয়েল

1
আপনি এখানে যান 170 বাইট:a=>eval(`for(b=s=[]${_=';a!=b;a=b.replace(/'}\\(([^()]*)\\)(?=(.?))/,(x,y,z,p)=>~y.indexOf('+')<0?-s.push(b[p-1]=='*'|z=='*'?x:y):y))b=a;for(b=0${_}-\\d+/,x=>s[~x]))b=a`)
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল যে সত্যই চালাক, ধন্যবাদ! পাঠ শিখেছে: যখন
ওভাল

আমি আপনার কোড হ্রাস করার জন্য আমার সহজ সমাধানটি পছন্দ করেছি বলে আমি আনন্দিত। আমি সম্পর্কে কিছু করতে পারতাম for(b=, =='*'এবং অন্যান্য পুনরাবৃত্তি বিট। এছাড়াও, ~y.indexOf('+')<0একই হিসাবে না ~y.indexOf('+')? যেহেতু indexOf()মিথ্যা মানকে মূল্যায়ণ করে এমন একমাত্র মান হ'ল -1, <0মনে হয় অপ্রয়োজনীয়। অথবা, যদি আমার এটি ভুল হয়ে যায়, আপনি করতে পারেনy.indexOf('+')>1
ইসমাইল মিগুয়েল

@ ইসমাইল মিগুয়েল 1: হ্যাঁ, <0এটি বর্ণা .্য সংস্করণ থেকে ক্রেপগুলি বাকী রয়েছে এবং এটি সরানো উচিত। 2: আবার চিন্তা করে, forপুনরাবৃত্তি অংশে অন্তর্ভুক্ত করার জন্য সংশোধন করা যেতে পারে। আবার ধন্যবাদ
edc65

5

পাইথন 350 পিইজি বাস্তবায়ন , 271 বাইট

import peg
e=lambda o,m=0:o.choice and str(o)or(m and o[1][1]and"("+e(o[1])+")"or e(o[1]))if hasattr(o,"choice")else o[1]and e(o[0],1)+"".join(str(x[0])+e(x[1],1)for x in o[1])or e(o[0])
print(e(peg.compile_grammar('e=f("+"f)*f=p("*"p)*p="("e")"/[0-9]+').parse(input())))

কিছুক্ষণ আগে পাইথনে পিইজি বাস্তবায়ন করেছি । আমার ধারণা আমি এখানে এটি ব্যবহার করতে পারি।

অভিব্যক্তিটিকে গাছে পার্স করে এবং কেবলমাত্র যদি সংযোজন হয় তবে সন্তানের সংযোজন হয় এবং পিতামাতার গুণ হয়।


4

পার্ল, 132 বাইট

-pপতাকা জন্য 129 বাইট উত্স :

#!perl -p
0while s!\(([^\(\)]+)\)!$f{++$i}=$1,"_$i"!e;s!_$i!($v=$f{$i})=~/[+]/&&($l.$r)=~/[*]/?"($v)":$v!e
while($l,$i,$r)=/(.?)_(\d+)(.?)/

ব্যবহার:

echo "1*(2*(3+4)*5)*6" | perl script.pl

4

রুবি, 140 130 বাইট

-pপতাকা জন্য 127 বাইট উত্স :

t={}
r=?%
0while$_.gsub!(/\(([^()]+)\)/){t[r+=r]=$1;r}
0while$_.gsub!(/%+/){|m|(s=t[m])[?+]&&($'[0]==?*||$`[/\*$/])??(+s+?):s}

এবং অবরুদ্ধ:

tokens = Hash.new
key = '%'

# convert tokens to token keys in the original string, innermost first
0 while $_.gsub!(/\(([^()]+)\)/) { # find the innermost parenthetical
  key += key # make a unique key for this token
  tokens[key] = $1
  key # replace the parenthetical with the token key in the original string
}

# uncomment to see what's going on here
# require 'pp'
# pp $_
# pp tokens

# convert token keys back to tokens, outermost first
0 while $_.gsub!(/%+/) {|key|
  str = tokens[key]
  if str['+'] and ($'[0]=='*' or $`[/\*$/]) # test if token needs parens
    '(' + str + ')'
  else
    str
  end
}
# -p flag implicity prints $_

খুব সুন্দর উত্তর। 0 whileসিনট্যাক্স নিয়ে কী হচ্ছে ?
জোনা

1
@ জোনাহ ইন রুবি, expr while condসমান while cond; expr; end। এখানে, আমি কেবল condবারবার সঞ্চালন করতে চাই এবং আসলে লুপ বডি নেই। সাধারণত কেউ এটি লিখতে পারে while cond; endবা সম্ভবত loop{ break unless cond }তবে 0 while condকম বাইট হয়। 0কিছু করতে না; এটি ঠিক সেখানে কারণ লুপটির সংক্ষিপ্ত রূপটির জন্য একটি শরীর প্রয়োজন।
এজাস্ট

2

রেটিনা, 155 বাইট

{`\(((\d+|\((((\()|(?<-5>\))|[^()])*(?(5)^))\))(\*(\d+|\((((\()|(?<-10>\))|[^()])*(?(10)^))\)))*)\)
$1
(?<!\*)\((((\()|(?<-3>\))|[^()])*(?(3)^))\)(?!\*)
$1

এটি অনলাইন চেষ্টা করুন!

একবারে সমস্ত টেস্টকেস যাচাই করুন।

ব্যাখ্যা

মূল জিনিসটি এই কোড:

(((\()|(?<-3>\))|[^()])*(?(3)^)

এই রেজেক্সটি এমন কোনও স্ট্রিংয়ের সাথে মেলে যাতে বন্ধনীগুলি ভারসাম্যযুক্ত, যেমন 1+(2+(3))+4বা 2+3

স্বাচ্ছন্দ্যের জন্য, এই রেজেক্সটি হতে দিন B

এছাড়াও, আমাদের ব্যবহার দিন <এবং >পরিবর্তে বন্ধনী, সেইসাথে জন্য pএবং mজন্য \+এবং \*

কোডটি হয়ে যায়:

{`<((\d+|<B>)(m(\d+|<B>))*)>
$1
(?<!m)<B>(?!m)
$1

প্রথম দুটি লাইন বন্ধনীগুলির সাথে মেলে যা কেবলমাত্র গুণ, যেমন (1*2*3)বা এমনকি সমেত (1*(2+3)*4)। তারা তাদের সামগ্রী ভিতরে প্রতিস্থাপিত হয়।

শেষ দুটি লাইন বন্ধনীগুলির সাথে মেলে যা পূর্বে নয় এবং যা গুণ দ্বারা অনুসরণ করা হয় না। তারা তাদের সামগ্রী ভিতরে প্রতিস্থাপিত হয়।

প্রাথমিক {`অর্থ "প্রতিস্থাপন না হওয়া অবধি প্রতিস্থাপন করুন", যার অর্থ প্রতিস্থাপনগুলি সম্পন্ন করা হয় যতক্ষণ না তারা আর মেলে না বা তাদের নিজের সাথে প্রতিস্থাপন করা হয়।

এই ক্ষেত্রে, প্রতিস্থাপনগুলি শেষ না হওয়া অবধি সম্পন্ন করা হবে।


ব্যর্থ 1*(2*(3+4)*5)*6
orlp

@ অরলপ ধন্যবাদ, স্থির।
Leaky নুন

ব্যর্থ(1*(2+3)+4)*5
Sp3000

@ Sp3000 ধন্যবাদ, স্থির।
Leaky নুন

2

পাইথন 3, 274 269 359 337 336 বাইট

এই পদ্ধতিটি মূলত প্রতিটি সম্ভাব্য জুড়ি বন্ধনীগুলি সরিয়ে দেয় এবং এটি এখনও একইটির মূল্যায়ন করে কিনা তা পরীক্ষা করে।

from re import *
def f(x):
    *n,=sub('\D','',x);x=sub('\d','9',x);v,i,r,l=eval(x),0,lambda d,a,s:d.replace(s,"?",a).replace(s,"",1).replace("?",s),lambda:len(findall('\(',x))
    while i<l():
        j=0
        while j<l():
            h=r(r(x,i,"("),j,")")
            try:
                if eval(h)==v:i=j=-1;x=h;break
            except:0
            j+=1
        i+=1
    return sub('9','%s',x)%tuple(n)

পরীক্ষার জোতা

print(f("(4*12)+11")=="4*12+11")
print(f("(1+2)*3") =="(1+2)*3")
print(f("3*(4*5)")=="3*4*5")
print(f("((((523))))")=="523")
print(f("(1+1)")=="1+1")
print(f("1*(2*(3+4)*5)*6")=="1*2*(3+4)*5*6")
print(f("(((2+92+82)*46*70*(24*62)+(94+25))+6)")=="(2+92+82)*46*70*24*62+94+25+6")
print(f("1*(2+3)")=="1*(2+3)")
print(f("0*(1+0)")=="0*(1+0)")

আপডেট

  • -1 [16-10-04] অতিরিক্ত স্থান সরানো হয়েছে
  • -22 [16-05-07] reলিব ব্যবহার করে
  • +90 [16-05-07] নতুন পরীক্ষার কেসগুলি পরিচালনা করতে আপডেট হয়েছে
  • -5 [16-05-07] দৈর্ঘ্য ( l) ল্যাম্বদা থেকে প্যারামিটার সরানো হয়েছে

1
এটি পরীক্ষার ক্ষেত্রে ব্যর্থ হয় 1*(2+3), কারণ ওপ বিশেষ নম্বর ক্ষেত্রে সহজতর করতে বলেনি। ভাল উত্তর যদিও; এই আমার upvote আছে।
হাইপারনিউটারিনো

1
@AlexL। এটি ধরার জন্য ধন্যবাদ! আমি আমার পরীক্ষার কেসগুলি আপডেট করি না ডি: তবে এটি এখন ঠিক হয়ে গেছে।
ননলাইনারফ্রুট

1

পিএইচপি, 358 বাইট

function a($a){static$c=[];$d=count($c);while($g=strpos($a,')',$g)){$f=$a;$e=0;for($j=$g;$j;--$j){switch($a[$j]){case')':++$e;break;case'(':--$e;if(!$e)break 2;}}$f[$g++]=$f[$j]=' ';if(eval("return $f;")==eval("return $a;"))$c[str_replace(' ', '', $f)]=1;}if(count($c)>$d){foreach($c as$k=>$v){a($k);}}return$c;}$t=a($argv[1]);krsort($t);echo key($t);

একটি চিত্তাকর্ষক দৈর্ঘ্য নয়, এটি সর্বোত্তম পদ্ধতির চেয়ে কম গ্রহণের জন্য (এবং সর্বোত্তম ভাষার চেয়ে কম ব্যবহার করার জন্য) আমি পেয়েছি।

এক জোড়া বন্ধনী স্ট্রিপস বের করে, তারপরে ফলাফলটি প্রকাশ করে। ফলাফলটি যদি মূলের সাথে একই হয় তবে এটি এটিকে বৈধ এক্সপ্রেশনগুলির মানচিত্রে যুক্ত করে এবং কোনও নতুন এক্সপ্রেশন না পাওয়া পর্যন্ত পুনরাবৃত্তি করে। তারপরে স্বল্পতম বৈধ এক্সপ্রেশনটি মুদ্রণ করে।

বিরতি যখন অভিব্যক্তির ফলাফলটি বড় হয়ে যায় এবং ডাবল / এক্সপোনেন্ট স্বরলিপিটি প্রদর্শিত হয়।


1

প্রোলোগ (এসডাব্লুআই) , 122 118 বাইট

T+S:-term_string(T,S).
I/O:-X+I,X-Y,Y+O.
E-O:-E=A+(B+C),A+B+C-O;E=A*(B*C),A*B*C-O;E=..[P,A,B],A-X,B-Y,O=..[P,X,Y];E=O.

এটি অনলাইন চেষ্টা করুন!

একটি প্রাকটিকে সংজ্ঞায়িত করে //2যা তার প্রথম যুক্তির স্ট্রিং মান থেকে প্রথম বন্ধনী সরিয়ে দেয় এবং তার দ্বিতীয় যুক্তির মাধ্যমে একটি স্ট্রিং আউটপুট দেয় uts যদি ইনপুট প্রোলোগ পদে হতে পারে তবে এটি কেবল 81 77 77 বাইটের +/2সাথে ক্রিয়াপোষের সাথে ডিল না করেই সংজ্ঞা দিচ্ছিল term_string/2, তবে প্রচুর অপ্রয়োজনীয় বন্ধনীগুলি কেবল সেভাবে শুরু করার অস্তিত্বই থাকত না কারণ এটি প্রতারণার খুব কাছেই ছিল since সব+/2 করে তা হ'ল হ'ল সংযুক্তি ia

আমি ব্যবহার করার চেষ্টা করেছি =../2 এটির সকলের করেছি, তবে এটি অনেক বেশি সময় ধরে বেরিয়ে এসেছিল, কারণ তালিকাগুলি নিয়ে কাজ করা একটি থ্রি-বাইট অপারেটর হুবহু সংশ্লেষিত নয়:

প্রোলোগ (এসডাব্লুআই) , 124 বাইট

T+S:-term_string(T,S).
I/O:-X+I,X-Y,Y+O.
X-Y:-X=..[O,A,B],(B=..[O,C,D],E=..[O,A,C],F=..[O,E,D],F-Y;A-C,B-D,Y=..[O,C,D]);X=Y.

এটি অনলাইন চেষ্টা করুন!

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