মূল্য গোল করে অর্থ সাশ্রয় করুন


18

কানাডায়, পয়সা আর প্রচার হয় না। নগদ অর্থ প্রদানগুলি কাছাকাছি 5 সেন্টে গোল হয়।

বিভক্ত ক্রয়ের মাধ্যমে অর্থ সাশ্রয় করা যায়। উদাহরণস্বরূপ, দুটি $ 1.02 আইটেমের দাম $ 2.04 যার পরিমাণ $ 2.05 হয়, কিন্তু পৃথক ক্রমে আইটেমগুলি কেনার সময়, প্রতিটি মূল্য মোট $ 2.00 এর জন্য $ 1.00 হয়। যাইহোক, প্রতিটি আইটেম প্রতিটি at 1.03 এ কিনে, একক ক্রয়ে এগুলি কেনা ভাল।

অর্থ সাশ্রয়ের আরেকটি উপায় হ'ল ক্রেডিট কার্ড ব্যবহার করা যখন রাউন্ডিং প্রতিকূল হয়, কারণ ক্রেডিট প্রদানগুলি গোল হয় না। আমরা যদি দুটি $ 1.04 আইটেম চাই, আমরা কীভাবে ক্রয়গুলি বিভক্ত করি তা নির্বিশেষে মোট দাম $ 2.10 অবধি উঠে যাবে। সুতরাং, ক্রেডিট কার্ড সহ আমাদের এই আইটেমগুলির জন্য অর্থ প্রদান করা উচিত।

কোনও ফাংশন বা প্রোগ্রাম লিখুন যা সেন্টগুলিতে পূর্ণসংখ্যার হিসাবে আইটেমের দামের তালিকা গ্রহণ করে এবং সেই আইটেমগুলির জন্য সর্বনিম্ন সর্বমোট সর্বমোট মূল্যের (সেন্টে) আউটপুট দেয় যা প্রতিটি ক্রয়ের অনুক্রমের মাধ্যমে অর্জন করা যেতে পারে, প্রতিটি নগদ বা creditণের মাধ্যমে।

সংক্ষিপ্ততম কোড জিতেছে।

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

[] : 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জন্য কোডটি ব্রেক হয়ে যায়। আমি উত্তরে তা উল্লেখ করেছি। ইনলাইনিং মি সহায়তা করছে বলে মনে হচ্ছে না। শেষ পরামর্শের জন্য ধন্যবাদ - এটি আমার কাছ থেকে বোকা ছিল।
জন ডিভোরাক

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 সেন্ট মূল্যের কোনও আইটেমও পাওয়া যায় না (কারণ দুই ভাগের 1 শতাংশ সঞ্চয়কে 2 শতাংশের সঞ্চয় হিসাবে সংযুক্ত করা কোনও সুবিধা দেয় না)। 0 হ'ল সংযোজনীয় পরিচয়, সুতরাং কেবল আকর্ষণীয় ক্ষেত্রে 3 এবং 4 এর মান জড়িত এবং 3+3 = 1এবং 3+4 = 4+4+4 = 2; যদি আমাদের 3s এবং 4s মিশ্রিত হয় তবে আমরা 3+4ওভার 3+3(কঠোরতর ভাল) বা 4+4+4(সমতুল্য) অগ্রাধিকার দিয়ে অনুকূলিতকরণ করব ।


+1 - যদিও এই জায়গাগুলিটিকে এত আড়ম্বরপূর্ণ দেখাচ্ছে ;-) ~):mদুর্ভাগ্যক্রমে চর গণনা কোনও হ্রাস না করে আপনি -m ( ) সংরক্ষণ করে এগুলি সরিয়ে ফেলতে পারেন ।
হাওয়ার্ড

@ হওয়ার্ড, আমি জানি, আমিও এটি চেষ্টা করেছিলাম। : ডি
পিটার টেলর

3

সি ++: 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;}

এই প্রোগ্রামটি সংক্ষিপ্ত হওয়ার জন্য গাইডেন্স দেওয়ার জন্য আপনাকে স্বাগতম e এখানে পরীক্ষা প্রোগ্রামটি, 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 a13for এর জন্য সামঞ্জস্য করে {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}

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


1
কি সম্পর্কে 3,3 about?
পিটার টেলর

@PeterTaylor। ভাল যুক্তি. এটি পিছলে যায়।
ডেভিডসি

4,4,4 {সম্পর্কে কী? আমি মনে করি {3,4} -> {5}, {3,3} -> {5} এবং, 4,4,4} -> {10} (সেই ক্রমে) এটি সর্বোত্তম উত্তর দেওয়া উচিত।
পিচবোর্ড_বক্স

@ কার্ডবোর্ড_বক্স আপনি ঠিক বলেছেন! আপডেট দেখুন।
ডেভিডসি

আমি আপনার অতিরিক্ত পরীক্ষার কেসগুলি প্রশ্নের সাথে যুক্ত করেছি। আমি যেগুলি এলাম তা এলোমেলোভাবে তৈরি করা হয়েছিল যাতে corner কোণার কেসগুলি প্রদর্শিত না হয়।
পিচবোর্ড_বক্স

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, কারণ আপনি and এবং চার শতাংশের আইটেম একত্রিত করে cent শতাংশ ক্রয় করতে পারবেন যা আপনি নগদ অর্থ পাঁচ সেন্টের মাধ্যমে প্রদান করেন এবং বাকী ৯ শতাংশ আইটেম যা আপনি creditণের সাথে অর্থ প্রদান করেন কারণ তা অন্যথায় গোল হয়ে যায়।
পিচবোর্ড_বক্স

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, সুতরাং আপনার মুদ্রিত সংখ্যার যোগফল সঠিক উত্তর নয় এবং তাই এই সমাধানটি ভুল।
নোলেন রয়্যালটি

যখন জবটিতে "মোট" এখনও অন্তর্ভুক্ত ছিল না তখন এই উত্তরটি বিরক্ত হয়েছিল
এএমকে

2
আমি ভয় করছি আমাকে মুছার প্রস্তাব দিতে হবে। প্রশ্নকর্তা প্রয়োজনীয়তাগুলি পরিবর্তন করেন নি - তিনি সেগুলি পরিষ্কার করে দিয়েছিলেন। যদি প্রতিটি আইটেমের জন্য আলাদা আলাদাভাবে দাম চাওয়া হত, তবে কেন একটি "ক্রয়ের ক্রম / একক ক্রয়ের ক্রম" এর উল্লেখ এবং কোনটির পক্ষে সুবিধাজনক?
জন ডিভোরাক

আমি ভুল উত্তর মুছলাম। এখন এটি সংক্ষিপ্ততম পাইথন উত্তরগুলি
এএমকে

0

এপিএল, 58 টি অক্ষর

{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) এবং y4 (মড 5) দামের আইটেম থাকে তবে আপনি min(x, y)সংখ্যক (3, 4) জোড়া তৈরি করতে পারেন যা আপনাকে 2 min(x, y)সেন্ট বাঁচায় । তারপরে আপনি আপনার max(0, x-min(x,y)) / 2সেন্ট বাঁচাতে বাকী 3 টি ব্যবহার করুন if এটি দ্বারাও গণনা করা যায়(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বিবেচনায় নিচ্ছেন বলে মনে হয় না this এই কোডটি কি শেষ পরীক্ষার ক্ষেত্রে ব্যর্থ হয় না?)
পিটার টেলর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.