“관대 한”금액의 대출


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]하고 있는 경우 , $ 0.05 동전 2 개를 주어야합니다 (가능한 한 많은 동전을주지 않기 때문에 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.00하고 20.00있지만 0.20.02:(
씨 Xcoder에게

3
@ Mr.Xcoder의 많은 과제는 매우 임의로 선택된 통화 시스템을 사용합니다. 우리는 통화 관련 과제가 자체 시스템을 결정해야하는지, 단일 범용 시스템이 합의되었는지, 여러 시스템의 사용을 허용하거나,이 모든 과제를 수행하여 시스템을 입력으로 지원해야하는지 여부를 결정하기 위해 메타를 만들고 싶을 수도 있습니다. 일부 언어에 대한 입력 유효성 검사 증상 발생
Uriel

@ Mr.Xcoder 아마도 당신은 2 달러짜리 지폐를 생각하고 있습니까? 나는 툰을 생각하고 있었다.
ericw31415

답변은 게시 된 입력에 대해서만 모든 입력에 대해 실행해야합니까, 아니면 작은 입력에 대해서는 작동 할 수 있지만 네 번째 입력에는 실패합니까?
jrtapsell

@jrtapsell Input 4는 문제를 일으키지 않아야합니까? 99는 일반적으로 충분한 수입니다.
ericw31415

답변:


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

자바 스크립트, 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은 제대로 작동합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.