প্রদত্ত নম্বর এবং গাণিতিক অপারেটরগুলির একটি তালিকা ব্যবহার করে একটি সংখ্যা তৈরি করুন


11

আপনাকে সংখ্যার একটি তালিকা L = [17, 5, 9, 17, 59, 14], অপারেটরগুলির একটি ব্যাগ O = {+:7, -:3, *:5, /:1}এবং একটি নম্বর দেওয়া হবে N = 569

কার্য

একটি সমীকরণ আউটপুট Lকরুন যা বাম-হাতের সমস্ত সংখ্যা Nএবং ডানদিকে কেবলমাত্র নম্বর ব্যবহার করে। যদি এটি সম্ভব না হয় তবে আউটপুট মিথ্যা। উদাহরণ সমাধান:

59*(17-5)-9*17+14 = 569

সীমাবদ্ধতা এবং স্পষ্টকরণ

  • আপনি সংখ্যার সাথে মিল রাখতে পারবেন না ( [13,37]হিসাবে ব্যবহৃত হতে পারে না 1337)
  • কেবল প্রাকৃতিক সংখ্যা এবং শূন্য উপস্থিত হবে L
  • অর্ডারটি Lকোনও ব্যাপার নয়।
  • আপনাকে অবশ্যই সমস্ত নম্বর ব্যবহার করতে হবে L
  • শুধু অপারেটার +, -, *, /উপস্থিত হবে O
  • Oআপনার প্রয়োজনের তুলনায় আরও বেশি অপারেটর থাকতে পারে তবে কমপক্ষে |L|-1অপারেটর থাকতে পারে
  • আপনি প্রতিটি অপারেটরটিকে মান পর্যন্ত কতবার ব্যবহার করতে পারেন O
  • চারটি অপারেশন Oহ'ল মানক গাণিতিক ক্রিয়াকলাপ; বিশেষত, /সঠিক ভগ্নাংশ সহ সাধারণ বিভাগ।

পয়েন্ট

  • কম পয়েন্ট, ভাল
  • আপনার কোডের প্রতিটি অক্ষর আপনাকে একটি পয়েন্ট দেয়

আপনাকে এমন একটি গলিত সংস্করণ সরবরাহ করতে হবে যা পড়তে সহজ।

পটভূমি

একটি অনুরূপ প্রশ্ন স্ট্যাক ওভারফ্লো উপর অনুরোধ করা হয়েছে। আমি ভেবেছিলাম এটি একটি আকর্ষণীয় কোড-গল্ফ চ্যালেঞ্জ হতে পারে।

গণনীয় জটিলতা

পিটার টেলর মন্তব্যগুলিতে যেমন বলেছিলেন, আপনি এটির সাথে সাবসেটের পরিমাণটি সমাধান করতে পারেন :

  1. আপনার কাছে উপসেটের যোগফলের উদাহরণ রয়েছে (অতএব পূর্ণসংখ্যার একটি সেট এস এবং একটি সংখ্যা x)
  2. এল: = এস + [0, ..., 0] (| এস | শূন্যের বার), এন: = এক্স, ও: = {+: | এস | -1, *: | এস | - 1, /: 0, -: 0}
  3. এখন আমার সমস্যার এই উদাহরণটি সমাধান করুন
  4. উপসেটের যোগফলের সমাধান হ'ল এস এর সংখ্যা যা শূন্যের সাথে গুণিত হয় না।

যদি আপনি কোনও অ্যালগরিদম খুঁজে পান যা ও (2 ^ n) এর চেয়ে ভাল, তবে আপনি প্রমাণ করেছেন যে পি = এনপি। যেহেতু পি বনাম এনপি হ'ল মিলেনিয়াম প্রাইজ সমস্যা এবং সুতরাং এটির জন্য এক হাজার মার্কিন ডলার মূল্যমান, কারও পক্ষে এর সমাধান পাওয়া খুব কমই। তাই আমি র‌্যাঙ্কিংয়ের এই অংশটি সরিয়েছি।

পরীক্ষার মামলা

নিম্নলিখিত কেবলমাত্র বৈধ উত্তর নয়, অন্যান্য সমাধান বিদ্যমান এবং এর অনুমতি রয়েছে:

  • ( [17,5,9,17,59,14], {+:7, -:3, *:5, /:1}, 569)
    => 59 * (17-5)- 9 * 17 + 14 = 569
  • ( [2,2], {'+':3, '-':3, '*':3, '/':3}, 1)
    => 2/2 = 1
  • ( [2,3,5,7,10,0,0,0,0,0,0,0], {'+':20, '-':20, '*':20, '/':20}, 16)
    => 5+10-2*3+7+0+0+0+0+0+0+0 = 16
  • ( [2,3,5,7,10,0,0,0,0,0,0,0], {'+':20, '-':20, '*':20, '/':20}, 15)
    => 5+10+0*(2+3+7)+0+0+0+0+0+0 = 15

হয় m = |L|? যদি হ্যাঁ, আপনি কীভাবে রানটাইমটি সেই তালিকার আকারের উপর নির্ভর করতে পারবেন না? উদাহরণস্বরূপ [2,2],[+,+,...,+,/],1,। আসলে, যেহেতু n হ'ল হ'ল (এম), আপনি কেবল এটি এম এর ক্ষেত্রে লিখতে পারেন।
বুথবি

3
এটি কোন ধরণের গাণিতিকটি ব্যবহার করুন - সঠিক ভগ্নাংশ, পূর্ণসংখ্যা ( /div), কেবলমাত্র ভাসমান-বিন্দু এবং আশার জন্য কোনও বৃত্তাকার-ত্রুটি নেই ...?
জবাবদিহি করা বন্ধ করে দিয়েছে

4
গণনাগত জটিলতার জন্য জটিল স্কোরিং বিধি কেন? সাবসেট-যোগ থেকে একটি সহজ হ্রাস আছে, সুতরাং ও (2 ^ n) এর চেয়ে ভাল কিছু মিলিয়ন মিলিয়ন ডলার।
পিটার টেলর


1
তৃতীয় পরীক্ষার মামলাটি মিথ্যা নয় ...5+10+2*3+7*0+0...
শ্মিদ্দি

উত্তর:


3

পাইথন ২.7 / 478 অক্ষর

L=[17,5,9,17,59,14]
O={'+':7,'-':3,'*':5,'/':1}
N=569
P=eval("{'+l+y,'-l-y,'*l*y,'/l/y}".replace('l',"':lambda x,y:x"))
def S(R,T):
 if len(T)>1:
  c,d=y=T.pop();a,b=x=T.pop()
  for o in O:
   if O[o]>0 and(o!='/'or y[0]):
    T+=[(P[o](a, c),'('+b+o+d+')')];O[o]-=1
    if S(R,T):return 1
    O[o]+=1;T.pop()
  T+=[x,y]
 elif not R:
  v,r=T[0]
  if v==N:print r
  return v==N
 for x in R[:]:
  R.remove(x);T+=[x]
  if S(R,T):return 1
  T.pop();R+=[x]
S([(x,`x`)for x in L],[])

মূল ধারণাটি অনুসন্ধানের জন্য একটি এক্সপ্রেশনের পোস্টফিক্স ফর্ম ব্যবহার করা। উদাহরণস্বরূপ, 2*(3+4)পোস্টফিক্স ফর্ম হবে 234+*। সুতরাং সমস্যাটি আংশিকভাবে L+ এর Oক্রিয়াকলাপ সন্ধান করে যা এর সাথে বিভক্ত N

নিম্নলিখিত সংস্করণটি অদম্য সংস্করণ। স্ট্যাকের stkমতো দেখাচ্ছে [(5, '5'), (2, '5-3', (10, ((4+2)+(2*(4/2))))]

L = [17, 5, 9, 17, 59, 14]
O = {'+':7, '-':3, '*':5, '/':1} 
N = 569

P = {'+':lambda x,y:x+y,
     '-':lambda x,y:x-y,
     '*':lambda x,y:x*y,
     '/':lambda x,y:x/y}

def postfix_search(rest, stk):
    if len(stk) >= 2:
        y = (v2, r2) = stk.pop()
        x = (v1, r1) = stk.pop()
        for opr in O:
            if O[opr] > 0 and not (opr == '/' and v2 == 0):
                stk += [(P[opr](v1, v2), '('+r1+opr+r2+')')]
                O[opr] -= 1
                if postfix_search(rest, stk): return 1
                O[opr] += 1
                stk.pop()
        stk += [x, y]
    elif not rest:
        v, r = stk[0]
        if v == N: print(r)
        return v == N
    for x in list(rest):
        rest.remove(x)
        stk += [x]
        if postfix_search(rest, stk):
            return True
        stk.pop()
        rest += [x]
postfix_search(list(zip(L, map(str, L))), [])

1
বাহ, এটি আমার প্রত্যাশার চেয়ে কম। আমি একটি অ্যালগরিদম স্ক্রিবল করেছি যার মধ্যে একটি রূপান্তর পোস্টফিক্স অন্তর্ভুক্ত ছিল <=> ইনফিক্স, তবে আমার স্ক্রিবল আপনার প্রয়োগের চেয়ে খুব কম ছিল না। মুগ্ধ। এবং নির্মাণের জন্য ধন্যবাদ P[opr](v1, v2)। আমি কখনই ল্যাম্বডাস এবং অভিধানের সংমিশ্রণের বিষয়টি ভাবিনি, যদিও এটি এখন সুস্পষ্ট বলে মনে হয়।
মার্টিন থোমা

আমি আমার 4 র্থ টেস্টকেস দিয়ে আপনার সমাধানটি পরীক্ষা করার চেষ্টা করেছি। 2 ঘন্টা পরে, আমি মৃত্যুদন্ড কার্যকর করেছিলাম।
মার্টিন থোমা

@ মুজ আমি এটিকে আরও দ্রুততর করার জন্য কিছু ধর্মীয় যুক্ত করার চেষ্টা করব তবে এর পরে কোডের দৈর্ঘ্য দ্বিগুণ হতে পারে।
রায়

আমি এখানে যেভাবে ভগ্নাংশ ব্যবহার করেছি তা আপনার উত্তরের কোনও সমস্যার সমাধান করে। আমি প্রদত্ত লিঙ্কটিতে প্রদত্ত উদাহরণের জন্য এটি চেষ্টা করুন। আপনার বর্তমান কোডটি কোনও উত্তর খুঁজে পায় না, তবে আপনি যখন ভগ্নাংশ ব্যবহার করেন তখন তা হয়।
মার্টিন থোমা
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.