আমি কীভাবে ব্যাংকে কোনও টেলারকে অর্থের জন্য জিজ্ঞাসা করব?


35

আমার ব্যাঙ্কে গিয়ে কিছু টাকা তোলা দরকার। ইন্টারনেটের জন্য আমার রুমমেটকে দিতে $ 30, $ 22 এবং লন্ড্রিের জন্য 8 ডলার নিতে হবে। যেহেতু এগুলির কোনওটিই পরিবর্তন করতে পারে না, তাই আমার দুটি $ 30 টি আকারের দুটি পার্টিশনে বিভক্ত হওয়ার জন্য আমার 30 ডলার দরকার। এর অর্থ যখন টেলার আমাকে জিজ্ঞাসা করে আমি কীভাবে আমার 30 ডলার চাই আমাকে একটি অনুরোধ করতে হবে। আমি তাদের বলতে পারলাম আমি এটি বিশ, একটি ফাইভার এবং পাঁচটি মধ্যে চাই। তবে আমি নিজের অনুরোধটি যথাসম্ভব সহজ করতে চাই যত তাড়াতাড়ি নিজেকে পুনরাবৃত্তি না করা avoid আমার অনুরোধটিকে আরও সহজ করার জন্য আমি জিজ্ঞাসা করতে পারি যে আমার নগদটিতে বিশ এবং কমপক্ষে 2 টি রয়েছে কারণ 8 টি মোট দ্বারা বোঝানো হয়েছে, তবে আরও ভালভাবে আমি অনুরোধ করতে পারি যে আমি যে বিলগুলি পেয়েছি তার মধ্যে একটি ডলার বিল হতে হবে (আপনি যদি হন) এটি 8% না করে কেবল 29 ডলার করার চেষ্টা করে নিশ্চিত হন না।

সুতরাং এটি ঠিক আছে এবং জঘন্য, তবে প্রতিবার যখন আমি ব্যাঙ্কে যাই তখন আমার এই গণনাটি করা দরকার তাই আমি ভেবেছিলাম এটি করার জন্য আমি কোনও প্রোগ্রাম লিখব (আপনি কি আমার জন্য এটি করার জন্য কোনও প্রোগ্রাম লিখেছেন)।

আপনার প্রোগ্রাম বা ফাংশনটিতে আমার প্রয়োজনীয় সমস্ত অর্থ প্রদানের প্রতিনিধিত্ব করে পূর্ণসংখ্যার একটি তালিকা এবং ব্যাঙ্কে উপলব্ধ বিলের সংজ্ঞা উপস্থাপন করে এমন একটি পূর্ণসংখ্যার একটি সেট গ্রহণ করা উচিত এবং আপনাকে অবশ্যই সংখ্যার ক্ষুদ্রতম তালিকা আউটপুট করতে হবে যাতে প্রতিটি উপায়ে মোট এর মধ্যে রয়েছে যে সংখ্যার তালিকাটি পরিশোধের তালিকায় পরিষ্কারভাবে বিভক্ত হতে পারে।

অতিরিক্ত নিয়ম

  • আপনি ধরে নিতে পারেন যে ডিনোমিনেশন তালিকায় সর্বদা একটি থাকে 1বা আপনি নিজে নিজে এটি প্রতিটি তালিকায় যুক্ত করতে পারেন।

  • কিছু ইনপুটগুলির একাধিক ন্যূনতম সমাধান থাকবে। এই ক্ষেত্রে আপনি যে কোনও একটি আউটপুট করতে পারেন।

এটি তাই কম বাইট ভাল হওয়ার সাথে উত্তরগুলি বাইটে স্কোর করা হবে।

পরীক্ষার মামলা

Payments, denominations    -> requests
{22,8}    {1,2,5,10,20,50} -> {1} or {2}
{2,1,2}   {1,5}            -> {1}
{20,10}   {1,2,5,10,20,50} -> {}
{1,1,1,1} {1,2}            -> {1,1,1}
{20,6}    {1,4,5}          -> {1}
{2,6}     {1,2,7}          -> {2}
{22, 11}  {1, 3, 30, 50}   -> {1, 3}
{44, 22}  {1, 3, 30, 50}   -> {1, 3, 3, 30}

22
প্রথমে আমি ভেবেছিলাম এই স্প্যাম বা প্রসঙ্গ-বহির্ভূত বা কিছু ছিল ...
এরিক Outgolfer

1
@ এরিক্ট আউটগল্ফার অনুচ্ছেদে চ্যালেঞ্জগুলি খুব বেশি আঘাত করেছে> _ <
ম্যাজিক অক্টোপাস ইউরান

2
আমার মনে হয় আপনি অন্তত একটি পরীক্ষা ক্ষেত্রে যেখানে অনুরোধ অন্তর্ভুক্ত করা উচিত নয় এক ডলার বিল ছাড়া অন্য কিছু, মত হতে {2,6} {1,2,7} -> {2}
আর্নল্ড

@ আর্নল্ড আমি আপনার কেস যুক্ত করেছি
গম উইজার্ড

1
(If you are not convinced of this just try to make 29 dollars without making 9)আপনি 8 না করে বোঝাচ্ছেন? বা আমি ভুল বুঝেছি
আন্ডারগ্রাউন্ডোমোনরাইল

উত্তর:


5

জাভাস্ক্রিপ্ট (ES6), 485 476 বাইট

ঠিক আছে ... এটি একটি দৈত্য। :-(
তবে এটি একটি বরং দ্রুত দৈত্য যা সমস্ত পরীক্ষার কেসগুলি তাত্ক্ষণিকভাবে সমাধান করে।

আমি পরে আরও কিছু উন্নত গল্ফ করার চেষ্টা করতে পারি, তবে ইতিমধ্যে আমি এতে অনেক বেশি সময় ব্যয় করেছি।

f=(b,a,L=[...a])=>L.reduce((a,x)=>[...a,...a.map(y=>[x,...y])],[[]]).sort((a,b)=>a[b.length]||-1).find(L=>(Y=G(U(b)-U(L),L.sort((a,b)=>a-b)),Y[0]&&!Y.some(a=>P(b.map(a=>G(a,[]))).every(b=>b+''!=a))),U=a=>~~eval(a.join`+`),P=(e,C=[],R=[])=>e[0].map(v=>R=(c=v.map((x,i)=>x+(C[i]|0)),e[1])?[...P(e.slice(1),c),...R]:[c,...R])&&R,G=(n,l)=>(S=[],g=(n,l)=>n?a.map(x=>x<l[0]|x>n||g(n-x,[x,...l])):S=[l.map(v=>s[a.indexOf(v)]++,s=[...a].fill(0))&&s,...S])(n,l)&&S)||f(b,a,[...a,...L])

পরীক্ষার মামলা

কিভাবে?

এনবি: এটি এখনকার সংস্করণটির সাথে আর মেলে না, তবে সেভাবে পড়া খুব সহজ।

// b = list of payments, a = list of bills,
// L = list from which the requested bills are chosen
f = (b, a, L = [...a]) => (
  // U = helper function that computes the sum of an array
  U = a => ~~eval(a.join`+`),

  // P = function that computes the summed Cartesian products of arrays of integers
  // e.g. P([[[1,2],[3,4]], [[10,20],[30,40]]]) --> [[33,44], [13,24], [31,42], [11,22]]
  P = (e, C = [], R = []) => e[0].map(v => R =
    (c = v.map((x, i) => x + (C[i] | 0)), e[1]) ? [...P(e.slice(1), c), ...R] : [c, ...R]
  ) && R,

  // G = function that takes a target amount and a list of requested bills and returns
  // all combinations that contain the requested bills and add up to this amount;
  // each combination is translated into a list of number of bills such as [2,0,0,1,0]
  G = (n, l) => (
    S = [],
    g = (n, l) => n ?
      a.map(x => x < l[0] | x > n || g(n - x, [x, ...l])) :
      S = [l.map(v => s[a.indexOf(v)]++, s = [...a].fill(0)) && s, ...S]
  )(n, l) && S,

  // compute X = list of possible bill combinations to process all payments
  X = P(b.map(a => G(a, []))),

  // compute the powerset of L and sort it from shortest to longest list
  L.reduce((a, x) => [...a, ...a.map(y => [x, ...y])], [[]])
  .sort((a, b) => a[b.length] || -1)

  .find(L => (
    // compute Y = list of possible combinations to reach the total amount,
    // using the requested bills
    Y = G(U(b) - U(L), L.sort((a, b) => a - b)),

    // exit if Y is not empty and all combinations in Y allow to generate all payments
    Y[0] && !Y.some(a => X.every(b => b + '' != a)))
  )

  // if no solution was found, enlarge the set of requested bills and try again
  || f(b, a, [...a, ...L])
)

আমি জাভাস্ক্রিপ্ট সঙ্গে খুব পরিচিত নই, কিন্তু আপনি কমে যায় &&করতে &এবং ||করতে |?
টেলর স্কট

@ টেলরস্কোটা এটি কেবলমাত্র কিছু শর্তের মধ্যেই সম্ভব। উদাহরণস্বরূপ, a || bমূল্যায়ন করবে bশুধুমাত্র যদি a, falsy থাকাকালীন a | bনিঃশর্তভাবে বা মধ্যবর্তী একটি bitwise সঞ্চালন করা হবে aএবং b
আর্নল্ড

4

পাইথন 2 , 456 455 বাইট

চরম, চরম, অত্যন্ত ধীর !!!! পর্যাপ্ত সময় দেওয়া সমস্ত ইনপুট উদাহরণগুলিতে সঠিকভাবে কাজ করা উচিত

সম্পাদনা: @ জোনাথন ফ্রেঞ্চকে ধন্যবাদ 1 বাইট সংরক্ষিত

def F(p,d):v=sum(p);E=enumerate;l=lambda x,y:y[1:]and(x>=y[-1]and[k+[y[-1]]for k in l(x-y[-1],y)]+l(x,y[:-1])or l(x,y[:-1]))or[[1]*x];Q=l(v,d);m=lambda x,y=[0]*len(p):x and max(m(x[1:],[a+x[0]*(i==j)for i,a in E(y)])for j,_ in E(y))or y==p;f=lambda x,h=[]:x and min([S for i,s in E(x)for S in h+[s],f(x[:i]+x[i+1:],h+[s])if all(map(m,filter(lambda k:all(k.count(j)>=S.count(j)for j in S),Q)))],key=len)or[1]*v;print-(all(map(m,Q))-1)*min(map(f,Q),key=len)

এটি অনলাইন চেষ্টা করুন!

ব্যাখ্যা

p,d=input() # Read input
v=sum(p) # Save a byte by keeping track of the total money withdrawn
E=enumerate # We use enumerate a lot
# Generates the possible combinations of denominators that add up to the withdrawn amount 
l=lambda x,y:y[1:]and(x>=y[-1]and[k+[y[-1]]for k in l(x-y[-1],y)]+l(x,y[:-1])or l(x,y[:-1]))or[[1]*x]
# We use the list generated by l quite a few times
Q=l(v,d)
# Checks if we can divide a list of denominators x in such a way that we get the wished division of the money
m=lambda x,y=[0]*len(p):x and max(m(x[1:],[a+x[0]*(i==j)for i,a in E(y)])for j,_ in E(y))or y==p
# For a list of denominators, it tries all possible combinations of the denominators as input to the teller, selecting the one with minimum length
f=lambda x,h=[]:x and min([S for i,s in E(x)for S in h+[s],f(x[:i]+x[i+1:],h+[s])if all(map(m,filter(lambda k:all(k.count(j)>=S.count(j)for j in S),Q)))],key=len)or[1]*v
# Call f with all possible lists of denominators, and check if saying nothing to the teller will work
print-(all(map(m,Q))-1)*min(map(f,Q),key=len)

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