ATMで現金をゴルフしてください


26

タスクは簡単です。私にいくつかの取得1000500および100ノートを。

どうやって ?あなたが尋ねるかもしれません。心配しないでください。クレジットカードを受け入れるATMが近くにあるので、銀行を強奪する必要はありません。ただし、クレジット限度額はタスクに十分であるため、引き出しには注意する必要があります。

チャレンジ

数を考えると1000500そして100ノートが必要な、少なくともそれらの多くのノートを取得するために必要な特定の引き出しを計算します。各引き出しで、ATMは次のルールに基づいて各メモを吐き出すことができます。

  • 引き出し金額(A)は以下5000
    • の場合A%1000 == 0、ATMは1 500音、5 100音、休符を吐き出し1000ます
    • それ以外の場合A%500 == 0、ATMは5つの100ノート、残りの1000ノートを吐き出します
    • それ以外の場合A%1000 < 500、ATMはfloor(A/1000) 1000メモと休符を吐き出し100ます
    • それ以外の場合A%1000 > 500、ATMはfloor(A/1000) 1000ノート、1 500および残りの100ノートを吐き出します
  • 引き出し金額が等しい 5000
    • の場合A%1000 == 0、ATMは2つの500ノートと残りの1000ノートを吐き出します
    • それ以外の場合、A%500 == 0ATMは1つの500メモと休符を吐き出し1000ます
    • それ以外の場合A%1000 < 500、ATMはfloor(A/1000) 1000メモと休符を吐き出し100ます
    • それ以外の場合A%1000 > 500、ATMは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

マーティンが提供するリスト

キャッチ

クレジットカードの与信限度額は十分であるため、出金全体で出金される合計額が、特定のメモの入力/要求に対して可能な最小額であることを確認する必要があります。

入力

入力値を必要と音符の数に対応する3つの数字のために任意の好都合なフォーマットにすることができ1000500そして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

仮定

  • ATMには、各金額の無数のメモがあると仮定できます。
  • また、任意の数のトランザクションを作成できると想定することもできます。
  • さらに、一部の入力値に対するソリューションは一意ではない可能性があるため、可能な最小量と最小ノート要件を満たすソリューションのいずれか1つを出力できます。

通常どおり、STDIN / ARGVを介して入力を読み取り、引数を介して入力を受け取る関数に出力を出力し、金額に対応する整数のリストまたは金額を改行で区切った文字列のいずれかを返す完全なプログラムを作成できます。

これはコードゴルフなので、バイト単位の最短コードが優先されます。


@nutki確かに。編集済み。
オプティマイザー

速度制限はありますか?最後のテストケース21 14 2は妥当な時間で終了する必要がありますか?
ジャクベ

1
@ジャクベ妥当な時間-はい(5〜6時間未満)。しかし、このように、これはコードゴルフであるため、制限はありません。
オプティマイザー

したがって、0を撤回した場合、5つの100ノートが得られますか?
-AJMansfield

@AJMansfieldはもちろんです。金額0を引き出すことはできません
オプティマイザー

回答:


7

JavaScript、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

今すぐ修正する必要があります
-hoffmale

g(5,1,0)、解決策:5500
jimmy23013

これも修正する必要があります^^指摘してくれてありがとう、私は眠すぎなければならない
-hoffmale

g(5,2,0)、解決策:6000
jimmy23013

1

Perl 5:223

編集

この解決策は、7KがATM制限であるという誤った仮定で行われました。これにより、動的プログラミングが必要になったため、実際にタスクがより面白くなりました(移動パターンは非常に規則的でしたが、ハードコーディングは、ライブの計算よりも長くなる可能性があります)。可能な限り、移動パターンは非常に規則的であるため、ハードコーディングするのは簡単です。@hoffmaleによる解決策が現在正しいかどうかはわかりませんが、これらの行に含まれるでしょう。残念なことに、最初に誰かが解決策を見つけ、それからゴルフ言語に移植して勝つという別のタスクになります。

元のソリューションよりも少し遅い(ただし、100未満のパラメーターの場合は1秒未満)。

#!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が最大量であると仮定しました:(私はそれを修正できることを望みます。
nutki15年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.