আমাকে এটিএম থেকে নগদ কিছু গল্ফ করুন


26

কাজটি সহজ। আমাকে কিছু পান 1000, 500এবং 100নোট।

কীভাবে? আপনি জিজ্ঞাসা করতে পারেন। চিন্তা করবেন না, কাছাকাছি এটিএম রয়েছে যা আপনার ক্রেডিট কার্ড গ্রহণ করে তাই কোনও ব্যাংক ডাকাতির দরকার নেই। তবে আপনার ক্রেডিট সীমা কার্যের পক্ষে যথেষ্ট তাই আপনাকে প্রত্যাহারের বিষয়ে সতর্ক থাকতে হবে।

চ্যালেঞ্জ

প্রয়োজনীয় সংখ্যা এবং নোটগুলি দেওয়া 1000, কমপক্ষে many অনেকগুলি নোট পেতে প্রয়োজনীয় নির্দিষ্ট প্রত্যাহার গণনা করুন। প্রতিটি প্রত্যাহারে, এটিএম নিম্নলিখিত নিয়মগুলির উপর ভিত্তি করে নোটের প্রতিটিকে থুতু ফেলতে পারে:500100

  • উত্তোলিত পরিমাণ ( A) এর চেয়ে কম5000
    • যদি A%1000 == 0তা হয় তবে এটিএম 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 ঘন্টা কম বলুন)। তবে এর মতো কোনও সীমা নেই কোড-গল্ফ।
— অপ্টিমাইজার 13

সুতরাং, আমি যদি 0 প্রত্যাহার করি, তা আমাকে পাঁচটি নোট দেবে?
— এজেম্যান্সফিল্ড 21'15

@ আজেমনসফিল্ড অবশ্যই না। আপনি 0 টি পরিমাণ
— অপটিমাইজার

উত্তর:


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।
— জিমি 23013

এখনই ঠিক করা উচিত
— হফমলে

g(5,1,0), সমাধান: 5500।
— জিমি 23013

এখন এটিও স্থির করা উচিত
— poin

g(5,2,0), সমাধান: 6000।
— jimmy23013

1

পার্ল 5: 223

সম্পাদন করা

এই সমাধানটি একটি ভুল অনুমান দিয়ে করা হয়েছিল যে 7K এটিএম সীমা। এটি গতিশীল প্রোগ্রামিংয়ের প্রয়োজনীয়তার কারণে এটি কার্যটি আরও আকর্ষণীয় করে তুলেছে (সরানোর ধরণটি বেশ নিয়মিত ছিল, তবে হার্ড-কোডিং এটি আমার মতো লাইভ গণনার চেয়ে দীর্ঘতর হবে)। যে কোনও পরিমাণের সাথে মুভ প্যাটার্নটি এতটাই নিয়মিত যে এটি হার্ড-কোডের জন্য তুচ্ছ। আমি জানি না যে @ হফমলে দ্বারা সমাধান এখন সঠিক কিনা, তবে এটি এই লাইনের মধ্যে থাকবে। সুতরাং দুঃখের বিষয় এটি অন্য কাজ হবে যেখানে প্রথমে কেউ সমাধান নিয়ে আসে এবং তারপরে এটি জয়ের জন্য একটি গল্ফ ভাষাতে পোর্ট হয়ে যায়।

মূল সমাধানের তুলনায় কিছুটা ধীর গতির (তবে 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।
— জিমি 23013

@ ব্যবহারকারী23013 ওহো, আমি প্রশ্নটি ভুল বুঝেছি। আমি ধরে নিয়েছি 7 কে সর্বাধিক পরিমাণ :( আমি আশা করি আমি এটি ঠিক করতে সক্ষম
— হবো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.