क्या यह मूल्य अद्वितीय सिक्कों और / या नोटों से बनाया जा सकता है?


29

एक प्रोग्राम लिखें जो गणना करता है कि एक इनपुटेड मौद्रिक मूल्य, पूर्णांक के रूप में, सिक्कों और / या नोटों के एक अद्वितीय संयोजन द्वारा दर्शाया जा सकता है, जिसका अर्थ है कि एक ही सिक्के / नोट का एक से अधिक बार उपयोग नहीं किया जा सकता है।

आपके कार्यक्रम को इनपुट के रूप में एक मूल्य लेना चाहिए, और इनपुट के माध्यम से या अपनी भाषा के सरणी के माध्यम से सिक्का / नोट मानों की एक सूची ले सकते हैं। सिक्कों / नोटों की सूची को बदलने में सक्षम होना चाहिए, इसलिए सुनिश्चित करें कि यह स्पष्ट है कि यदि आप स्थिरांक का उपयोग कर रहे हैं तो यह कहां परिभाषित किया गया है।

आपके कार्यक्रम को क्रमशः किसी भी सत्य / मिथ्या मूल्य का उत्पादन करना चाहिए।

कृपया ध्यान दें कि मूल्य बनाने वाले सिक्कों / नोटों की सूची को आउटपुट करना आवश्यक नहीं है।

उदाहरण

यूके पाउंड का उपयोग करना, (£ 1.00 = 100 और £ 420.69 = 42069)

coins = [1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]

निम्नलिखित उत्पादन सच होगा:

6 (1, 5)
15 (10, 5)
88 (1, 2, 5, 10, 20, 50)
512 (500, 10, 2)
7003 (5000, 2000, 2, 1)

निम्नलिखित उत्पादन गलत होगा:

4
209
8889
4242424242
[ANYTHING ABOVE 8888]

वैकल्पिक टेस्ट डेटा (अमेरिकी डॉलर)

coins = [1, 5, 10, 25, 50, 100, 200, 500, 1000, 2000, 5000, 10000]

सौभाग्य!


4
काश हम आपके जैसे और भी नए कलाकार हों ...
लीक नून


2
आपको सिक्के के एक अलग सेट का उपयोग करके कुछ टेस्टकेस जोड़ने चाहिए
लीकी नून

2
मैं ऐसे परीक्षण मामलों को जोड़ने का सुझाव दूंगा जो सबसे अधिक अप्रयुक्त सिक्के के लालची अनुमान के साथ हल नहीं किए जा सकते हैं, जो कि शेष मूल्य पर है। यह भी अच्छा होगा कि जहां इनपुट को क्रमबद्ध नहीं किया गया है और जहां एक मान को एक से अधिक तरीके से बनाया जा सकता है। यह आम तौर पर परीक्षण के मामलों के लिए अच्छा है कि इस संभावना से बचने के लिए कि कोई व्यक्ति उस समस्या पर एक उचित प्रयास करता है जो परीक्षण मामलों के लिए काम करता है सब कुछ सही होने के बिना।
xnor

2
संबंधितसंबंधित भी । भूतपूर्व प्रश्न यकीनन एक डुप्लिकेट है, लेकिन यह प्रश्न IMO को बेहतर तरीके से डिज़ाइन किया गया है और यदि हम एक डुप्लिकेट के रूप में बंद कर रहे हैं, तो मैं पुराने वाले को बंद कर दूंगा।

जवाबों:


13

ब्रेकीलॉग 2 (TIO Nexus), 2 बाइट्स

⊇+

इसे ऑनलाइन आज़माएं!

सिक्कों की सूची को या तो मानक इनपुट के माध्यम से या कार्यक्रम की शुरुआत के लिए एक सरणी शाब्दिक के रूप में तैयार करने के माध्यम से (या तो काम करेगा, इसलिए यह आपके ऊपर है कि आपको क्या लगता है "अधिक वैध"; पूर्व को डिफ़ॉल्ट रूप से अनुमति दी जाती है; पीपीसीजी नियम, उत्तरार्द्ध विशेष रूप से प्रश्न द्वारा अनुमति); और कमांड-लाइन तर्क के रूप में उत्पादन करने के लिए मूल्य लेता है।

व्याख्या

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

⊇+
⊇   Some subset of {standard input}
 +  sums to {the first command-line argument}

पूर्ण कार्यक्रम के रूप में, यह एक बूलियन मान लौटाता है; true.अगर कार्यक्रम में सभी दावे एक साथ संतुष्ट हो सकते हैं, या false.यदि वे नहीं हो सकते हैं।

(एक अनुस्मारक, या उन लोगों के लिए जो पहले से ही नहीं जानते हैं: Brachylog 2 अपने स्वयं के चरित्र एन्कोडिंग का उपयोग करता है जिसमें एक सिंगल बाइट लंबा होता है)।


आपने कहा कि, ब्रेकीलॉग में एक एकल बाइट है, आप यहां बाइट क्यों नहीं चिपकाते हैं? मुझे यकीन है कि इसके लिए एक कारण है, मुझे बस दिलचस्पी है, एक चरित्र-एन्कोडिंग नब की बिट।
Theonlygusti

1
वे डिस्क पर एन्कोडेड हैं 08 2B(आप यहां एन्कोडिंग देख सकते हैं )। विशिष्ट एन्कोडिंग को सूचीबद्ध करने का कारण यह नहीं है कि यह अप्रासंगिक है; यह सब वास्तव में मायने रखता है कि ब्रेकीलॉग 256 से अधिक अद्वितीय वर्णों का उपयोग करता है, ताकि प्रत्येक को एक बाइट में दर्शाया जा सके। यह आमतौर पर कोड को अधिक पठनीय बनाने के लिए गोल्फिंग भाषाओं द्वारा किया जाता है; वे कोड पेज 437 जैसे एन्कोडिंग का उपयोग कर सकते हैं, लेकिन यदि आपने ऐसा किया है कि कोई भी इसे पढ़ नहीं पाएगा

10

05AB1E , 4 बाइट्स

æOså

स्पष्टीकरण:

æ      Calculate the powerset of the first input
 O     Sum each element
  s    Put the second input at the top of the stack
   å   Check whether the input is in the powerset sum.

इसे ऑनलाइन आज़माएं!


लगता है कि आपने आधिकारिक रूप से सूची को संकुचित करने में सभी को गुमराह किया है; पी
लीक नून

एक बार जब आपने अपनी संपीड़ित सूची को हटा दिया और इसे इनपुट में स्थानांतरित कर दिया, तो मैं अपना उत्तर हटा दूंगा (क्योंकि जब तक हमारे उत्तर समान होंगे)
लीकी नून

यह समुदाय प्रतिभाओं से भरा है।
तोबी

5

गणितज्ञ, 25 बाइट्स

!FreeQ[Tr/@Subsets@#,#2]&

पहला तर्क के रूप में सिक्का-मूल्यों की एक सरणी लेने वाला शुद्ध कार्य और दूसरा तर्क के रूप में लक्ष्य पूर्णांक, और लौटने Trueया False


4

जेली, 6 बाइट्स

ŒPS€e@

इसे ऑनलाइन आज़माएं!

-2 बाइट्स का शुक्रिया लीकी नून
-13 बाइट्स के लिए शुक्रिया लीकी नून (लंबी कहानी)



@LeakyNun हेह, एक बेहतर समाधान है, वहाँ नहीं है।
HyperNeutrino

@JonathanAllan ओह, वूप्स। धन्यवाद!
हाइपरएनुट्रिनो 18

एक TIO लिंक जोड़ा;)
Okx

3

रेटिना , 52 31 बाइट्स

\d+
$*
^((1+) |1+ )+(?<-2>\2)+$

इसे ऑनलाइन आज़माएं! वांछित मूल्य के बाद सिक्कों और नोटों की एक अलग-अलग सूची के रूप में इनपुट लेता है। संपादित करें: सहेजे गए 18 बाइट्स @Kobi का धन्यवाद जिन्होंने मेरे कोड को डिबग किया। व्याख्या: पहली दो पंक्तियाँ केवल दशमलव से भिन्न में परिवर्तित होती हैं। तीसरी पंक्ति फिर सिक्कों और नोटों की सूची पर कब्जा कर लेती है। प्रत्यावर्तन इंजन को पीछे हटाने और विशिष्ट सिक्कों / नोटों पर कब्जा नहीं करने की अनुमति देता है। संतुलन समूह तब कैप्चर सूची के सभी प्रत्ययों (अनावश्यक लेकिन गोल्फर) के खिलाफ मूल्य से मेल खाता है।


दूसरा विकल्प काम नहीं करता है क्योंकि इंजन 0-लंबाई समूहों (एक कष्टप्रद अनुकूलन) में पीछे नहीं हटता है। आप ^((1+) )+(\2?(?<-2>)|){99}$(34 बाइट्स, सिक्कों की संख्या की सीमा के साथ), या ^((1+) |1+ )+(\2?(?<-2>))+$(34 बाइट्स) का उपयोग कर सकते हैं।
कोबी

1
@ कोबी सुंदर! मैंने दोनों जवाबों से 2 बाइट्स बचाए क्योंकि मैं भूल गया कि (?<-2>\2?)काम करता है, साथ ही आपके दूसरे उत्तर से एक और बाइट है क्योंकि यह ?अब आवश्यक नहीं है।
नील


2

जावा (ओपनजेडके 8) , 125 बाइट्स

boolean f(int[]c,int n){int l=c.length;if(l<1)return n==0;int[]a=java.util.Arrays.copyOf(c,l-1);return f(a,n-c[l-1])|f(a,n);}

इसे ऑनलाइन आज़माएं!


एक मेमने में ऐसा करने से वह छोटा हो सकता है।
ओकेक्स

@ ओएक्सएक्स यह पुनरावर्ती है (इसलिए यह अधिक लंबा होगा), साथ ही मैं लैम्ब्डा नहीं करता, भले ही वे छोटे हों।
लीक नून

1
आपके एल्गोरिथ्म का पुनरावृत्त संस्करण छोटा है क्योंकि आप सरणी को कॉपी करने की आवश्यकता को दूर करते हैं: boolean f(int[]c,int n){for(int l=c.length;l-->0;n-=n<c[l]?0:c[l]);return n<1;}(79 बाइट्स)। जावा 8 और इसके लैम्ब्डा के साथ, इसे आगे 62 बाइट्स तक घटाया जा सकता है। अपने उत्तर के बारे में जैसा कि यह वर्तमान में है, int l=c.length-1तो lइसके बजाय का उपयोग करना l-1भी कम है।
ओलिवियर ग्रेजायर

2

प्रोलोग (एसडब्ल्यूआई) , 46 बाइट्स

a([],0).
a([H|T],X):-Y is X-H,(a(T,Y);a(T,X)).

इसे ऑनलाइन आज़माएं!

मेरे पायथन जवाब का कांटा ।


2
आप शायद इसके बजाय GNU प्रोलॉग का उपयोग करके 2 बाइट्स बचा सकते हैं ( isजैसा #=कि आप कुछ व्हाट्सएप को हटाने की अनुमति देंगे)।

2

जावास्क्रिप्ट (ईएस 6), 81 69 67 64 बाइट्स

सिंटेक्स में सिक्कों की सूची cऔर लक्ष्य राशि aको ले जाता है (c)(a)। लौटाता है 0या true

c=>g=(a,m=1)=>c.map((c,i)=>x-=c*(m>>i&1),x=a)&&!x||x-a&&g(a,m+1)

परीक्षण के मामलों


क्या आपको सिक्कों की सूची लेने की अनुमति है?
लीक नून

@LeakyNun "... और सिक्का / नोट मूल्यों की सूची ले सकते हैं ..."
मार्टिन एंडर

1
इसलिए मैंने कुछ नहीं के लिए सूची को एनकोड किया ...
लीक नून

@LeakyNun ऐसा लगता है
एडी हार्ट

2

हास्केल , 28 बाइट्स

ऑपरेटर फ़ंक्शन (#)एक पूर्णांक और पूर्णांकों की सूची (या, आमतौर पर, Traversableसंख्याओं के किसी भी कंटेनर) को लेता है और वापस लौटाता है Bool

के रूप में उपयोग करें 6#[1, 2, 5, 10, 20, 50, 100, 200, 500, 1000, 2000, 5000]

c#l=elem c$sum<$>mapM(:[0])l

इसे ऑनलाइन आज़माएं!

यह काम किस प्रकार करता है

  • cवांछित मूल्य और lसिक्का मूल्यों की सूची है।
  • mapM(:[0])lनक्शे (:[0])से अधिक l, 0 के साथ प्रत्येक मूल्य युग्मन हो, और फिर कार्तीय उत्पाद निर्माण करती है, सूची देने के प्रत्येक तत्व का में अपनी इसी मूल्य या तो है l, या 0।
  • sum<$>elem c$यदि प्रत्येक cपरिणाम सूची में है, तो प्रत्येक संयोजन और जांच करता है।

2

आर, 88 83 बाइट्स

-5 बाइट्स @ थारू डबेलडैम को धन्यवाद

एक अनाम फ़ंक्शन देता है। यह सिक्कों के सभी संभावित संयोजनों को बनाता है ( expand.gridजोड़े पर T,F) का उपयोग करता है और जांचता है कि क्या मूल्य मौजूद हैं। kचूंकि सिक्के cआर में आरक्षित शब्द है, इसलिए एक बार में कई मानों की जांच कर सकते हैं।

function(k,v)v%in%apply(expand.grid(Map(function(x)!0:1,k)),1,function(x)sum(k[x]))

इसे ऑनलाइन आज़माएं!


आप की जगह ले सकता c(T,F)से !0:1, और rep(list(!0:1),length(k))द्वाराlapply(k,function(x)!0:1)
JAD

1
वास्तव में, किMap(function(x)!0:1,k)
JAD

1

जाप , 7 बाइट्स

à mx èN

इसे ऑनलाइन आज़माएं! झूठी के 0लिए आउटपुट , सत्य के लिए एक सकारात्मक पूर्णांक।

व्याख्या

à mx èN
          // Implicit: U = input array, V = input integer, N = array of all inputs
à         // Take all combinations of U.
  mx      // Map each combination to its sum.
     è    // Count the number of items in the result which also exist in
      N   //   the array of inputs.
          // This returns 0 if no combination sums to V, a positive integer otherwise.
          // Implicit: output result of last expression


1

रूबी , 39 बाइट्स

nilमिथ्या मान के रूप में लौटाता है , और सूची में सबसे छोटा सिक्का मान जो सत्य के रूप में संख्या बनाता है (सभी संख्याएं रूबी में सत्य हैं)।

f=->c,n{n!=0?c.find{|i|f[c-[i],n-i]}:1}

हालांकि, सावधान रहें, यह एल्गोरिथ्म O(C!)समय की जटिलता के साथ पागलपन की गति से धीमा है, जहां Cसिक्का सूची की लंबाई है। यह अंततः खत्म हो जाता है, लेकिन अधिकांश परीक्षण मामलों में अधिकांश ऑनलाइन दुभाषियों पर भी समय लगेगा f(UK_POUND, 5)

यहां एक 41-बाइट संस्करण है जो एक अतिरिक्त समाप्ति स्थिति को जोड़कर बहुत तेजी से खत्म करता है, और वास्तव में समय निकालने के लिए बहुत कठिन है

f=->c,n{n>0?c.find{|i|f[c-[i],n-i]}:n==0}

इसे ऑनलाइन आज़माएं!


1

बैश + जीएनयू उपयोगिताओं, 56 39

printf %$2s|egrep "^ {${1//,/\}? {}}?$"

इनपुट संप्रदाय सूची (अनसुलझी) अल्पविराम से अलग की गई सूची के रूप में दी गई है। इनपुट सूची और मूल्य कमांड-लाइन मापदंडों के रूप में दिए गए हैं।

शेल रिटर्न कोड के रूप में दिया गया आउटपुट। echo $?स्क्रिप्ट चलाने के बाद निरीक्षण करें । 0सत्य का अर्थ है, 1मिथ्या का अर्थ है।

इसे ऑनलाइन आज़माएं

  • printf %$2svalueरिक्त स्थान की एक स्ट्रिंग आउटपुट
  • "^ {${1//,/\}? {}}?$"एक शेल विस्तार है जो मूल्यवर्ग सूची को एक रेक्सक्स की तरह विस्तारित करता है ^ {1}? {2}? {5}? {10}? ... $। यह पता चलता है कि egrepरेगेक्स इंजन इस के साथ सही ढंग से मेल खाने के लिए पर्याप्त स्मार्ट है, चाहे जो भी संप्रदाय हों
  • egrep जाँच करता है कि रिक्त स्थान का स्ट्रिंग रेगेक्स से मेल खाता है या नहीं

1

सी, 66 बाइट्स

m;v;f(n){for(m=1e5;m/=10;)for(v=5;n-=n<v*m?0:v*m,v/=2;);return!n;}

इसे यहां देखें ।

सी, 53 बाइट्स

g(c,w,n)int*c;{for(;n-=n<c[--w]?0:c[w],w;);return!n;}

यह संस्करण सिक्का सरणी लेता है, जो इस समस्या के उद्देश्य को हरा देता है, क्योंकि यह सरल घटाव के लिए आता है।

पहला तर्क सिक्का सरणी है, दूसरा सिक्का गिनती है, और तीसरा मूल्य है।

सी, 48 बाइट्स

g(c,n)int*c;{for(;n-=n<*c?0:*c,*++c;);return!n;}

पिछले संस्करण के लिए एक विकल्प। यह मानता है कि सिक्का सरणी को उलटा और शून्य समाप्त किया जा सकता है।



0

सीजाम , 18 17 बाइट्स

q~_,2\m*\f.*::+#)

इसे ऑनलाइन आज़माएं!

व्याख्या

q~                  e# Read and eval input.
  _,                e# Duplicate the money list and take its length.
    2\m*            e# Take the (length)th Cartesian power of [0 1].
        \f.*        e# Element-wise multiplication of each set of 0's and 1's with the money
                    e#   list. This is essentially the powerset, but with 0s instead of 
                    e#   missing elements.
            ::+     e# Sum each set.
               #    e# Find the index of the desired amount in the list. (-1 if not found)
                )   e# Increment. -1 => 0 (falsy), anything else => nonzero (truthy)



0

ऑक्टेव, 39 बाइट्स

 @(L,n)any(cellfun(@sum,powerset(L))==n)

एक अनाम फ़ंक्शन जो पहले तर्क के रूप में सिक्के-मूल्यों की एक सरणी लेता है और दूसरे तर्क के रूप में लक्ष्य पूर्णांक बनाता है, और सही या गलत लौटाता है।

इसे ऑनलाइन आज़माएं!


0

गणितज्ञ, 42 बाइट्स

ListQ@NumberDecompose[#,Sort[#2,Greater]]&

इनपुट

[15, {10,5}]

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.