प्राइस राउंडिंग के साथ पैसे बचाएं


18

कनाडा में, पैसा अब परिचालित नहीं है। नकद भुगतान निकटतम 5 सेंट के लिए किया जाता है।

खरीद फरोख्त करके पैसा बचाया जा सकता है। उदाहरण के लिए, दो $ 1.02 वस्तुओं की कीमत $ 2.04 है जो कि $ 2.05 तक होती है, लेकिन अलग-अलग खरीद में आइटम खरीदते समय, प्रत्येक मूल्य $ 2.00 से $ $ 1.00 के लिए गोल होता है। हालांकि, जब $ 1.03 पर दो आइटम खरीदते हैं, तो उन्हें एक ही खरीद में खरीदना बेहतर होता है।

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

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

सबसे छोटा कोड जीतता है।

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

[] : 0
[48] : 48
[92, 20] : 110
[47, 56, 45] : 145
[55, 6, 98, 69] : 225
[6, 39, 85, 84, 7] : 218
[95, 14, 28, 49, 41, 39] : 263
[92, 6, 28, 30, 39, 93, 53] : 335
[83, 33, 62, 12, 34, 29, 18, 12] : 273
[23, 46, 54, 69, 64, 73, 58, 92, 26] : 495
[19, 56, 84, 23, 20, 53, 96, 92, 91, 58] : 583
[3, 3, 19, 56, 3, 84, 3, 23, 20, 53, 96, 92, 91, 58, 3, 3] : 598
[2, 3, 4, 4, 4, 4, 4] : 19

जवाबों:


5

रूबी, 119 105 अक्षर (93 शरीर)

def f s
a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
s.reduce(0,:+)-a-(c-m=c>d ?d:c)/2-2*(b+m+(d-m)/3)
end

यदि खाली खरीदारी सूची दी गई हो तो एल्गोरिथ्म को क्रैश होने की अनुमति देने पर दो पात्रों को बचाया जा सकता है।


आप बदल सकते हैं s.reduce(:+)(आम तौर पर आपको भी पैरेन्थेस की आवश्यकता नहीं होती है, लेकिन आपके मामले में ...) और mअतिरिक्त 2 वर्णों के लिए इनलाइन ।
हावर्ड

और हां a,b,c,d=(1..4).map{|i|s.count{|x|x%5==i}}
हावर्ड

@ यदि मैं कॉल 0,से हटाता हूं reduce, तो खाली इनपुट के लिए कोड टूट जाता है। मैंने उत्तर में इसका उल्लेख किया है। Inlining m मदद करने के लिए प्रतीत नहीं होता है। आखिरी सुझाव के लिए धन्यवाद - वह मुझसे बेवकूफ था।
जॉन ड्वोरक

1
आप लिख सकते हैं (c-m=c>d ?d:c)जो आपको दो चार देता है।
हावर्ड

@ मैंने सोचा कि इससे -ज्यादा प्राथमिकता होने के कारण यह टूट जाएगा =। क्या यह है कि असाइनमेंट की बाईं ओर एक उच्च प्राथमिकता है (जैसा कि, यह सुनिश्चित करने के लिए कि बाएं ऑपरेंड एक अंतराल है)?
जॉन ड्वोरक

5

गोल्फस्क्रिप्ट (54 वर्ण)

~]4,{){\5%=}+1$\,,}%~.2$>$:m- 3/m+@+2*@@m- 2/++~)+{+}*

यह एक प्रोग्राम है जो स्टड से अंतरिक्ष-पृथक मूल्यों के रूप में इनपुट लेता है। एक प्रारूप को इनपुट प्रारूप के लिए मजबूर करके बचाया जा सकता है बजाय इसके कि गोल्फस्क्रिप्ट सरणियों के रूप में।

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

सबसे दिलचस्प चाल .2$>$एक गैर-विनाशकारी minऑपरेटर के लिए है।


मैथ्स का मेरा विश्लेषण अनिवार्य रूप से जनवरी और रे के समान है: मान 5 मोड पर विचार करते हुए, एकमात्र बचत 1 या 2 के लेनदेन पर है। क्रेडिट कार्ड विकल्प का मतलब है कि हम कभी भी गोल नहीं करते हैं। तो एक आइटम जिसकी कीमत 5n + 2 सेंट है वह बंडलिंग से लाभ नहीं उठा सकता है; न तो 5n + 1 सेंट की कीमत वाली वस्तु (क्योंकि 2-प्रतिशत बचत को 2-प्रतिशत की बचत में संयोजित करने से कोई लाभ नहीं होता है)। इतना ही दिलचस्प मामलों 3 और 4 के मूल्यों को शामिल 0, additive पहचान है 3+3 = 1और 3+4 = 4+4+4 = 2; अगर हमने 3s और 4s को मिलाया है तो हम ( 3+4अधिक 3+3बेहतर) या 4+4+4(समतुल्य) को प्राथमिकता देकर ऑप्टिमाइज़ करते हैं ।


+1 - हालाँकि वे स्थान इतने भव्य रूप से दिखते हैं ;-) आप उन्हें बचा सकते हैं -m ( ~):m) दुर्भाग्य से चार गिनती में कोई कमी नहीं के साथ।
होवार्ड

@ हावर्ड, मुझे पता है, मैंने भी कोशिश की। : डी
पीटर टेलर

3

C ++: 126 वर्ण

int P(int*m,int i){int t=0,h=0,d;while(i>-1){d=m[i]%5;t+=m[i--];d<3?t-=d:d==4?h++,t-=2:h--;}h<0?t+=h/2:t+=(h-h/3)*2;return t;}

इस कार्यक्रम को छोटा बनाने के लिए मार्गदर्शन देने के लिए आपका स्वागत है। यह परीक्षण कार्यक्रम है, tdm-gcc 4.7.1 संकलक के साथ संकलित करें और सामान्य रूप से चलाएं।

#include<iostream>
using namespace std;

//m[i]表示单个商品的价格,t表示所有商品总价格,
//d为单个商品价格取模后的值,h为单个商品价格取模后值为3的个数,
//f为单个商品价格取模后值为4的个数
int P(int*m,int i){int t=0,h=0,d;while(i>-1){d=m[i]%5;t+=m[i--];d<3?t-=d:d==4?h++,t-=2:h--;}h<0?t+=h/2:t+=(h-h/3)*2;return t;}

int main() {
int p1[1]={48};
int p2[2]={92,20};
int p3[3]={47,56,45};
int p4[4]={55,6,98,69};
int p5[5]={6,39,85,84,7};
int p6[6]={95,14,28,49,41,39};
int p7[7]={92,6,28,30,39,93,53};
int p8[8]={83,33,62,12,34,29,18,12};
int p9[9]={23,46,54,69,64,73,58,92,26};
int p10[10]={19,56,84,23,20,53,96,92,91,58};
int p11[10]={1,2,3,4,5,6,7,8,9,10};
cout<<P(p1,0)<<endl
    <<P(p2,1)<<endl
    <<P(p3,2)<<endl
    <<P(p4,3)<<endl
    <<P(p5,4)<<endl
    <<P(p6,5)<<endl
    <<P(p7,6)<<endl
    <<P(p8,7)<<endl
    <<P(p9,8)<<endl
    <<P(p10,9)<<endl
    <<P(p11,9)<<endl;

return 0;
}

1

आर 143

function(x)min(sapply(rapply(partitions::listParts(length(x)),
                             function(i)min(sum(x[i]),5*round(sum(x[i])/5)),h="l"),
                      function(x)sum(unlist(x))))

टेस्ट ( Pऊपर कोड के लिए एक उपनाम कहां है)

> P(c(48))
[1] 48
> P(c(92, 20))
[1] 110
> P(c(47, 56, 45))
[1] 145
> P(c(55, 6, 98, 69))
[1] 225
> P(c(6, 39, 85, 84, 7))
[1] 218
> P(c(95, 14, 28, 49, 41, 39))
[1] 263
> P(c(92, 6, 28, 30, 39, 93, 53))
[1] 335
> P(c(83, 33, 62, 12, 34, 29, 18, 12))
[1] 273
> P(c(23, 46, 54, 69, 64, 73, 58, 92, 26))
[1] 495
> P(c(19, 56, 84, 23, 20, 53, 96, 92, 91, 58))
[1] 583

1

गणितज्ञ 112 126 167 157

संपादित करें : {3, 3} और {4,4,4} के मामले अब पीटर टेलर और कार्डबोर्ड_बॉक्स के लिए धन्यवाद।

n_~g~o_ := {a___, Sequence @@ n, b___} :> {a, b, o};
f@s_ := Tr@Join[#[[2]], Sort@#[[1]] //. {1 -> 0, 2 -> 0, g[{3, 4}, 5], g[{3, 3}, 5], 
   g[{4, 4, 4}, 10]}] &[Transpose[{m = Mod[#, 5], # - m} & /@ s]]

नोट: गैर-खरीद (परीक्षण केस # 1) के रूप में दर्ज किए जाते हैं f[{0}]

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

  1. प्रत्येक आइटम के लिए, संबंधित मूल्य से कम से कम 5 का सबसे बड़ा भुगतान के रूप की परवाह किए बिना भुगतान किया जाएगा। (उस के आसपास नहीं मिल रहा है।)
  2. तब के अवशेष Mod[n, 5]संसाधित होते हैं: 1 का और 2 का 0 बन जाता है। शून्य अपरिवर्तित रहें।
  3. प्रत्येक जोड़ी {3, 4} -> {5}; बाद में प्रत्येक जोड़ी {3, 3} -> {5}; फिर ट्रिपल, {4,4,4} -> {10}, यदि लागू हो।
  4. शेष 4 के, यदि कोई हो, अपरिवर्तित रहे (क्रेडिट कार्ड द्वारा भुगतान किया गया)।
  5. 5 के मूल गुणकों को चरण (2) से (4) में जोड़े गए (या नहीं) रहने वाले आदेशों के साथ अभिव्यक्त किया गया है।

परिक्षण

a12{3,3} के a13लिए समायोजन {4,4,4} के लिए समायोजित करता है

a1={0};
a2={48};
a3={92,20};
a4={47,56,45};
a5={55,6,98,69} ;
a6={6,39,85,84,7};
a7={95,14,28,49,41,39};
a8={92,6,28,30,39,93,53};
a9={83,33,62,12,34,29,18,12};
a10={23,46,54,69,64,73,58,92,26};
a11={19,56,84,23,20,53,96,92,91,58};
a12={3,3,19,56,3,84,3,23,20,53,96,92,91,58,3,3};
a13={2,3,4,4,4,4,4};

f /@ {a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13}

{, 48, 110, 145, 145, 225, 218, 263, 335, 273, 495, 583, 598, 19}


1
{3,3} के बारे में क्या?
पीटर टेलर

@PeterTaylor। अच्छी बात। इससे फिसल गया।
डेविड

{4,4,4} के बारे में क्या? मुझे लगता है कि {3,4} -> {5}, {3,3} -> {5} और {4,4,4} -> {10} (उस क्रम में) इसे इष्टतम उत्तर देना चाहिए।
कार्डबोर्ड_बॉक्स

@cardboard_box तुम सही हो! अपडेट देखें
डेविड

मैंने आपके अतिरिक्त परीक्षण मामलों को प्रश्न में जोड़ दिया। जिन्हें मैंने बेतरतीब ढंग से उत्पन्न किया था, इसलिए उन कोने के मामलों को नहीं दिखाया गया था।
कार्डबोर्ड_बॉक्स

1

अजगर 3 (115 वर्ण)

m=eval(input());t=a=b=0
for v in m:d=v%5;t+=v-d*(d<3);a+=d==3;b+=d==4
d=min(a,b);a-=d;b-=d;print(t-d*2-a//2-b//3*2)

पायथन 2 (106 वर्ण)

m=input();t=a=b=0
for v in m:d=v%5;t+=v-d*(d<3);a+=d==3;b+=d==4
d=min(a,b);a-=d;b-=d;print t-d*2-a/2-b/3*2

2
प्रश्न कुल मूल्य के लिए पूछता है, इसलिए पूरी सूची के लिए एक आउटपुट होना चाहिए। उदाहरण के लिए, इनपुट [3,4,9]को देना चाहिए 14, क्योंकि आप 3 और 4 प्रतिशत आइटम को 7 प्रतिशत खरीद के लिए जोड़ सकते हैं जो आप 5 सेंट के साथ नकद में भुगतान करते हैं, और शेष 9 प्रतिशत आइटम आप क्रेडिट के साथ भुगतान करते हैं क्योंकि यह अन्यथा गोल होगा।
कार्डबोर्ड_बॉक्स

2
दिया 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, यह देता है 0.0, 0.0, 2.5, 3.33, 5.0, 5.0, 5.0, 7.5, 8.33, 10.0, जो करने के लिए बोता है 46.66। हालाँकि, सही उत्तर है 45, इसलिए आपके द्वारा प्रिंट किए गए अंकों का योग सही उत्तर नहीं है, और इसलिए यह समाधान गलत है।
नोलेन रॉयल्टी

यह जवाब तब दिया गया था जब नौकरी में "कुल" नहीं था
AMK

2
मुझे डर है कि मुझे हटाने की सिफारिश करनी होगी। एस्कर ने आवश्यकताओं को नहीं बदला - उन्होंने उन्हें स्पष्ट किया। यदि प्रत्येक वस्तु की कीमत अलग-अलग वांछित थी, तो फिर "खरीद / एकल खरीद के अनुक्रम" का उल्लेख क्यों और किसकी चर्चा अनुकूल है?
जॉन ड्वोरक

मैं गलत उत्तर हटाता हूं। अब यह सबसे छोटा पायथन उत्तर है
AMK

0

एपीएल, ५ characters अक्षर

{a b c d←+/(⍳4)∘.=5|⍵⋄(+/⍵)-a-(⌊2÷⍨c-m)-2×b+m+⌊3÷⍨d-m←c⌊d}

कार्यक्रम मूल रूप से जन द्वारक के रूबी समाधान का प्रत्यक्ष अनुवाद है ।


      {a b c d←+/(⍳4)∘.=5|⍵⋄(+/⍵)-a-(⌊2÷⍨c-m)-2×b+m+⌊3÷⍨d-m←c⌊d}⍬
0
      {a b c d←+/(⍳4)∘.=5|⍵⋄(+/⍵)-a-(⌊2÷⍨c-m)-2×b+m+⌊3÷⍨d-m←c⌊d}95 14 28 49 41 39
263
      {a b c d←+/(⍳4)∘.=5|⍵⋄(+/⍵)-a-(⌊2÷⍨c-m)-2×b+m+⌊3÷⍨d-m←c⌊d}19 56 84 23 20 53 96 92 91 58
583

खाली वेक्टर है।


0

जूलिया 83 सी

C=L->let
w,z,x,y=map(i->[i==x%5for x=L]|sum,1:4)
L|sum-(x+2w+3min(x,y)+4z)>>1
end

explaination:

एक खरीद में, आप अधिकतम 2 प्रतिशत बचा सकते हैं। इसलिए यदि आपके पास एक संयोजन है जो आपको 2 सेंट बचा सकता है, तो बस इसे उसी तरह से खरीदें और यह आशावादी होगा । उदाहरण के लिए, यदि आपके पास xमूल्य 3 (मॉड 5) और yमूल्य 4 (मॉड 5) वाले आइटम हैं, तो आप min(x, y)संख्या (3, 4) जोड़े बना सकते हैं, जो आपको 2 min(x, y)सेंट बचाते हैं । फिर आप शेष 3 का उपयोग करते हैं, यदि कोई हो, तो आपको max(0, x-min(x,y)) / 2सेंट बचाने के लिए । इसके द्वारा भी गणना की जा सकती है(max(x,y)-y)/2

w = sum(1 for p in prices if p % 5 == 1)
z = sum(1 for p in prices if p % 5 == 2)
x = sum(1 for p in prices if p % 5 == 3)
y = sum(1 for p in prices if p % 5 == 4)

ans = sum(prices) - (w + 2 z + 2 min(x, y) + div(max(x, y) - y, 2))
    = sum(prices) - (2w + 4z + 4 min(x, y) + x + y - min(x, y) - y) `div` 2
    = sum(prices) - (2w + 4z + 3 min(x, y) + x) `div` 2

संपादित करें

यह समाधान गलत है।


एक अपेक्षाकृत अज्ञात भाषा का उपयोग करने के लिए +1 जो सीखने के लिए दिलचस्प हो सकता है
जॉन ड्वोरक

यह सक्रिय विकास के तहत एक नई भाषा है। यह विभिन्न भाषाओं से कई स्ट्रेंथ को जोड़ती है। आशा है कि अधिक लोग इसे जान सकते हैं।
रे

विश्लेषण काफी पूर्ण नहीं है, क्योंकि यदि आपके पास है 4 4 4 3 3तो 4 4 4एक संयोजन है जो 2 सेंट बचा सकता है, लेकिन इसे इस तरह से खरीदना इष्टतम नहीं है। (वास्तव में, आप बिल्कुल भी ध्यान 4 4 4में नहीं रखते हैं। क्या यह कोड अंतिम परीक्षण के मामले में विफल नहीं है?)
पीटर टेलर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.