制定变更[关闭]


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 2011年

奖励积分如何工作?就算最短的程序有什么关系?
gnibbler 2011年

@gnibber引用斯蒂芬·弗莱(Stephen Fry)的话:“ [点数]由按人口统计学选择的客户服务重点咨询机构公正地确定,并按年龄和性别(即我)细分。”
Thomas O

我要问50分,因为我还没有看到50分硬币。但显然它们存在:usmint.gov/kids/coinnews/circulating/50centCoin.cfm
Martin York

Answers:


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.5等于1.53。

如果不需要满足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,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

OP未指定输入/输出格式。
J42161217

这个问题不使用100美元的钞票,也没有奖金。
ericw31415

ok.fixed并保存一些字节!至于奖金,我恳请您再次阅读问题。尤其是部分..“支持其他货币的奖励积分”
J42161217

哎呀,我想那时候我没看到!
ericw31415

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")

使用贪婪算法。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.