这一挑战使美分


29

我知道,标题使您不寒而栗


鉴于货币输出量最少的硬币弥补这一数额

例子

0.1
1 dime

0.01
1 penny

0.28
1 quarter 3 penny

0.56
2 quarter 1 nickel 1 penny

1.43
5 quarter 1 dime 1 nickel 3 penny

规格

  • 一美元兑换100美分。
  • 每种硬币的价值为:
    • penny 1分
    • nickel 5美分
    • dime 10美分
    • quarter 25美分

不允许琐碎此任务的内置。

输入输出

输入的是小数,代表总计的美元价值

  • 无需多元化
  • 顺序:quarter->penny
  • 输出应为 <#_of_coins> <coin type>
  • 分隔符:,,

唯一允许的尾随空格是单个尾随换行符/空格。


如果硬币类型为零,则不应显示该硬币类型。例如0.25-> 1 quarter 1 quarter 0 dime 0 nickel 0 penny


@VoteToClose不,但我允许逗号作为分隔符
Downgoat

最后一个示例是1.43,它大于1
Luis Mendo

@LuisMendo哦,糟糕,该(less than 1)部分不应该在那里。我猜忘了删除沙箱中的内容
Downgoat '16

输出是否可以2 quarter(2 spaces)1 nickel 1 penny
Conor O'Brien

1
@DigitalTrauma 13.00可以是可能的输入,但输入永远不会是13。我将始终使用小数点
Downgoat '16

Answers:


5

果酱,60

q~e2i[25A5]{md}/]" quarterx dimex nickelx penny"'x/.+{0#},S*

这个脚本似乎还有很多改进的余地,但是比目前任何一个都短。这利用了内置的“ md”命令,该命令同时返回除法的整数结果和余数。它执行以下操作:

  • 读取输入(如果它是一个函数,我想您可以删除q〜少两个字符)
  • 输入乘以100并将其转换为整数
  • 使用[25 10 5]执行“ md”,这将导致堆栈中的余数
  • 结合数字和硬币名称
  • 如果前者为0,则删除数字和硬币名称
  • 加前数零

在这里尝试

先前版本:

q~e2i[25A5]{md}/]_:!:!" quarter x dime x nickel x penny"'x/.*.+e_0-
q~e2i[25A5]{md}/]_:!:!\" quarter x dime x nickel x penny"'x/.+.*

11

JavaScript ES6,107个字节

n=>((n*=100)/25|0)+` quarter ${(n%=25)/10|0} dime ${n%10/5|0} nickel ${n%5|0} penny`.replace(/ ?0 \S+/g,"")

简单的数学。


不错的工作!我认为有一个封闭式的解决方案
Conor O'Brien

?如果该硬币类型为零,这不是输出硬币类型吗?
弗伦托斯

@Frentos不,结尾处有一个正则表达式,可删除零个硬币类型的硬币
Downgoat

@Doᴡɴɢᴏᴀᴛ:对不起,在没有视觉提示的情况下,文本区域没有正确滚动:-)
Frentos '16

您需要|0之后的n%5吗?
尼尔

11

Python 2,120字节

n=int(round(input()*100))
a=25
for b in"quarter","dime","nickel","penny":
 if n>=a:print"%d "%(n/a)+b,
 n%=a;a=40/a+5^12

为了安全起见,至少现在已经更改为肯定可以修复@Ogaday的评论的内容。我不确定我是否也需要它int(),但是我很难说服自己不需要。

print`n/a`+" "+b,

是一个多余的字节,但是L为大型输入打印了一个额外的字节(尽管由于浮点精度,此代码对于超大型输入还是不起作用)。


1
您花了我所有的时间来改善我的解决方案,以使Mego不再浪费。干得好!
亚历山大·雷沃(Alex Revo)

1
+1-我希望我知道您曾经想出了什么魔术a=40/a+5^12
Digital Trauma

@DigitalTrauma尝试了一堆算术运算符,例如[x^k for x in [10, 5, 1]]和,[k/y for y in [25, 10, 5]]用于和k,然后看到两个列表被5抵消。
Sp3000 '16

实际上在10.03和的输入上(至少对我而言)失败10.04。这与Python的float表示以及如何将它们四舍五入为整数有关。尝试"print %d"%(10.03*100)
Ogaday '02

n=int(''.join(raw_input().split(".")))可能有用,但是很冗长。
Sherlock9'2

7

直流,104

“可读性”添加了换行符:

[dn[ quarter ]n]sq
[dn[ dime ]n]sd
[dn[ nickel ]n]sn
[d1/n[ penny ]n]sp
?A0*
25~rd0<qst
A~rd0<dst
5~rd0<nst
d0<p

15
dc:现在具有Readability™
Alex A.

6

视网膜,97

(与往常一样)感谢@randomra-保存了1个字节。

假设输入形式为xxx.yyxxx.y

\..$
$&0
\.

.+
$0$*:
(:{25})+
$#1 quarter 
(:{10})+
$#1 dime 
(:{5})+
$#1 nickel 
(:)+
$#1 penny

在线尝试。


1
$&与相同,$0因此您可以在$0.0by中保存一个字节$&0
randomra

通过输入类似0.9999999的内容,输出有点疯狂
Anthony Pham

@PythonMaster当美联储开始铸造10便士硬币时,我会为此提供支持;-)
Digital Trauma

4

Vitsy,110个 100 97字节

是的,等等,我仍在解决这个问题。

aa**Dv52^1m([N' retrauq 'Z]v52^MDva1m([N' emid 'Z]vDvaM51m([N' lekcin 'Z]v5MD([N'ynnep 'Z]
/D1M-D

即将推出的详细模式说明:

push a;
push a;
multiply top two;
multiply top two;
duplicate top item;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " quarter ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
push 2;
push second to top to the power of top;
modulo top two;
duplicate top item;
save top as temporary variable;
push a;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " dime ";
output stack as chars;
end recursive area;
save top as temporary variable;
duplicate top item;
save top as temporary variable;
push a;
modulo top two;
push 5;
push 1;
goto top method;
if (int) top is 0;
begin recursive area;
output top as number;
push " nickel ";
output stack as chars;
end recursive area;
save top as temporary variable;
push 5;
modulo top two;
duplicate top item;
if (int) top is 0;
begin recursive area;
output top as number;
push " penny";
output stack as chars;
end recursive area;
:
divide top two;
duplicate top item;
push 1;
modulo top two;
subtract top two;
duplicate top item;

在线尝试!


2
retrauq几乎看起来像一个词...
Conor O'Brien

永久链接无法正常工作
-Downgoat

已修复,对不起。旧代码链接。:P
Addison Crump

3

Java 8 lambda,165个字节

期望输入y为double或float。

y->{int c,d=(int)(y*100);return(((c=d/25)>0)?c+" quarter ":"")+(((c=(d=d%25)/10)>0)?c+" dime ":"")+(((c=(d=d%10)/5)>0)?c+" nickel ":"")+(((d=d%5)>0)?d+" penny":"");}

这么多的三元。;-;


;-;那是什么?那是黄w吗?
烧杯

@烧杯哭。
Addison Crump

2

的JavaScript ES6,202个 200字节

我希望这可以打高尔夫球...

r=>eval('i=[.25,.1,.05,.01];v=[0,0,0,0];for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join` `.replace(/ +/g," ")')

取消程式码:

function m(r){
    i=[.25,.1,.05,.01]
    v=[0,0,0,0]
    for(k=0;k<4;k++)for(;r>=i[k];v[k]++,r-=i[k],r=((r*100+.01)|0)/100);
    return v.map((x,i)=>x?x+" "+"quarter0dime0nickel0penny".split(0)[i]:"").join(" ").replace(/ +/g," ");
}

2

LabVIEW,62个LabVIEW原语

我为名称和值创建了2个数组,并使用模运算符(R IQ事物)从顶部(带有i的索引数组)遍历它们。剩余的硬币将传递到移位寄存器中。

如果该值大于0,则将数字转换为字符串,然后将传递的字符串与数字和硬币名称连接起来,然后将其放回移位寄存器。

Ijus意识到我的gif没有显示错误的大小写,但是无论如何都看不到,它只是通过输入的字符串。


“原始”与字节相比如何?当x <y时,“ x基本类型”击败“ y字节”吗?只是问问
Luis Mendo

您可以检查链接以了解如何计算基元。以字节为单位提供labview代码的大小是没有用的,因为一个空的vi已经有大约10kb的大小。根据经验,在高尔夫球语言中,原语比字节多一些,因此在CJam等语言中,原语大约为50-60字节。
Eumel

1
@LuisMendo我们无法将每个LabView文件的信息内容的每个原语绑定一个字节,因此将LabView计数为每个原语一个字节是不公平的。
lirtosiast '16

@ThomasKwa tbh具有良好的高尔夫球语言,您可能可以做到,每个操作每个输入循环1字节1线/线的for 2-4字节,而while是3个原语,依此类推
Eumel

2

Japt,77个字节

` {U*=L /25|0} quÂòr {U%=25 /A|0} ÜX {U%A/5|0} Íõel {U%5|0} p¿ny` r" 0 %S+" x

幸运的是,所有四个硬币名称都是可压缩的。的¿应为原义字节0x81。在线测试!


只需尝试使用一些随机输入,就可以在18.33:上降低1美分73 quarter 1 nickel 2 penny。73 * .25 + 1 * .05 + 2 * .01 = 18.32,而不是18.33。
D. Strout '16

2

C,147 144 142 140个字节

a[]={25,10,5,1},m,i=0;f(float n){for(m=n*100;i<4;m%=a[i++])m/a[i]&&printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);}

取消测试:

#include <stdio.h>

a[]={25,10,5,1},m,i=0;

f(float n)
{
    for(m=n*100;i<4;m%=a[i++])
        if(m/a[i])
            printf("%d %s ",m/a[i],(char*[]){"quarter","dime","nickel","penny"}[i]);
}

int main()
{
    float test[] = {.1, .01, .28, .56, 1.43};
    for(int j = 0; j < 5; i = 0)
    {
        f(test[j++]);
        printf("\n");
    }
}

1
也许尝试更换char*[]char**int a[]int*a,并把m%=a[i++]在for循环的最后一部分。应该保存4个字节。尚未测试过,因此请尝试每个。
塔克拉

@ minerguy31如果我使用指针而不是数组,那么我将无法使用列表初始化器。m%=a[i++]不过有点感动,谢谢。
亚历山大·雷沃(Alex Revo)

1
同样,您也许可以替换if(m/a[i])m/a[i]&&来节省2个字节。
塔克拉

也可以尝试"quarter\0dime\0nickel\0penny"在printf中使用。每个\ 0终止字符串,每个节省1个字符
takra

@ minerguy31与string一起使用\0会导致程序崩溃。我不确定无论如何迭代都应该在这样的字符串上工作。
亚历山大·雷沃


1

JavaScript中,156个 145 144字节

与ETHproduction的公式答案不匹配,但是无论如何...

function c(t){n=['quarter','dime','nickel','penny'];v=[.25,.1,.05,.01];s='';for(i in v){c=t/v[i]|0;if(c>0)s+=c+' '+n[i]+' ';t-=c*v[i];}return s}

这是我第一次打高尔夫球,因此任何改进都将受到赞赏!我已经偷了ETH的“ xor trunc”-抱歉,这太聪明了:-)

更具可读性:

function c(t)
{
  n = ['quarter', 'dime', 'nickel', 'penny'];
  v = [.25, .1, .05, .01];
  s = '';
  for(i in v)
  {
    c = t/v[i]|0;
    if(c>0) s += c+' '+n[i]+' ';
    t -= c*v[i];
  }
  return s
}

注意:在测试时,我意识到JavaScript(至少在我的机器上?)划分1.13 / 0.011.12999...,导致我(可能还有其他所有JS提交)无法正常工作100%...


我认为您不需要最后一个分号。
Downgoat '02

0

Perl的5 - 128个 124字节

我想这可以重写得短得多,但我真的看不到。

$s=<>*100;@v=($s/25,$s%2.5,$s%25%10/5,$s%250%5);map{$l=int($_);print$l.$".qw(quarter dime nickel penny)[$i].$"if$l>0;$i++}@v

编辑:只是一个数学技巧来保存4个字符。


0

Perl 6,96个字节

$/=get;put map {$_=Int($//$^a);$/%=$a;"$_ $^b" if $_},<.25 quarter .1 dime .05 nickel .01 penny>
$/ = get; # set $/ to the input

# print the following list with spaces between
# and a newline at the end
put map {
  # the parameters to this block are $a, and $b
  # which are declared as placeholder parameters $^a, and $^b

  $_ = Int( $/ / $^a ); # set $_ to the count of the current coin

  $/ %= $a;             # set $/ to the modulus of itself and the current coin

  "$_ $^b" if $_        # return a string if $_, otherwise return Empty
},
<
  .25 quarter
  .1  dime
  .05 nickel
  .01 penny
>

用法:

for amount in  0.1  0.01  0.28  0.56  1.43; do
  echo $amount | perl6 -e'…';
done
1 dime
1 penny
1 quarter 3 penny
2 quarter 1 nickel 1 penny
5 quarter 1 dime 1 nickel 3 penny

0

Python 2中,167个 161字节

更新1:窃取Sp3000的想法,即使用input()并使我的代码成为脚本而不是函数。

a=input()*100;k={25:0,10:0,5:0,1:0}
for i in k:k[i]=a//i;a%=i
print' '.join(['%d %s'%(k[x],{25:'quarter',10:'dime',5:'nickel',1:'penny'}[x]) for x in k if k[x]])

0

C,162字节

不幸的是,如果没有,则无法使用#include

#include <stdlib.h>
i,a[]={25,10,5,1};main(c,v)char**v;{for(c=atof(v[1])/.01;c;c%=a[i++])c/a[i]?printf("%d %s ",c/a[i],"quarter\0dime\0   nickel\0 penny"+8*i):0;}

不打高尔夫球

#include <stdlib.h>

i,a[]={25,10,5,1}; /* loop index, coin values */

main(c,v) char**v;
{
    /* Get dollar amount from command line, convert to pennies */
    for (c=atof(v[1])/.01;c;c%=a[i++]) /* loop while still change... */
    {
        c/a[i] /* if there are coins at this index... */
            ? printf("%d %s ", c/a[i], "quarter\0dime\0   nickel\0 penny"+8*i) /* print out how many */
            : 0;
    }
}

0

LUA 5.3,141个 139 132 131字节

某种程度上是基于Sp3000的Python答案,但是有我自己的魔术公式。

n=.5+100*io.read'n'a=25
for s in("quarter dime nickle penny "):gmatch".- "do
_=n<a or io.write(s,~~(n//a)," ")n=n%a
a=35%a|#s%2
end

编辑-改进了a公式。以前是a=a*3%13~#s%4

编辑2-以前我math.ceil用来四舍五入并转换为整数。现在我//要四舍五入并添加~~以转换为整数。

编辑3-通过将图案从更改为"%w+ "来剃光角色".- "


0

K(oK)95 78字节

解:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*

在线尝试!

例:

{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.92
"3 quarter 1 dime 1 nickel 2 penny"
{" "/,/`quarter`dime`nickel`penny{("";$y,x)y>0}'(-c,1)!'{y!x}\x,c:25 10 5}100*0.95
"3 quarter 2 dime"

说明:

根据每个硬币对输入进行模运算,然后将结果除以硬币。

将每个结果与硬币名称一起输入一个函数,如果硬币数量为非零,则返回两者的字符串值。

将所有内容弄平,并与空白一起加入。


0

Kotlin,147个字节

{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

美化

{
    listOf(
            "quarter" to 25,
            "dime" to 10,
            "nickel" to 5,
            "penny" to 1).fold((it * 100).toInt()) { d, (n, a) ->
        val z = d / a
        if (z > 0) {
            print("$z $n ")
            d - (z * a)
        } else d
    }
}

测试

import java.io.ByteArrayOutputStream
import java.io.PrintStream

var f:(Double)->Unit =
{listOf("quarter" to 25,"dime" to 10,"nickel" to 5,"penny" to 1).fold((it*100).toInt()){d,(n,a)->val z=d/a
if(z>0){print("$z $n ")
d-(z*a)}else d}}

val TEST = listOf(
        0.1 to "1 dime",
        0.01 to "1 penny",
        0.28 to "1 quarter 3 penny",
        0.56 to "2 quarter 1 nickel 1 penny",
        1.43 to "5 quarter 1 dime 1 nickel 3 penny"
)

fun main(args: Array<String>) {
    val temp = ByteArrayOutputStream()
    System.setOut(PrintStream(temp))
    for ((input, output) in TEST) {
        temp.reset()
        f(input)
        println()
        val text = temp.toString().trim()
        if (text != output) {
            throw AssertionError("$input '$output' != '$text'")
        }
    }
}

蒂奥

在线试用

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.