Generণ "উদার" পরিমাণে অর্থ


12

ভূমিকা

আপনার এক বন্ধু রয়েছে যা আপনাকে loansণ চেয়ে রাখে এবং আপনি এতে ক্লান্ত হয়ে পড়েন। আজ, তিনি আবার aণের জন্য এসেছিলেন। তার অফারটি প্রত্যাখ্যান করার পরিবর্তে, আপনি একটি দুর্দান্ত ধারণা পাবেন: আপনার বন্ধুকে যতটা সম্ভব কয়েন / বিল দিয়ে ট্রল করুন।

চ্যালেঞ্জ

আপনি ইনপুট হিসাবে গ্রহণ করবেন: আপনার বন্ধু যে পরিমাণ অর্থের জন্য wantsণ চায় এবং আপনার যে পরিমাণ মুদ্রা / বিলের পরিমাণ রয়েছে। এই চ্যালেঞ্জের জন্য, সম্ভাব্য সংজ্ঞাগুলি হ'ল $ 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
@ মিঃ এক্সকোডার অনেকগুলি চ্যালেঞ্জগুলি খুব স্বেচ্ছায় নির্বাচিত মুদ্রা সিস্টেম ব্যবহার করে। আমরা মুদ্রা সম্পর্কিত চ্যালেঞ্জগুলি তাদের নিজস্ব সিস্টেম নির্ধারণ করা উচিত, একক সার্বজনীন ব্যবস্থার সাথে একমত হতে হবে, বেশ কয়েকটি সিস্টেমের ব্যবহারের অনুমতি দিতে পারে বা এমনকি এই সমস্ত চ্যালেঞ্জগুলিও সিস্টেমটিকে ইনপুট হিসাবে সমর্থন করতে পারে কিনা তা সিদ্ধান্ত নিতে আমরা একটি মেটা তৈরি করতে চাইব, যদিও এটি হতে পারে কিছু langauges জন্য ইনপুট-বৈধতা উপসর্গ ফলে
ঊরীয়েল

@ মিঃ এক্সকোডার সম্ভবত আপনি দুই ডলার বিলের কথা ভাবছেন ? আমি টুনি ভাবছিলাম।
ericw31415

আমাদের উত্তরগুলি কি কেবল পোস্ট করা ব্যক্তির জন্য সমস্ত ইনপুটগুলির জন্য চালানো দরকার, বা তারা ছোট ইনপুটগুলির জন্য কাজ করতে পারে তবে চতুর্থটির জন্য ব্যর্থ হয়?
jrtapsell

@jrtapsell ইনপুট 4 এর ফলে সমস্যা তৈরি হওয়া উচিত নয়? 99 সাধারণত একটি ছোট যথেষ্ট সংখ্যা।
ericw31415

উত্তর:



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 এর ফলে আউটঅফমিউরি ঘটে, তবে অন্যান্য 3 টি ভাল কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.