贷款“大量”的钱


12

介绍

您有一个不断向您要贷款的朋友,您对此感到厌倦。今天,他再次来借钱。您不会拒绝他的提议,而是有了一个好主意:通过给他的朋友尽可能多的硬币/票据来拖曳他的朋友。

挑战

您将输入:您的朋友想要贷款的金额以及您拥有的硬币/票据的金额。对于此挑战,可能的面额为$ 20.00,$ 10.00,$ 5.00,$ 2.00,$ 1.00,$ 0.25,$ 0.10,$ 0.05和$ 0.01。输入的一个示例是,5.67, [5, 3, 4, 5, 5, 9, 8, 1, 2]如果您的朋友想要5.67美元,并且您有5张20美元的钞票,3张10美元的钞票等。您的输出将是能给您的朋友尽可能多的金属/纸张/塑料的硬币/钞票的数量。

如果不可能给您的朋友确切的金额,请给他您可以支付的最接近的金额,该金额要大于他想要的金额。例如,如果您的朋友想要$ 0.07但您只有$ 0.07 [0, 0, 0, 0, 0, 2, 4, 2, 0],则给他2个$ 0.05硬币(而不是1个$ 0.10,因为那样会给他尽可能多的硬币!)。

如果您的朋友想要的钱比您多,请把所有的钱都给他(并祈祷您不需要购买任何东西)。

测试用例

Input:  6.54, [9, 8, 7, 6, 5, 4, 3, 2, 4]
Output: [0, 0, 0, 1, 4, 1, 2, 1, 4]

Input:  2, [0, 1, 0, 0, 0, 0, 0, 0, 0]
Output: [0, 1, 0, 0, 0, 0, 0, 0, 0]

Input:  9999, [0, 0, 0, 0, 0, 0, 0, 0, 1]
Output: [0, 0, 0, 0, 0, 0, 0, 0, 1]

Input:  0, [99, 99, 99, 99, 99, 99, 99, 99, 99]
Output: [0, 0, 0, 0, 0, 0, 0, 0, 0]

这是因此最短的代码获胜。


您有2.0020.00但没有0.20.02:(
Xcoder先生17年

3
@ Mr.Xcoder使用非常随意选择的货币系统会遇到很多挑战。我们可能想做一个元数据来决定与货币相关的挑战是否应该确定自己的系统,是否同意一个通用系统,允许使用多个系统,甚至使所有这些挑战也支持该系统作为输入,尽管这可能导致某些语言的输入验证症状
Uriel

@ Mr.Xcoder也许您正在考虑两美元的钞票?我在想香椿。
ericw31415 17/12/24

我们的答案是否需要针对所有输入(仅针对已发布的输入)运行,或者它们只能用于较小的输入,但对于第四输入却失败?
jrtapsell

@jrtapsell输入4应该不会引起问题吗?99通常足够小。
ericw31415

Answers:


1

干净,167字节

import StdEnv
@n l#m=[p\\p<-[[if(y==u)(x-1)x\\x<-l&y<-[0..]]\\u<-[0..]&v<-l|v>0]|sum[a*b\\a<-[2000,1000,500,200,100,25,10,5,1]&b<-p]>=toInt(n*100.0)]
|m>[]= @n(hd m)=l

定义函数@,接受Real[Int]

在线尝试!


0

JavaScript,213字节

x=>y=>(F=(x,y,z,u=9)=>u--?[...Array(y[0]+1)].map((_,i)=>F(x-i*[1,5,10,25,100,200,500,1e3,2e3][u],y.slice(1),[...z,i],u))&&G:x>0||G.push([z,x-1/eval(z.join`+1+`)]),F(x*100,y,G=[]).sort((a,b)=>b[1]-a[1])[0]||[y])[0]

它非常慢并且占用内存,因此只能尝试小情况


0

科特林,298字节

{t,c->with(c.fold(listOf(listOf<Int>())){o,x->o.flatMap{a->(0..x).map{a+it}}}.groupBy{it.zip(C).map{(a,b)->a*b}.sum()}.mapValues{(_,b)->b.maxBy{it.sum()}!!}.toSortedMap().asSequence()){firstOrNull{it.key==t}?:firstOrNull{it.key>t}?:last()}.value}
val C=listOf(20.0,10.0,5.0,2.0,1.0,0.25,.1,.05,.01)

美化

        { t, c ->
            with(c.fold(listOf(listOf<Int>())) { o, x ->
                o.flatMap { a -> (0..x).map { a + it } } /* Get all of the options. */
            }.groupBy { it.zip(C).map { (a, b) -> a * b }.sum() }
                .mapValues { (_,b)->b.maxBy { it.sum() }!! }
                .toSortedMap().asSequence()) {
                firstOrNull { it.key == t } ?:
                        firstOrNull { it.key > t } ?:
                        last()
            }.value
        }
val C = listOf(20.0, 10.0, 5.0, 2.0, 1.0, 0.25, .1, .05, .01)

测试

val calc: (target: Double, coins: List<Int>) -> List<Int> =
{t,c->with(c.fold(listOf(listOf<Int>())){o,x->o.flatMap{a->(0..x).map{a+it}}}.groupBy{it.zip(C).map{(a,b)->a*b}.sum()}.mapValues{(_,b)->b.maxBy{it.sum()}!!}.toSortedMap().asSequence()){firstOrNull{it.key==t}?:firstOrNull{it.key>t}?:last()}.value}
val C=listOf(20.0,10.0,5.0,2.0,1.0,0.25,.1,.05,.01)

data class Test(val target: Double, val input: List<Int>, val output: List<Int>)

val tests = listOf(
        Test(2.0, listOf(0, 1, 0, 0, 0, 0, 0, 0, 0), listOf(0, 1, 0, 0, 0, 0, 0, 0, 0)),
        Test(9999.0, listOf(0, 0, 0, 0, 0, 0, 0, 0, 1), listOf(0, 0, 0, 0, 0, 0, 0, 0, 1)),
        Test(6.54, listOf(9, 8, 7, 6, 5, 4, 3, 2, 4), listOf(0, 0, 0, 1, 4, 1, 2, 1, 4)),
        Test(0.0, listOf(99, 99, 99, 99, 99, 99, 99, 99, 99), listOf(0, 0, 0, 0, 0, 0, 0, 0, 0))
)

fun main(args: Array<String>) {
    for (t in tests) {
        if (t.output != calc(t.target, t.input)) {
            throw AssertionError()
        } else {
            println("Passed")
        }
    }
}

示例4导致OutOfMemory,但其他3个工作良好。

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.