मुझे एटीएम से कुछ नकद गोल्फ


26

कार्य सरल है। मुझे कुछ मिलता है 1000, 500और 100नोट्स।

कैसे ? आप पूछ सकते हैं। चिंता न करें, बैंक को लूटने की कोई जरूरत नहीं है क्योंकि पास में एक एटीएम है जो आपके क्रेडिट कार्ड को स्वीकार करता है। लेकिन आपकी क्रेडिट सीमा केवल कार्य के लिए पर्याप्त है इसलिए आपको निकासी से सावधान रहना होगा।

चुनौती

कम से कम उन कई नोटों को प्राप्त करने के लिए आवश्यक विशिष्ट निकासी की गणना करें 1000, 500और 100आवश्यक नोटों की संख्या को देखते हुए । प्रत्येक निकासी में, एटीएम निम्नलिखित नियमों के आधार पर प्रत्येक नोट को थूक सकता है:

  • से निकाली गई राशि ( A) से कम है5000
    • अगर A%1000 == 0, तो ATM 1 500नोट, 5 100नोट और बाकी 1000नोट्स खर्च करता है
    • इसके अलावा A%500 == 0, अगर एटीएम में 5 100नोट हैं, तो बाकी 1000नोट
    • अगर A%1000 < 500, एटीएम floor(A/1000) 1000ने नोट उगल दिए और 100नोट बंद कर दिए
    • अगर A%1000 > 500, एटीएम floor(A/1000) 1000ने नोट थमाए , तो 1 500और बाकी के 100नोट
  • निकाली गई राशि के बराबर से अधिक है 5000
    • अगर A%1000 == 0, तो एटीएम 2 500नोट और बाकी 1000नोटों को खर्च करता है
    • अगर, A%500 == 0एटीएम 1 500नोट और बाकी 1000नोटों को खर्च करता है
    • अगर A%1000 < 500, एटीएम floor(A/1000) 1000ने नोट उगल दिए और 100नोट बंद कर दिए
    • अगर A%1000 > 500, एटीएम floor(A/1000) 1000ने नोट थमाए , तो 1 500और बाकी के 100नोट

स्पष्टीकरण के लिए, यहां सभी संभावित राशियों के लिए निकाले गए नोटों की एक पूरी तालिका है 7000(आप अधिक वापस ले सकते हैं, लेकिन पैटर्न बाद में नहीं बदलता है)। आदेश है <1000> <500> <100>:

 100 => 0 0 1                  2500 => 2 0 5                   4800 => 4 1 3
 200 => 0 0 2                  2600 => 2 1 1                   4900 => 4 1 4
 300 => 0 0 3                  2700 => 2 1 2                   5000 => 4 2 0
 400 => 0 0 4                  2800 => 2 1 3                   5100 => 5 0 1
 500 => 0 0 5                  2900 => 2 1 4                   5200 => 5 0 2
 600 => 0 1 1                  3000 => 2 1 5                   5300 => 5 0 3
 700 => 0 1 2                  3100 => 3 0 1                   5400 => 5 0 4
 800 => 0 1 3                  3200 => 3 0 2                   5500 => 5 1 0
 900 => 0 1 4                  3300 => 3 0 3                   5600 => 5 1 1
1000 => 0 1 5                  3400 => 3 0 4                   5700 => 5 1 2
1100 => 1 0 1                  3500 => 3 0 5                   5800 => 5 1 3
1200 => 1 0 2                  3600 => 3 1 1                   5900 => 5 1 4
1300 => 1 0 3                  3700 => 3 1 2                   6000 => 5 2 0
1400 => 1 0 4                  3800 => 3 1 3                   6100 => 6 0 1
1500 => 1 0 5                  3900 => 3 1 4                   6200 => 6 0 2
1600 => 1 1 1                  4000 => 3 1 5                   6300 => 6 0 3
1700 => 1 1 2                  4100 => 4 0 1                   6400 => 6 0 4
1800 => 1 1 3                  4200 => 4 0 2                   6500 => 6 1 0
1900 => 1 1 4                  4300 => 4 0 3                   6600 => 6 1 1
2000 => 1 1 5                  4400 => 4 0 4                   6700 => 6 1 2
2100 => 2 0 1                  4500 => 4 0 5                   6800 => 6 1 3
2200 => 2 0 2                  4600 => 4 1 1                   6900 => 6 1 4
2300 => 2 0 3                  4700 => 4 1 2                   7000 => 6 2 0
2400 => 2 0 4

मार्टिन द्वारा प्रदान की गई सूची

कैच

चूंकि आपके क्रेडिट कार्ड में क्रेडिट सीमा पर्याप्त है, इसलिए आपको यह सुनिश्चित करने की आवश्यकता है कि नोटों में दिए गए इनपुट / आवश्यकता के लिए निकासी के दौरान निकाली गई कुल राशि न्यूनतम संभव है

इनपुट

मूल्य के लिए आवश्यक नोटों की संख्या के अनुरूप तीन संख्याओं के लिए इनपुट किसी भी अनुकूल प्रारूप में हो सकता है 1000, 500और 100। उस ऑर्डर में जरूरी नहीं है।

उत्पादन

आउटपुट एक नई लाइन द्वारा अलग किए गए प्रत्येक लेनदेन में निकाली जाने वाली राशि है।

उदाहरण

इनपुट (प्रारूप <1000> <500> <100>):

3 4 1

आउटपुट:

600
600
600
3600

थोड़ा और:

7 2 5
5000
3500

1 2 3
600
1700

21 14 2
600
600
600
1600
5000
5000
5000
5000
5000

मान्यताओं

  • आप मान सकते हैं कि एटीएम में प्रत्येक राशि के नोटों की अनंत संख्या है।
  • आप यह भी मान सकते हैं कि आप कितने भी लेन-देन कर सकते हैं।
  • इसके अलावा, कुछ इनपुट मूल्यों का समाधान अद्वितीय नहीं हो सकता है, इसलिए आप समाधान के किसी भी 1 को आउटपुट कर सकते हैं जो न्यूनतम संभव राशि और न्यूनतम नोट आवश्यक शर्तों को पूरा करता है।

हमेशा की तरह, आप STDIN / ARGV के माध्यम से एक पूरा प्रोग्राम रीडिंग इनपुट लिख सकते हैं और STDOUT या प्रिंटिंग फ़ंक्शन के लिए तर्कों के माध्यम से इनपुट ले सकते हैं और राशियों की एक सूची या रिटर्न के साथ पूर्णांक की एक सूची या एक नई लाइन द्वारा अलग किए गए मात्रा के साथ एक स्ट्रिंग दे सकते हैं।

यह कोड-गोल्फ है इसलिए बाइट्स जीत में सबसे छोटा कोड है।


@ कुटकी वास्तव में। संपादित।
ऑप्टिमाइज़र

क्या कोई गति प्रतिबंध हैं? क्या अंतिम परीक्षण का मामला 21 14 2उचित समय में समाप्त हो जाना चाहिए ?
जकुबे

1
@ जकुब एक उचित समय में - हाँ (5-6 घंटे से कम बोलें)। लेकिन इस तरह के रूप में, इस कोड-गोल्फ के रूप में कोई सीमा नहीं है।
ऑप्टिमाइज़र

तो, अगर मैं 0 वापस लेता हूं, तो यह मुझे पांच 100 के नोट देगा?
AJMansfield

@AJMansfield बिल्कुल नहीं। आप
अनुकूलक

जवाबों:


7

जावास्क्रिप्ट, 184 148

function g(a,b,c){x=[];while(a>0||b>0||c>0){i=b<3||a<4?a:4;a-=i;if(i>3&&b>1){b-=2;i++}else{i+=(c--<b&&i>4?0:.1)+(b-->0?.5:0)}x.push(i*1e3)}return x}

http://jsfiddle.net/vuyv4r0p/2/

वापसी राशि के अनुरूप पूर्णांक की एक सूची देता है


कोशिश करो g(5,1,1)। एक बेहतर उपाय 5600:।
jimmy23013

अब तय किया जाना चाहिए
हॉफमैले

g(5,1,0), समाधान 5500:।
jimmy23013

यह भी अब तय किया जाना चाहिए ^ ^ यह इंगित करने के लिए धन्यवाद, मुझे बहुत नींद
आनी

g(5,2,0), समाधान 6000:।
jimmy23013

1

पर्ल 5: 223

संपादित करें

यह समाधान एक गलत धारणा के साथ किया गया था कि 7K एटीएम की सीमा है। इसने वास्तव में कार्य को अधिक रोचक बना दिया क्योंकि इसमें गतिशील प्रोग्रामिंग की आवश्यकता थी (चाल पैटर्न काफी नियमित था, लेकिन हार्ड-कोडिंग यह लाइव गणना की तुलना में अधिक लंबा होगा जितना मैंने किया था)। किसी भी राशि संभव के साथ कदम पैटर्न इतना नियमित है कि इसे हार्ड-कोड करना तुच्छ है। मुझे नहीं पता कि @hoffmale द्वारा समाधान अब सही है, लेकिन यह इन पंक्तियों के बीच होगा। इसलिए दुख की बात है कि यह एक और कार्य होगा जहां पहले कोई व्यक्ति समाधान के साथ आता है और फिर उसे जीत के लिए एक गोल्फ की भाषा में चित्रित किया जाता है।

मूल समाधान की तुलना में थोड़ा धीमा (लेकिन 100 से नीचे के मापदंडों के लिए अभी भी उप-सेकंड)।

#!perl -pa
$c{0,0}=$f=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/.(?=.$)/>($n=$c{$i-$`,$j-$'})||${$r=\$c{$i,$j}}<($x=$n+$&)&&$$r
or$f=$$r="$x $n".($'.$&+5*$`)."00
"for 204..206,105,106,11..15,110..114}}$_=$f."100
"x($c-$f+3);s/.*\b3//

तेज़ 259 घोल।

#!perl -pa
$c{0,0}=($a,$b,$c)=@F;for$i(0..$b){for$j(0..$a){
/\B./<($%=$c{$i-$&,$j-$'}+$`)&&(!${$r=\$c{$i,$j}}||$$r>$%)and$d{$i,$j}=$_,$$r=$%for
qw/024 025 026 015 016/,101..105,110..114}}
$d{$b,$a}=~/\B./,$c-=$`,$b-=$&,$a-=$',print$'.$`+5*$&,"00
"while$a+$b;$_="100
"x$c

STDIN का उपयोग करता है:

$perl atm.pl <<<"21 14 2"
5000
5000
5000
5000
5000
600
600
600
1600

कोशिश करो 10 0 0। बेहतर समाधान 10100:।
jimmy23013

@ user23013 उफ़, मैंने सवाल गलत समझा। मैंने मान लिया कि 7k अधिकतम राशि है :( मुझे आशा है कि मैं इसे ठीक करने में सक्षम हो
जाऊंगा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.