「寛大な」金額のローン


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, 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.2または0.02:(
Mr. Xcoder

3
@ Mr.Xcoderの多くの課題では、非常にarbitrarily意的に選択された通貨システムが使用されます。通貨関連の課題で独自のシステムを決定するか、単一のユニバーサルシステムを合意させるか、複数のシステムの使用を許可するか、入力としてシステムをサポートするためにこの課題すべてを行うかどうかを決定するためにメタを作成することができますいくつかの言語の入力検証症状が発生します
Uriel

@ Mr.Xcoderおそらく2ドルの紙幣を考えているのでしょうでしょうか?私はあざけりを考えていました。
ericw31415

回答は、投稿されたものだけに対してすべての入力に対して実行する必要がありますか、それとも小さな入力に対しては機能しますが、4番目の入力に対しては失敗しますか?
jrtapsell

@jrtapsell Input 4は問題を引き起こすべきではありませんか?通常、99は十分な数です。
ericw31415

回答:



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

Kotlin、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つはうまく機能します。

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