একটি অভিব্যক্তি প্যারেন্টেসাইজ করুন


20

সাম্প্রতিককালে আমি একটি নতুন ভাষা লিখছি , ক্রিয়াকলাপের ক্রম পরিচালনা করার প্রয়োজন এড়াতে , আমি এটিকে পুরোপুরি এড়াতে কেবল প্রতিটি অভিব্যক্তিকে যথাযথভাবে প্রথম বন্ধনীরূপে আছি।

বন্ধনীগুলি 40-41 চর-কোডে থাকায় আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত হওয়া দরকার।


উদাহরণ

1+2*3
(1+(2*3))

2*(3+4)
(2*(3+4))

2*3/4+3
(((2*3)/4)+3)

342*32/8
((342*32)/8)

বিধি

আপনার কেবলমাত্র অপারেশনগুলি পরিচালনা করতে হবে: *(গুণ), /(বিভাগ), +(সংযোজন) এবং -(বিয়োগ)।

  • অপারেশন ক্রম হল:
    • প্রথম বন্ধনী
    • গুণ, বিভাগ
    • অ্যাডিশন, বিয়োগ
  • আপনার বাম-ডান দিকে যেতে পছন্দ করা উচিত
  • ইনপুট নম্বরগুলি সর্বদা ইতিবাচক পূর্ণসংখ্যার হবে (বোনাসগুলি দেখুন)

বোনাসেস

-20% যদি আপনি অবহেলা পরিচালনা করেন:

3+-5
(3+(-5))

-5% যদি আপনি ইনপুটটির ভিতরে ফাঁকা স্থান রাখার অনুমতি দেন:

3  + 4
(3+4)

-10% যদি আপনি ইনপুটটিতে দশমিকগুলি পরিচালনা করতে পারেন:

1+.12
(1+.12)
1+0.21/3
(1+(0.21/3))

500 খয়রাত: যদি তোমরা কোন উত্তর লিখতে পরিচালনা নামবিহীন / ব্লক


25
"যে কারণে চারিত্রিক কোডগুলিতে 40-41 তে প্রথম বন্ধনী রয়েছে, আপনার কোডটি যতটা সম্ভব সংক্ষিপ্ত হওয়া দরকার" " ঠিক আছে, এখন আপনি খালি হাস্যকর হয়ে উঠছেন। ; পি
ETH প্রোডাকশনগুলি

3
এবং এটি উপসর্গের চেয়ে সহজ (পোলিশ) স্বরলিপি কারণ?
wizzwizz4

3
সম্ভাব্য সদৃশ
flawr

8
@ ফ্লোয়ার আমি এটি দেখেছি কিন্তু এটি যে একেবারে পৃথক different প্রশ্নটি আপনাকে কোনও অভিব্যক্তিটির প্রথম বন্ধনীরূপে আউটপুট দেয় তা সত্য। এখানে আপনাকে ক্রিয়াকলাপগুলির অ্যাকাউন্টের
ক্রমটি

3
গুরুত্বপূর্ণ পরীক্ষার কেস: 1+2+3+4(যা নির্দিষ্ট সমাধান হিসাবে প্রথম বন্ধনী হতে পারে ((1+2)+(3+4)))
মার্টিন ইন্ডার

উত্তর:


2

পাইথন, 153 * 0.9 = 137.7 বাইট

def p(e):
 for o in"+-*/":
    for i,c in enumerate(e):
        if(c==o)*(0==sum([(d=="(")-(d==")")for d in e[:i]])):return"("+p(e[:i])+o+p(e[i+1:])+")"
 return e

এই প্রোগ্রামটি দশমিক ইনপুট পরিচালনা করে।

দ্বিতীয় লাইনটি একটি স্পেস দিয়ে শুরু হয়, দ্বিতীয়টি একটি ট্যাব দিয়ে শুরু হয়, তৃতীয়টি দুটি ট্যাব এবং তৃতীয়টি একটি স্পেস দিয়ে শুরু হয়। এটি একটি বাইট সংরক্ষণ করে। এখানে একটি হেক্সডাম্প ( xxdপিপি):

0000000: 6465 6620 7028 6529 3a0a 2066 6f72 206f  def p(e):. for o
0000010: 2069 6e22 2b2d 2a2f 223a 0a09 666f 7220   in"+-*/":..for 
0000020: 692c 6320 696e 2065 6e75 6d65 7261 7465  i,c in enumerate
0000030: 2865 293a 0a09 0969 6628 633d 3d6f 292a  (e):...if(c==o)*
0000040: 2830 3d3d 7375 6d28 5b28 643d 3d22 2822  (0==sum([(d=="("
0000050: 292d 2864 3d3d 2229 2229 666f 7220 6420  )-(d==")")for d 
0000060: 696e 2065 5b3a 695d 5d29 293a 7265 7475  in e[:i]])):retu
0000070: 726e 2228 222b 7028 655b 3a69 5d29 2b6f  rn"("+p(e[:i])+o
0000080: 2b70 2865 5b69 2b31 3a5d 292b 2229 220a  +p(e[i+1:])+")".
0000090: 2072 6574 7572 6e20 650a                  return e.

আমি পরীক্ষার জন্য যে প্রোগ্রামটি ব্যবহার করেছি তা এখানে: (উপরে প্রোগ্রামটি সংরক্ষণ করুন paren.py)

import paren

cases = {
        "2+3*4": "(2+(3*4))", 
        "(2+3)*4": "((2+3)*4)", 
        "1+2+3+4": "(1+(2+(3+4)))", 
        "3/2+5": "((3/2)+5)", 
        "1+2-3": "(1+(2-3))", 
        "2-1+2": "((2-1)+2)",
        "3+-5": "(3+(-5))",
        "1+.12": "(1+.12)",
        "1+0.21/3": "(1+(0.21/3))",
}


for num, case in enumerate(cases):
    print "\n\n\033[1m\033[38;5;14mCase #%d: %s" % (num + 1, case)
    result = paren.p(case)
    print "\033[38;5;4mParenthesize returned: %s" % (result)
    solution = cases[case]
    if result == solution:
        print "\033[38;5;76mCorrect!"
    else:
        print "\033[38;5;9mNot correct!"

আপনার টার্মিনালটি \033[38;5;<COL>mরঙের জন্য এস্কেপ কোডটি ব্যবহার করে তা নিশ্চিত করুন ।


* একটি স্থান দিয়ে চতুর্থ?
Element118

1
এই প্রোগ্রাম না prefer to go left-right। ওপিতে পরীক্ষার কেস 3 চেষ্টা করে দেখুন, আপনার ফলাফলটি সঠিক নয়। এটি পূর্ণসংখ্যার ((2*(3/4))+3)(((2*3)/4)+3)
গাণিতিকের

1
@ user12365 ব্যবহার করছেন না পূর্ণসংখ্যা (C অথবা C ++ উদাহরণস্বরূপ) গাণিতিক 3/4 == 0, তাই ((2 * (3/4)) + 3) 3 , যখন (((2 * 3) / 4) + 3) হ'ল 4
edc65

3

জাভাস্ক্রিপ্ট (ES6) 179 (263 -20% -5% -10%)

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

অন্য দুটি উত্তর বর্তমানে উভয়ই ভুল বলে আমি পোস্ট করব এটি এখানে এবং এখানে এবং অন্য কোথাও ব্যবহার করা এক্সপ্রেশন পার্সারের একটি প্রকরণ । আরও বিস্তারিত অ্যালগরিদম ব্যাখ্যা জন্য সেখানে দেখুন।

এটি বেশ বিশাল তবে এটি কাজ করা উচিত।

পরীক্ষার স্নিপেট

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

// More readable
x=(x,W=[],Q=['('],z=1,w=v='',
  h=p=>'*/+-))('.indexOf(p)|1,
  C=n=>{
    for(;h(q=Q.pop())<=h(n);)W[0]=`(${W[1]+q+W.shift()})`;
    z&&Q.push(q,n)
  }
)=>(
  (x+')')
  .replace(/[\d.]+|\S/g,t=> 
       t>'('    
       ?t>')'
       ?~h(t)
       ?z
       ?(w+='('+t,v+=')')
       :C(t,z=1)
       :W=[w+t+v,...W,z=w=v=''] // overfill W to save 2 chars ()
       :C(t,z=0)
       :z=Q.push(t)
  ),
  W[0]
)

console.log=(...x)=>O.textContent+=x.join` `+'\n'

// TEST
;[
  ['1+2*3','(1+(2*3))'],['2*(3+4)','(2*(3+4))'],['2*3/4+3','(((2*3)/4)+3)'],['342*32/8','((342*32)/8)'],
  ['3+-5','(3+(-5))'],['-3+-4*7','((-3)+((-4)*7))'], // bonus 20%
  ['3  + 4','(3+4)'], // bonus 5%
  ['1+.12','(1+.12)'],['1+0.21/3','(1+(0.21/3))'] // bonus 10%
].forEach(t=>{var k=t[1],i=t[0],r=f(i); console.log(i+' : '+r+(r==k? ' OK':' Fail expecting '+k))})
<pre id=O></pre>


1

পাইথন, 241 * 0.8 * 0.95 * 0.9 = 164.84 টি অক্ষর

আমি অ্যাস্ট (অ্যাবস্ট্রাক্ট সিনট্যাক্স ট্রি) লাইব্রেরি এবং একটি হোমব্রিউ স্ট্রিং প্রতিস্থাপন ডেক ব্যবহার করছি। স্ট্রিং প্রতিস্থাপনের জন্য অনেক খরচ হয় তবে বোনাস স্কোরটি কিছুটা কম রাখতে সহায়তা করে। হতে পারে (স্ট্রিং প্রতিস্থাপন অংশ) আরও গল্ফ করা যেতে পারে।

নোট করুন যে এই সমাধানটি প্রতিটি সংখ্যার চারপাশে একটি অতিরিক্ত বন্ধনী যুক্ত করেছে, তবে আমি মনে করি এটি প্রশ্নের উদ্ভবের মধ্যে রয়েছে

import ast;def p(e):
 r,s={"Module([":"",")])":"","Expr(":"","BinOp":"","Num":"",", Add(), ":"+",", Sub(), ":"-",", Div(), ":"/",", Mult(), ":"*"},ast.dump(ast.parse(e),annotate_fields=False)
 for f,t in r.iteritems():s=s.replace(f,t)
 return s

পরীক্ষা স্যুট:

cases = {
    "2+3*4", 
    "(2+3)*4", 
    "1+2+3+4", 
    "3/2+5", 
    "1+2-3", 
    "2-1+2",
    "3+-5",
    "1+.12",
    "1+0.21/3"
}

for num,case in enumerate(cases):
    result = p(case)
    print "Case {}: {:<16} evaluates to: {}".format(num+1,case,result)

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

Case 1: 3+-5             evaluates to: ((3)+(-5))
Case 2: 3/2+5            evaluates to: (((3)/(2))+(5))
Case 3: 2+3*4            evaluates to: ((2)+((3)*(4)))
Case 4: 1+2+3+4          evaluates to: ((((1)+(2))+(3))+(4))
Case 5: 1+0.21/3         evaluates to: ((1)+((0.21)/(3)))
Case 6: (2+3)*4          evaluates to: (((2)+(3))*(4))
Case 7: 2-1+2            evaluates to: (((2)-(1))+(2))
Case 8: 1+.12            evaluates to: ((1)+(0.12))
Case 9: 1+2-3            evaluates to: (((1)+(2))-(3))

import astআপনার কোড অনুপস্থিত
9.11 এডিসি 65

এবং এটি শতাংশ বোনাসের কম্যান্ড করার সঠিক উপায় নয়। যদি আপনি ৫০% ছাড় পান এবং তার উপরে অন্য ৫০% এর উপরে, আপনার 0 প্রদান করা হচ্ছে না। আপনার স্কোর 157.32 হওয়া উচিত (আমদানি লাইন যুক্ত করার পরে আরও কিছু)। এটি একটি ভাল স্কোর - আপনি যদি ঠিক করে
ফেলেন

ভাল যুক্তি. আমদানি যুক্ত করা হয়েছে। 241 টি অক্ষর এখন। যদিও বোনাস গণনা করবেন তা নিশ্চিত নন। যদি আমি সঠিকভাবে আপনার মন্তব্য, ক্রমে বোনাস বিষয় বিয়োগ করা হয় ... বুঝতে
agtoever

বোনাসটি বিয়োগ করা হয়নি (এটি একটি গুণ) এবং অর্ডারটি কোনও ব্যাপার নয়। 241 * (1-20%) * (1-5%) * (1-10%) => 241 * 0.8 * 0.95 * 0.9 => 164.84
edc65

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