ワークアウト変更[終了]


10

自動レジ用のプログラムを書いています。使用するコインの数を最小限に抑えて、ユーザーに変更を加える必要があります。金額(たとえば$ 1.53)を取り、米国の金種に変更を加えるプログラムを作成します。この例では、1 x 1ドル紙幣、1 x 50セント、3 x 1セントです。最短のプログラムが勝者となります。他の通貨(つまり、英国の宗派)と異常な通貨(1、2、3セント?)をサポートするためのボーナスポイント

1セント、5セント、10セント、25セント、50セント、1ドル(紙幣または硬貨)、2ドル、5ドル、10ドル。

英国の額面は1ペンス、2ペンス、5ペンス、10ペンス、20ペンス、50ペンス、1ポンド、2ポンド、5ポンド(紙幣または硬貨)、10ポンドです。


3
これはおそらく少し説明が必要です。最初に、コインの数を最小にするように指定する必要があります(これにより、ボーナスの質問が少し面白くなります。たとえば、{1c、49c、50c}および98cは単純なアルゴリズムを破ります)。次に、入力/出力形式が便利です。(構成通貨の)取得不可能な値の処理の詳細が役立ちます。最後に、ここに宗派をリストすることもできます。そうすれば、知らない人が調べなくても済むようになります。
— Nabb

ボーナスポイントはどのように機能しますか?最短プログラムに同点がある場合はどうなりますか?
— ニブラー

@ gnibber、Stephen Fryの引用:「[ポイントは]年齢と性別で分類された、人口統計的に選択されたカスタマーサービスフォーカスコンサルタントによって公平に決定されます。
— Thomas O

まだ50セント硬貨を見たことがないので、50cを要求します。しかし、どうやらそれらは存在します:usmint.gov/kids/coinnews/circulating/50centCoin.cfm
— マーティンヨーク

回答:


2

Windows PowerShell、108 111 117

これまでゴルフをしたことがない、非常に最初の試み:

$i=+("$input"-replace'[^\d.]')
$args|%{0d+$_}|sort -des|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

実装上の注意:

  1. パイプラインを介して返品する数量を受け入れます
  2. コマンドラインを介して通貨の種類のリストを受け入れます
  3. 数量は通貨記号で指定できます。それは取り除かれます(実際には、数値以外のもの)。
  4. 宗派のリストをソートする必要はありません。
  5. プログラムは、指定された金種で達成可能な要求数量よりも小さい最大の変化を出力します。つまり、1セント硬貨がない場合、1.53の場合は1.5になります。

3と4を満足する必要がない場合(つまり、入力形式を制御する;-))、次のプログラムで十分です(71)。

$i=+"$input"
$args|%{$a=[math]::floor($i/$_)
if($a){$i-=$a*$_
"$a×$_"}}

2

Mathematica:110文字

Sort[IntegerPartitions[Rationalize@#,Infinity,{10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
    Length@#1<Length@#2&][[1]]&  

使用法

%[0.98]  
{1/100, 1/100, 1/100, 1/10, 1/10, 1/4, 1/2}  

または

Tally@Sort[IntegerPartitions[Rationalize@#,Infinity,
                             {10,5,2,1,1/2,1/4,1/10,5/100,1/100}],
     Length@#1<Length@#2&][[1]]&  

(6文字以上)与える

{{1/100, 3}, {1/10, 2}, {1/4, 1}, {1/2, 1}}

他の額面については、有理数テーブル{10、....、5 / 100,1 / 100}を変更するだけです


2

D:225キャラクター

import std.algorithm,std.conv,std.stdio;void main(string[]args){auto m=args[1].findSplit(".");void p(T,S)(T t,T u,S s){foreach(v;[u,10,5,1]){writefln("%s %s%s",t/v,v,s);t-=(t/v)*v;}}p(to!int(m[0]),20,"");p(to!int(m[2]),25,"/100");}

より読みやすく:

import std.algorithm,std.conv,std.stdio;

void main(string[] a)
{
    auto m = a[1].findSplit(".");

    void p(T, S)(T t, T u, S s)
    {
        foreach(v; [u, 10, 5, 1])
        {
            writefln("%s %s%s", t / v, v, s);
            t -= (t / v) * v;
        }
    }

    p(to!int(m[0]), 20, "");
    p(to!int(m[2]), 25, "/100");
}

米国通貨のみを取り扱います。コマンドラインで値を浮動小数点値として取得します(1ドル未満の値の場合は、先頭に0が必要です)。値の一部として$を受け入れません。各タイプの紙幣/コインの数を別々の行に出力します。たとえば、1.53の入力は次のようになります。

0 20
0 10
0 5
1 1
2 25/100
0 10/100
0 5/100
3 1/100


1

Mathematica、51バイト

#~NumberDecompose~{10,5,2,1,.5,.25,.1,.05,.01}&

入力

[1.53]

出力

{0、0、0、1、1、0、0、0、3。}


Mathematica、82バイト-ボーナス付き-

(s=#~NumberDecompose~#2;Row@Flatten@Table[Table[#2[[i]]"+",s[[i]]],{i,Length@s}])&

入力

[37.6、{15、7、2.5、1、0.88、0.2、0.01}]

出力

15 +15 +7 +0.2 +0.2 +0.2 +


ええと、この質問は、複製とは異なる宗派を使用しています。
— ericw31415 2017年

OPは入出力形式を指定しません。
— J42161217 2017年

この質問は100ドル札を使用せず、ボーナスもありません。
— ericw31415 2017年

ok.fixedしていくつかのバイトを保存しました!おまけについては、もう一度質問を読んでいただきたい。特に..「他の通貨をサポートするためのボーナスポイント」
— J42161217

おっと、私はそれを見ていなかったと思います!
— ericw31415 2017年

1

JavaScript、84 83バイト

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>{for(i in v)l[i]=n/v[i]|0,n%=v[i];return l}

(n,v=[10,5,2,1,.5,.25,.1,.05,.01],l=[])=>eval("for(i in v)l[i]=n/v[i]|0,n%=v[i];l")

貪欲なアルゴリズムを使用します。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.