Quantias de dinheiro "generosas" do empréstimo


12

Introdução

Você tem um amigo que fica pedindo empréstimos e está ficando cansado disso. Hoje, ele veio pedir um empréstimo novamente. Em vez de recusar a oferta, você tem uma ótima idéia: trollar seu amigo, dando-lhe o máximo de moedas / notas possível.

Desafio

Você terá como entrada: a quantia em dinheiro pela qual seu amigo deseja um empréstimo e a quantia em moedas / notas que você possui. Para esse desafio, as denominações possíveis são US $ 20,00, US $ 10,00, US $ 5,00, US $ 2,00, US $ 1,00, US $ 0,25, US $ 0,10, US $ 0,05 e US $ 0,01. Um exemplo de entrada é 5.67, [5, 3, 4, 5, 5, 9, 8, 1, 2]se seu amigo deseja US $ 5,67 e você possui 5 notas de US $ 20, 3 de US $ 10, etc. Sua saída será a quantidade de moedas / notas que fornecerão ao seu amigo o máximo de metal / papel / plástico possível.

Se não for possível dar a seu amigo a quantia exata que ele deseja, dê a ele a quantia mais próxima que você puder pagar, maior que o que ele deseja. Por exemplo, se seu amigo quiser US $ 0,07, mas você só o tiver [0, 0, 0, 0, 0, 2, 4, 2, 0], dê a ele 2 moedas de US $ 0,05 (não 1 US $ 0,10, porque isso não lhe daria o maior número possível de moedas!).

Se o seu amigo quiser mais dinheiro do que você, dê todo o seu dinheiro (e reze para que você não precise comprar nada).

Casos de teste

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]

Este é o pelo que o código mais curto vence.


Você tem 2.00e 20.00mas não 0.2ou 0.02:(
Mr. Xcoder

3
@ Mr.Xcoder muitos desafios usa sistemas de moeda escolhidos arbitrariamente. Podemos querer criar uma meta para decidir se os desafios relacionados à moeda devem determinar seu próprio sistema, ter um único sistema universal acordado, permitir o uso de vários sistemas ou até fazer todos esses desafios para também apoiar o sistema como insumo, embora isso possa resulta em sintomas de validação de entrada para alguns idiomas
Uriel

@ Mr.Xcoder Talvez você esteja pensando em notas de dois dólares ? Eu estava pensando em toonies.
ericw31415

Nossas respostas precisam ser executadas para todas as entradas, apenas para as postadas, ou elas podem funcionar para pequenas entradas, mas falham na quarta?
Jrtapsell

@jrtapsell A entrada 4 não deve causar problemas? 99 é geralmente um número suficientemente pequeno.
ericw31415

Respostas:


1

Limpo , 167 bytes

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

Define a função @, tendo Reale [Int].

Experimente online!


0

JavaScript, 213 bytes

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]

É muito lento e custa memória, então tente apenas casos pequenos


0

Kotlin , 298 bytes

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

Embelezado

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

Teste

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

O exemplo 4 causa OutOfMemory, mas os outros 3 funcionam bem.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.