Кредит "щедрые" суммы денег


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.00и , 20.00но нет 0.2или 0.02:(
г -

3
@ Mr.Xcoder во многих задачах использует очень произвольно выбранные валютные системы. Мы могли бы составить метаданные, чтобы решить, должны ли проблемы, связанные с валютой, определять их собственную систему, иметь согласованную единую универсальную систему, разрешать использование нескольких систем или даже создавать все эти проблемы, чтобы также поддерживать систему в качестве входных данных, хотя это может приводят к
Уриэль

@ Mr.Xcoder Возможно, вы думаете о двухдолларовых купюрах ? Я думал, что Мультяшки
ericw31415

Должны ли наши ответы работать для всех входов, только для опубликованных, или они могут работать для небольших входов, но не для 4-го?
jrtapsell

@jrtapsell Вход 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

Котлин , 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 работают хорошо.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.