ন্যূনতম ম্যাচস্টিক দিয়ে গণিত তৈরি করুন


15

মেটা-পটভূমি

এটি পাজলিংয়ের উপর একটি প্রশ্ন হিসাবে সেট করা হয়েছিল এবং তাত্ক্ষণিক প্রতিক্রিয়াটি ছিল "ভাল, কেউ কেবল কম্পিউটারের মাধ্যমে এটি সমাধান করবে"। এটি সমাধানের জন্য একটি প্রোগ্রাম কতটা জটিল হতে হবে তা নিয়ে বিতর্ক ছিল। ঠিক আছে, "এই প্রোগ্রামটি কতটা জটিল হতে হবে" সংজ্ঞা হিসাবে প্রায় , তাই সম্ভবত পিপিসিজি বিষয়টি নিষ্পত্তি করতে পারে?

পটভূমি

একটি ম্যাচস্টিক সমীকরণ মূলত একটি সাধারণ গাণিতিক সমীকরণ, তবে যেখানে অঙ্কগুলি এবং অপারেটরগুলি টেবিলে ম্যাচস্টিক রেখে শারীরিকভাবে নির্মিত হয়। (এখানে ম্যাচস্টিকগুলির মূল প্রাসঙ্গিক বৈশিষ্ট্যটি হ'ল এগুলি মোটামুটি অনমনীয় এবং ধ্রুব দৈর্ঘ্য রয়েছে; কখনও কখনও লোকেরা পরিবর্তে অন্যান্য বস্তু যেমন সুতির সোয়াব ব্যবহার করেন))

এই চ্যালেঞ্জের জন্য, ম্যাচস্টিকগুলি কীভাবে সাজানো হয় তার জন্য আমাদের নির্দিষ্ট বিধিগুলি সংজ্ঞায়িত করার দরকার নেই (লিঙ্কযুক্ত চ্যালেঞ্জের মতো); পরিবর্তে, আমরা কেবলমাত্র একটি নির্দিষ্ট সংখ্যার মূল্যায়ন করে এমন একটি এক্সপ্রেশন উপস্থাপন করতে আমাদের কতটি ম্যাচস্টিকের প্রয়োজন তা যত্নশীল।

কাজটি

অঙ্কগুলি এবং গাণিতিক অপারেটরগুলির বর্ণমালা এখানে আপনি ব্যবহার করতে পারেন, প্রত্যেকটির ম্যাচস্টিকের জন্য ব্যয় রয়েছে:

  • 0, 6 ম্যাচস্টিকের দাম
  • 1, 2 ম্যাচস্টিকের দাম
  • 2, 5 ম্যাচস্টিকের দাম
  • 3, 5 ম্যাচস্টিকের দাম
  • 44 টি ম্যাচস্টিকের দাম
  • 5, 5 ম্যাচস্টিকের দাম
  • 6, 6 ম্যাচস্টিকের দাম
  • 73 টি ম্যাচস্টিকের দাম
  • 87 টি ম্যাচস্টিকের দাম
  • 9, 6 ম্যাচস্টিকের দাম
  • +, 2 ম্যাচস্টিকের দাম
  • -, 1 ম্যাচস্টিকের দাম
  • ×, 2 ম্যাচস্টিকের দাম

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

আপনাকে এমন একটি প্রোগ্রাম লিখতে হবে যা কোনও সংকেত পূর্ণসংখ্যাকে ইনপুট হিসাবে গ্রহণ করে (যে কোনও যুক্তিসঙ্গত মাধ্যমে ), এবং এমন একটি অভিব্যক্তি তৈরি করে যা সেই পূর্ণসংখ্যাকে আউটপুট হিসাবে মূল্যায়ন করে (আবার কোনও যুক্তিসঙ্গত মাধ্যমে)। উপরন্তু, অভিব্যক্তি nontrivial হতে হবে: এটা অন্তত একটি অপারেটর থাকা আবশ্যক +, -বা, ×। পরিশেষে, আপনি যে আউটপুটটি আউটপুট দেন তা হ'ল মোট আউটপুটগুলির মধ্যে মোট ম্যাচস্টিক ব্যয়ের ক্ষেত্রে অবশ্যই সস্তা (বা সস্তার জন্য বাঁধা) হতে হবে যা অন্যথায় নির্দিষ্টকরণের সাথে সম্মতি দেয়।

ব্যাখ্যা

  • আপনি এক সারি একাধিক অঙ্ক আউটপুট করে একাধিক-সংখ্যা সংখ্যা গঠন করতে পারেন (উদাঃ 11-1উত্পাদন করার জন্য একটি বৈধ আউটপুট 10)। পুরোপুরি সুনির্দিষ্টভাবে বলা যায়, ফলস্বরূপ সংখ্যাটি দশমিক অর্থে ব্যাখ্যা করা হয়। এই ধরণের কনটেনটেশন কোনও ক্রিয়াকলাপ নয় যা মধ্যবর্তী ফলাফলগুলিতে কাজ করে; কেবল আসল অঙ্কগুলিতে যা মূল অভিব্যক্তিতে উপস্থিত হয়।
  • এই চ্যালেঞ্জের উদ্দেশ্যে +, -এবং ×ইনফিক্স অপারেটর; তাদের বাম এবং ডানদিকে একটি যুক্তি প্রয়োজন। আপনার এগুলি প্রিফিক্স অবস্থানে +5বা যেমন ব্যবহার করার অনুমতি নেই -8
  • আপনার কাছে প্রথম বন্ধনী (বা অন্য কোনও উপায়ে নিয়ন্ত্রণের উপায়) উপলব্ধ নেই। অভিব্যক্তিটি সাধারণ ডিফল্ট অগ্রাধিকার নিয়ম অনুসারে মূল্যায়ন করে (গুণগুলি প্রথমে ঘটে এবং তারপরে সংযোজন এবং বিয়োগফলগুলি বাম থেকে ডানে মূল্যায়ন করা হয়)।
  • উপরে তালিকাভুক্ত বাদে আপনার গাণিতিক অপারেটর বা ধ্রুবকগুলির অ্যাক্সেস নেই; "পার্শ্বীয় চিন্তাভাবনা" সমাধানগুলি প্রায়শই পাজলিং-এ গৃহীত হয়, তবে কম্পিউটারটি নিজেই এগুলি নিয়ে আসে এবং পিপিসিজিতে এখানে সমাধান সঠিক কিনা বা না তা আমরা উদ্দেশ্যমূলক হতে চাই তা বোঝা যায় না।
  • সাধারণ পূর্ণসংখ্যার ওভারফ্লো নিয়মগুলি প্রয়োগ হয়: আপনার সমাধানটি অবশ্যই আপনার ভাষার একটি অনুমানমূলক (বা সম্ভবত বাস্তব) সংস্করণে নির্বিচারে বৃহত পূর্ণসংখ্যার জন্য কাজ করতে সক্ষম হতে হবে যেখানে সমস্ত সংখ্যক ডিফল্টরূপে সীমাহীন হয়, তবে যদি আপনার প্রোগ্রামটি বাস্তবায়নের কারণে অনুশীলনে ব্যর্থ হয় বৃহত্তর পূর্ণসংখ্যার সমর্থন না করা, এটি সমাধানটিকে অকার্যকর করে না।
  • আপনি যদি একাধিকবার একই অঙ্ক বা অপারেটর ব্যবহার করেন তবে প্রতিবার এটি ব্যবহার করার সময় আপনাকে তার ম্যাচস্টিক ব্যয় দিতে হবে (কারণ স্পষ্টতই, আপনি টেবিলের দুটি পৃথক স্থানে একই শারীরিক ম্যাচস্টিকগুলি পুনরায় ব্যবহার করতে পারবেন না)।
  • সময়সীমা নেই; নিষ্ঠুর শক্তি সমাধান গ্রহণযোগ্য। (যদিও আপনার কাছে যদি এমন সমাধান রয়েছে যা নিষ্ঠুর শক্তির চেয়ে দ্রুততর হয় তবে এটি দীর্ঘতর হলেও পোস্টটি নির্দ্বিধায় মনে করুন; বিকল্প পদ্ধতির তুলনা কীভাবে করা যায় তা সবসময় আকর্ষণীয় seeing)
  • যদিও আপনার কোডটির ব্যাখ্যা লেখার প্রয়োজন নেই , এটি সম্ভবত একটি ভাল ধারণা হতে পারে; সমাধানগুলি প্রায়শই পড়তে খুব কঠিন হয় (বিশেষত এমন লোকদের কাছে যাদের তারা লেখা আছে তাদের সাথে পরিচিত নয়) এবং এটি কীভাবে কাজ করে তা আপনি বুঝতে না পারলে কোনও সমাধানের মূল্যায়ন (এবং এভাবে ভোট দেওয়া) কঠিন হতে পারে।

বিজয় শর্ত

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


জিৎ, আমাদের সর্বোচ্চ সংখ্যাটি পরিচালনা করতে হবে? আমার বর্তমান প্রচেষ্টা টিআইও-তে 20 এর মতো চলবে না।
ম্যাজিক অক্টোপাস আরন

@ কারাসোকম্পিউটিং: তাত্ত্বিকভাবে নির্বিচারে উচ্চ , তবে আপনি যদি অনুশীলনের ক্ষেত্রে উপযুক্ত সময়ের মধ্যে 20 এর বেশি পেতে না পারেন তবে তা সম্পূর্ণ গ্রহণযোগ্য।

4
আপনার কি কোনও পরীক্ষার মামলা আছে?
লুক

আমি সত্যিই চাই এটি একক অপারেশন, একাধিক প্রতিযোগিতার বিরুদ্ধে ছড়িয়ে পড়ে। গুণটি একটি বিভাজনযুক্ত সমস্যা, তবে সংযোজন এবং বিয়োগ যোগ করা সত্যিই জিনিসগুলিকে জটিল করে তোলে। আমার একটি সমাধান রয়েছে যা কার্যকর হয় তবে সংযোজন এবং বিয়োগের জন্য নয়; যে কাজ নিখুঁতভাবে তৈরি করা ক্লান্তিকর হবে।
ম্যাজিক অক্টোপাস উর্ন 20

@ কারাসোকম্পুটিং: আপনি তখন এই চ্যালেঞ্জের প্রতি আগ্রহী হতে পারেন । আমি সন্দেহ করি যে কেবলমাত্র গুণনের সাথে চ্যালেঞ্জটি উল্লেখযোগ্যভাবে পৃথক এবং ভাল স্কোর পাওয়ার জন্য বিভিন্ন সমাধানের কৌশলগুলির প্রয়োজন হবে।

উত্তর:


1

পাইথন 2, 1̶9̶8̶ ̶b̶y̶t̶e̶s̶ 182 বাইট ধন্যবাদ গণিত_জুনকি

def f(n,c=dict(zip('0123456789+-*',map(int,'6255456376212'))),e=[(0,'')]):
 while 1:
    v=(m,s)=min(e);e.remove(v)
    try:
     if eval(s)==n:return s
    except:0
    e+=[(m+c[x],s+x)for x in c]

এই অ্যালগরিদম এর +এবং প্রিফিক্স সংস্করণগুলি বাদ দেওয়ার জন্য কিছুই করে না -তবে সেগুলি তাদের ইনফিক্স অংশগুলির তুলনায় খারাপ হবে, বা সমান এবং পরে অনুসন্ধানে প্রদর্শিত হবে ix কারণ এটি কীওয়ার্ড আর্গুমেন্টকে eপারস্পরিকভাবে ব্যবহার করে , প্রতি সেশনে একাধিকবার ডাকা হলে এটি অবৈধ ফলাফল দেবে will এটি ঠিক করতে, ন্যায়বিচারের f(n, e=[(0,'')])পরিবর্তে ব্যবহার করুন f(n)। নোট করুন যে চার-ব্যবধানযুক্ত ইনডেন্টগুলি ট্যাবগুলি উপস্থাপন করে, সুতরাং এটি কেবল পাইথন 2 এর সাথে কাজ করবে।

আমার কাছে একটি অব্যক্ত ও অনুকূলিত সংস্করণ রয়েছে যা বেশ বড় সংখ্যক জন্য এমনকি দ্রুত চলে:

from heapq import heappop, heappush

def f(n):
    digits = list('0123456789')
    ops =['+','-','*','']
    costs = dict(zip(digits + ops, [6,2,5,5,4,5,6,3,7,6,2,1,2,0]))
    expressions = [(costs[d], abs(n - int(d)), int(d), d) for d in digits[1:]]
    seen = set()
    while 1:
        cost, d, k, expression = heappop(expressions)
        if d == 0:
            return expression
        for op in ops:
            if op in '+-' and k in seen:
                continue
            for digit in digits:
                if op and digit == '0':
                    continue
                expression1 = expression + op + digit
                k1 = eval(expression1)
                d1 = abs(n - k1)
                if d1 == 0:
                    return expression1
                heappush(expressions, (cost+costs[op]+costs[digit], d1, k1, expression1))
        seen.add(k)

কিছু নাবালক গল্ফ প্রস্তাবিত: টিআইও (182 বাইট)
গণিত জাঙ্কি

1

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

অনলাইন সংস্করণ

function m($i){for(;$s<strlen($i);)$e+="6255456376"[$i[$s++]];return$e;}foreach($r=range(0,2*$a=$argv[1])as$v)foreach($r as$w)$x[$v+$w]["$v+$w"]=$x[$v*$w]["$v*$w"]=1+$x[$v-$w]["$v-$w"]=m("$v")+m("$w")+1;echo array_search(min($x[$a]),$x[$a]);

ভাঙ্গন

function m($i){
    for(;$s<strlen($i);)$e+="6255456376"[$i[$s++]];return$e; #return the count of the matchstick for an integer
}

foreach($r=range(0,2*$a=$argv[1])as$v) # limit to an input to 300 in the online version
foreach($r as$w)
       $x[$v+$w]["$v+$w"]=  #fill the 2D array in the form [result][expression] = count matchsticks
       $x[$v*$w]["$v*$w"]=
       1+$x[$v-$w]["$v-$w"]=
       m("$v")+m("$w")+1;
echo $k=array_search(min($x[$a]),$x[$a]); # Output expression with a minium of matchsticks
echo"\t".$x[$a][$k]; #optional Output of the count of the matchsticks

একটু ভাল পারফরম্যান্স সহ উপায়

function m($i){
for(;$s<strlen($i);)
$e+="6255456376"[$i[$s++]];return$e;} #return the count of the matchstick for an integer
foreach($r=range(0,2*$a=$argv[1])as$v)
foreach($r as$w){$c=m("$v")+m("$w")+1;
if($a==$v+$w)$x["$v+$w"]=1+$c; # fill array if value equal input
if($a==$v*$w)$x["$v*$w"]=1+$c;
if($a==$v-$w)$x["$v-$w"]=$c;}
echo $k=array_search(min($x),$x); # Output expression with a minium of matchsticks
    echo"\t".$x[$k]; #optional Output of the count of the matchsticks

Negativeণাত্মক পূর্ণসংখ্যার সমর্থন

Negativeণাত্মক পূর্ণসংখ্যা সহ সংস্করণ

function m($i){
    $e=$i<0?1:0; # raise count for negative integers
    for($s=0;$s<strlen($i);)$e+=[6,2,5,5,4,5,6,3,7,6][$i[$s++]];return$e; #return the count of the matchstick for an integer
}
$q=sqrt(abs($argv[1]));
$l=max(177,$q);
$j=range(-$l,$l); # for second loop for better performance
foreach($r=range(min(0,($a=$argv[1])-177),177+$a)as$v) 
foreach($j as$w){$c=m("$v")+m("$w")+1;  
    if($a==$v+$w)$x["$v+$w"]=1+$c; # fill array if value equal input
    if($a==$v*$w)$x["$v*$w"]=1+$c;
    if($a==$v-$w)$x["$v-$w"]=$c;
    if($a==$w-$v)$x["$w-$v"]=$c; # added for integers <0
}
echo $k=array_search(min($x),$x); # Output expression with a minium of matchsticks
echo"\t".$x[$k]; #optional Output of the count of the matchsticks

ওহ স্ন্যাপ, এটি নেতিবাচক সংখ্যায়ও কাজ করে!
ম্যাজিক অক্টোপাস উর্ন

@ কারাসোকম্পুটিং আসলেই এমনটি হতে পারে না যে কম ম্যাচস্টিকের সাথে কোনও সমাধানের উপস্থিতি ঘটেছে কারণ নেতিবাচক সংখ্যাগুলি কেবল বিয়োগ দ্বারা যুক্ত করা হয়েছে। এই ক্ষেত্রে আপনারও চূড়ান্ত মানটি পরীক্ষা করা উচিত এবং একটি যুক্ত করা উচিত
Jörg Hülsermann

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

1
@ আইস 523 হয়েছে 333 2 * ইনপুট দ্বারা প্রতিস্থাপন করা হয়েছে
জার্গ হালসারম্যান

1
আপনি স্ট্রিংগুলি সূচক করতে পারেন: $e+="6255456376"[$i[$s++]];
manatwork
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.