Cho vay tiền hào phóng số tiền lớn


12

Giới thiệu

Bạn có một người bạn liên tục hỏi bạn về các khoản vay và bạn đang mệt mỏi vì điều đó. Hôm nay, anh lại đến vay tiền. Thay vì từ chối lời đề nghị của anh ta, bạn có một ý tưởng tuyệt vời: troll bạn của bạn bằng cách cho anh ta càng nhiều tiền / hóa đơn càng tốt.

Thử thách

Bạn sẽ lấy làm đầu vào: số tiền mà bạn của bạn muốn vay và số tiền / hóa đơn bạn có. Đối với thử thách này, các mệnh giá có thể là $ 20,00, $ 10,00, $ 5,00, $ 2,00, $ 1, $ 0,25, $ 0,10, $ 0,05 và $ 0,01. Một ví dụ về đầu vào là 5.67, [5, 3, 4, 5, 5, 9, 8, 1, 2]nếu bạn của bạn muốn 5,67 đô la và bạn có 5 hóa đơn 20 đô la, 3 đô la 10 đô la, v.v. Đầu ra của bạn sẽ là số tiền / hóa đơn mang lại cho bạn của bạn càng nhiều kim loại / giấy / nhựa càng tốt.

Nếu không thể đưa cho bạn của bạn số tiền chính xác mà anh ta muốn, hãy cho anh ta số tiền gần nhất bạn có thể trả lớn hơn số tiền anh ta muốn. Ví dụ: nếu bạn của bạn muốn 0,07 đô la nhưng bạn chỉ có [0, 0, 0, 0, 0, 2, 4, 2, 0], hãy đưa cho anh ấy 2 đô la 0,05 đô la (không phải 1 đô la 0,10 vì điều đó sẽ không mang lại cho anh ấy càng nhiều tiền càng tốt!).

Nếu bạn của bạn muốn có nhiều tiền hơn bạn có, hãy đưa cho anh ta tất cả tiền của bạn (và cầu nguyện bạn sẽ không cần phải mua bất cứ thứ gì).

Các trường hợp thử nghiệm

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]

Đây là nên mã ngắn nhất sẽ thắng.


Bạn có 2.0020.00nhưng không 0.2hoặc 0.02:
Ông Xcoder

3
@ Mr.Xcoder nhiều thách thức sử dụng các hệ thống tiền tệ được lựa chọn rất tùy tiện. Chúng tôi có thể muốn tạo một meta để quyết định xem các thách thức liên quan đến tiền tệ có nên xác định hệ thống của riêng họ hay không, có một hệ thống phổ quát duy nhất được thỏa thuận, cho phép sử dụng một số hệ thống hoặc thậm chí thực hiện tất cả các thách thức này để hỗ trợ hệ thống làm đầu vào, mặc dù điều đó có thể dẫn đến các triệu chứng xác thực đầu vào cho một số langauges
Uriel

@ Mr.Xcoder Có lẽ bạn đang nghĩ về hóa đơn hai đô la ? Tôi đã suy nghĩ toonies.
ericw31415

Các câu trả lời của chúng tôi có cần phải chạy cho tất cả các đầu vào, chỉ cho các đầu vào được đăng hoặc chúng có thể hoạt động cho các đầu vào nhỏ, nhưng không thành công cho đầu vào thứ 4 không?
jrtapsell

@jrtapsell Input 4 không nên gây ra vấn đề? 99 nói chung là một con số đủ nhỏ.
ericw31415

Câu trả lời:


1

Sạch sẽ , 167 byte

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

Xác định hàm @, lấy Real[Int].

Hãy thử trực tuyến!


0

JavaScript, 213 byte

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]

Nó khá chậm và tốn bộ nhớ, vì vậy chỉ thử những trường hợp nhỏ


0

Kotlin , 298 byte

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

Làm đẹp

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

Kiểm tra

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

Ví dụ 4 gây ra OutOfMemory, nhưng 3 cái còn lại hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.