कम से कम माचिस की तीली से गणित करें


15

मेटा पृष्ठभूमि

यह Puzzling पर एक प्रश्न के रूप में सेट किया गया था , और त्वरित प्रतिक्रिया "ठीक है, कोई व्यक्ति बस कंप्यूटर द्वारा हल करेगा"। इस बारे में बहस चल रही थी कि इसे हल करने का कार्यक्रम कितना जटिल होगा। खैर, "यह कार्यक्रम कितना जटिल है" की परिभाषा बहुत सुंदर है , इसलिए शायद पीपीसीजी इस मुद्दे को सुलझा सकता है?

पृष्ठभूमि

एक matchstick समीकरण मूल रूप से एक सामान्य गणितीय समीकरण है, लेकिन जहां अंक और ऑपरेटरों एक मेज पर माचिस की तीलियों रखकर शारीरिक रूप से निर्माण कर रहे हैं। (यहां मैचस्टिक्स की मुख्य प्रासंगिक विशेषता यह है कि वे काफी कठोर हैं और लगातार लंबाई है; कभी-कभी लोग इसके बजाय अन्य वस्तुओं का उपयोग करते हैं, जैसे कपास झाड़ू।)

इस चुनौती के लिए, हमें इस बात के लिए विशिष्ट नियमों को परिभाषित करने की आवश्यकता नहीं है कि माचिस की तीली की व्यवस्था कैसे की जाती है (जैसे कि कड़ी चुनौती होती है); इसके बजाय, हम सिर्फ इस बात की परवाह करते हैं कि किसी मैच संख्या का मूल्यांकन करने वाली अभिव्यक्ति का प्रतिनिधित्व करने के लिए हमें कितने मैचस्टिक्स की आवश्यकता होगी।

काम

यहां अंक और गणितीय संचालकों की एक वर्णमाला है जिसका आप उपयोग कर सकते हैं, प्रत्येक का मिलान में एक लागत है:

  • 0, 6 माचिस की लागत
  • 1, 2 माचिस की लागत
  • 2, 5 माचिस की लागत
  • 3, 5 माचिस की लागत
  • 4, 4 माचिस की लागत
  • 5, 5 माचिस की लागत
  • 6, 6 माचिस की लागत
  • 7, 3 माचिस की लागत
  • 8, 7 माचिस की लागत
  • 9, 6 माचिस की लागत
  • +, 2 माचिस की लागत
  • -, 1 माचिस की लागत
  • ×, 2 माचिस की लागत

(आप गैर-ASCII वर्णों का उपयोग करने की आवश्यकता से बचने के लिए अपने कार्यक्रम के आउटपुट के ×रूप *में प्रतिनिधित्व कर सकते हैं । अधिकांश एन्कोडिंग्स में ×से अधिक बाइट्स लेता है *, और इसलिए मुझे लगता है कि अधिकांश कार्यक्रम इस लाभ का लाभ उठाना चाहते हैं। ।)

आपको एक प्रोग्राम लिखना होगा जो एक नॉनवेजेटिव पूर्णांक को इनपुट के रूप में लेता है (किसी भी उचित माध्यम से ), और एक अभिव्यक्ति का उत्पादन करता है जो आउटपुट के रूप में मूल्यांकन करता है (फिर किसी भी उचित माध्यम से)। साथ ही, अभिव्यक्ति nontrivial होना चाहिए: यह कम से कम एक ऑपरेटर शामिल होना चाहिए +, -या, ×। अंत में, आपके द्वारा आउटपुट की गई अभिव्यक्ति उन सभी आउटपुटों के बीच कुल मैचस्टिक लागत के मामले में सबसे सस्ती (या सबसे सस्ती के लिए बंधी हुई) होनी चाहिए, अन्यथा विनिर्देश के अनुसार।

स्पष्टीकरण

  • आप कई अंकों को एक पंक्ति में कई अंकों के आउटपुट के माध्यम से बना सकते हैं (जैसे 11-1उत्पादन के लिए एक वैध आउटपुट 10)। बस पूरी तरह से सटीक होने के लिए, परिणामी संख्या दशमलव में व्याख्या की जाती है। इस तरह का संघटन एक ऑपरेशन नहीं है जो मध्यवर्ती परिणामों पर काम करता है; केवल शाब्दिक अंकों पर जो मूल अभिव्यक्ति में दिखाई देते हैं।
  • इस चुनौती के उद्देश्य के लिए। +, -और ×infix ऑपरेटर्स हैं; उन्हें अपने बाएं और अपने दाईं ओर एक तर्क की आवश्यकता है। आपको उन्हें उपसर्ग स्थिति में उपयोग करने की अनुमति नहीं है, जैसे +5या -8
  • आपके पास कोष्ठक (या पूर्वता को नियंत्रित करने का कोई अन्य तरीका) उपलब्ध नहीं है। अभिव्यक्ति सामान्य डिफ़ॉल्ट पूर्वता नियमों के अनुसार मूल्यांकन करती है (गुणन पहले होता है, और फिर जोड़ और घटाव का मूल्यांकन बाएं से दाएं किया जाता है)।
  • ऊपर सूचीबद्ध लोगों के अलावा आपके पास किसी भी गणितीय ऑपरेटर या स्थिरांक तक पहुंच नहीं है; "लेटरल थिंकिंग" समाधान अक्सर पज़लिंग में स्वीकार किए जाते हैं, लेकिन इसका अर्थ यह नहीं है कि कंप्यूटर को स्वयं उनके साथ आने की आवश्यकता है, और यहाँ पर PPCG पर, हमें यह पसंद है कि यह उद्देश्य सही है या नहीं।
  • सामान्य पूर्णांक ओवरफ़्लो नियम लागू होते हैं: आपका समाधान आपकी भाषा के एक काल्पनिक (या शायद वास्तविक) संस्करण में मनमाने ढंग से बड़े पूर्णांकों के लिए काम करने में सक्षम होना चाहिए जिसमें सभी पूर्णांक डिफ़ॉल्ट रूप से अनबाउंड होते हैं, लेकिन यदि आपका प्रोग्राम कार्यान्वयन के कारण अभ्यास में विफल रहता है पूर्णांक का समर्थन नहीं कर रहा है, जो समाधान को अमान्य नहीं करता है।
  • यदि आप एक ही अंक या ऑपरेटर का एक से अधिक बार उपयोग करते हैं, तो आपको हर बार इसका उपयोग करने पर इसकी मैचस्टिक लागत का भुगतान करना होगा (क्योंकि, जाहिर है, आप टेबल पर दो अलग-अलग स्थानों में एक ही भौतिक मैचस्टिक्स का पुन: उपयोग नहीं कर सकते हैं)।
  • कोई समय सीमा नहीं है; जानवर बल समाधान स्वीकार्य हैं। (हालांकि यदि आपके पास एक समाधान है जो कि क्रूर बल से अधिक तेज़ है, तो इसे लंबे समय तक भी पोस्ट करने के लिए स्वतंत्र महसूस करें; यह देखते हुए कि वैकल्पिक दृष्टिकोण कितना दिलचस्प है।)
  • यद्यपि आपके कोड की व्याख्या लिखना कभी आवश्यक नहीं है , यह एक अच्छा विचार होने की संभावना है; समाधान अक्सर पढ़ने के लिए बहुत कठिन होते हैं (विशेष रूप से उन लोगों से परिचित नहीं हैं जो उनकी भाषा में लिखे गए हैं), और यह मूल्यांकन करना कठिन हो सकता है (और इस तरह वोट दें) जब तक आप यह नहीं समझते कि यह कैसे काम करता है।

विजय की स्थिति

एक के रूप में चुनौती, कम बाइट के साथ जवाब बेहतर माना जाता है। हालाँकि, हमेशा की तरह, विभिन्न दृष्टिकोणों के साथ या विशिष्ट भाषाओं में उत्तर देने के लिए स्वतंत्र महसूस करें, भले ही वे कुछ अन्य भाषाओं की तुलना में अधिक वर्बोज़ हों; गोल्फ का लक्ष्य वास्तव में यह देखना है कि आप किसी विशेष कार्यक्रम को कैसे अनुकूलित कर सकते हैं, और इस तरह से चीजें करने से हमें अनुकूलन के लिए बहुत सारे संभावित कार्यक्रम मिलते हैं। यदि कोई व्यक्ति पूरी तरह से अलग दृष्टिकोण, या पूरी तरह से अलग भाषा का उपयोग करके समाधान प्रस्तुत करता है, तो निराश न हों, और बहुत कम जवाब मिलता है; यह अच्छी तरह से हो सकता है कि आपका उत्तर बेहतर-अनुकूलित हो और अधिक कौशल दिखाता हो, और पीपीसीजी पर मतदाता अक्सर इसकी सराहना करते हैं।


भगवान, हमें संभालने के लिए सबसे अधिक संख्या क्या है? मेरा वर्तमान प्रयास इस तरह से आगे नहीं बढ़ेगा ... शायद टीआईओ पर 20।
मैजिक ऑक्टोपस Urn

@carusocomputing: सैद्धांतिक रूप से उच्च सिद्धांत में , लेकिन अगर आप अभ्यास में उचित समय के भीतर 20 से अधिक नहीं प्राप्त कर सकते हैं, तो यह पूरी तरह से स्वीकार्य है।

4
क्या आपके पास कोई परीक्षण मामले हैं?
ल्यूक

मैं वास्तव में चाहता हूं कि यह एक एकल ऑपरेशन था, जो कई प्रतियोगिताओं के खिलाफ फैला था। गुणा एक भाज्य समस्या है, लेकिन इसके अलावा और घटाव को जोड़ना वास्तव में चीजों को जटिल करता है। मेरे पास एक समाधान है जो काम करता है, लेकिन जोड़ और घटाव के लिए नहीं; उस काम को पूरी तरह से थकाऊ बनाना।
मैजिक ऑक्टोपस अर्ने

@carusocomputing: आप इस चुनौती में दिलचस्पी ले सकते हैं , तब। मुझे संदेह है कि गुणा के साथ चुनौती केवल काफी अलग है और एक अच्छा स्कोर प्राप्त करने के लिए विभिन्न समाधान तकनीकों की आवश्यकता होगी।

जवाबों:


1

Python2, 1̶9̶8̶ ̶b̶y̶t̶e̶s2 182 बाइट्स math_unkie को धन्यवाद

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]

इस एल्गोरिथ्म का उपसर्ग संस्करणों को बाहर करने के कुछ नहीं करता है +और -, लेकिन वे या तो से भी बदतर हो जाएगा, या बराबर और, बाद में खोज में दिखाई देते हैं उनकी इन्फ़िक्स समकक्षों। क्योंकि यह कीवर्ड तर्क का eपरस्पर उपयोग करता है , यदि यह प्रति सत्र कई बार कहा जाता है तो यह अमान्य परिणाम देगा। इसे ठीक करने के लिए, 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

PHP, 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

नकारात्मक पूर्णांकों का समर्थन

नकारात्मक पूर्णांकों के साथ संस्करण

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

ओह स्नैप, यह नकारात्मक संख्याओं पर भी काम करता है!
मैजिक ऑक्टोपस अर्ने

@carusocomputing वास्तव में यह नहीं हो सकता है कि एक समाधान कम माचिस के साथ मौजूद है क्योंकि नकारात्मक संख्या केवल घटाव द्वारा जोड़ी जाती है। इस मामले में आपको पूर्ण मूल्य की भी जांच करनी चाहिए और एक जोड़ना होगा
Jörg Hülsermann

मुझे नहीं लगता कि शाब्दिक 333 यहां स्वीकार्य होगा, हालांकि आप इसे इनपुट के कुछ कार्य के माध्यम से ठीक कर सकते हैं। (कार्यक्रम अच्छी तरह से बहुत धीमी गति से चल सकता है, इसलिए आप परीक्षण के लिए हार्डकोड संस्करण रख सकते हैं।)

1
@ एआईएस ५२३ किया ३३३ को २ * इनपुट के साथ बदल दिया गया है
जोर्ज हल्सरमैन

1
आप तारों को अनुक्रमित कर सकते हैं $e+="6255456376"[$i[$s++]];:।
मैनेटवर्क
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.