ক্ষুদ্রতম সংখ্যক মুদ্রা ব্যবহার করে একটি টিপ গণনা করুন


23

বেশিরভাগ টিপ ক্যালকুলেটর অ্যাপ্লিকেশন কেবল খাবারের দামের সমতল শতাংশ নেয়। সুতরাং, উদাহরণস্বরূপ, আপনার খাবারটি যদি 23.45 ডলার হয় তবে আপনি একটি 15% টিপ = $ 3.52 বা আরও উদার 20% টিপ = $ 4.69 ছেড়ে যেতে পারেন।

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

আপনার অ্যাসাইনমেন্ট

যতটা সম্ভব বাইটে লিখুন, একটি প্রোগ্রাম বা ফাংশন যা ইনপুট হিসাবে গ্রহণ করে:

  • খাবারের দাম
  • সর্বনিম্ন টিপ শতাংশ
  • সর্বাধিক টিপ শতাংশ

এবং পরিসরের মধ্যে যে কোনও টিপ পরিমাণ আউটপুট করুন [দাম * মিনি_পেনসিটেজ / ১০০, দাম * সর্বোচ্চ_পরিসরক / ১০০] যা প্রয়োজনীয় বিল / ব্যাংক নোট এবং কয়েনের সংখ্যা হ্রাস করে।

1 ¢, 5 ¢, 10 ¢, 25 ¢, $ 1, $ 5, $ 10, $ 20, $ 50, এবং 100 ডলার মার্কিন মুদ্রাগুলি ধরুন।

উদাহরণ

পাইথনে এখানে একটি গল্ফবিহীন উদাহরণ প্রোগ্রাম রয়েছে:

import math
import sys

# Do the math in cents so we can use integer arithmetic
DENOMINATIONS = [10000, 5000, 2000, 1000, 500, 100, 25, 10, 5, 1]

def count_bills_and_coins(amount_cents):
    # Use the Greedy method, which works on this set of denominations.
    result = 0
    for denomination in DENOMINATIONS:
        num_coins, amount_cents = divmod(amount_cents, denomination)
        result += num_coins
    return result

def optimize_tip(meal_price, min_tip_percent, max_tip_percent):
    min_tip_cents = int(math.ceil(meal_price * min_tip_percent))
    max_tip_cents = int(math.floor(meal_price * max_tip_percent))
    best_tip_cents = None
    best_coins = float('inf')
    for tip_cents in range(min_tip_cents, max_tip_cents + 1):
        num_coins = count_bills_and_coins(tip_cents)
        if num_coins < best_coins:
            best_tip_cents = tip_cents
            best_coins = num_coins
    return best_tip_cents / 100.0

# Get inputs from command-line
meal_price = float(sys.argv[1])
min_tip_percent = float(sys.argv[2])
max_tip_percent = float(sys.argv[3])
print('{:.2f}'.format(optimize_tip(meal_price, min_tip_percent, max_tip_percent)))

কিছু নমুনা ইনপুট এবং আউটপুট:

~$ python tipcalc.py 23.45 15 20
4.00
~$ python tipcalc.py 23.45 15 17
3.55
~$ python tipcalc.py 59.99 15 25
10.00
~$ python tipcalc.py 8.00 13 20
1.05

8
আপনি যদি ক্রেডিট কার্ড ব্যবহার না করে থাকেন তবে আপনি নগদ অর্থ প্রদান করছেন, তাই না? টিপ-টিপের মোট পরিমাণ কি কেবল টিপ নয়, প্রাসঙ্গিক পরিমাণ হবে?
স্পার

4
a program that takes as input (stdin, command-line arguments, or GUI input box, whichever is most convenient in your language)এটি কি ইনপুট এবং আউটপুটগুলির জন্য আমাদের ডিফল্টগুলিকে ওভাররাইড করার উদ্দেশ্যে কাজ করে? অর্থাৎ, উদাহরণস্বরূপ এমন কোনও ফাংশন যা তিনটি সংখ্যা নেয় এবং ফলাফলটি ফেরত দেয়?
লাইকনি

3
আমি যে বলার অপেক্ষা রাখে না যে সংশোধন Am 3.51এবং 3.75এছাড়াও পরীক্ষা ক্ষেত্রে জন্য বৈধ আউটপুট হয় 23.45 15 17? তারা একই পরিমাণে কয়েন ব্যবহার করে এবং সীমার মধ্যেও রয়েছে।
কেভিন ক্রুইজসেন

3
@ স্পার এমনকি কার্ডের মাধ্যমে বিল পরিশোধকারী লোকেরা নগদ অর্থ দিতেও পছন্দ করেন; এর জন্য বিভিন্ন কারণ দেওয়া হয়েছে তাই আমি সেগুলি এখানে পুনরুক্ত করব না।
নীল

3
@ লাইকনি: আমি সাইট-ডিফল্ট "প্রোগ্রাম বা ফাংশন" ব্যবহারের জন্য প্রয়োজনীয়তাগুলি সম্পাদনা করেছি এবং তাই কেবলমাত্র পূর্ববর্তী ক্রিয়াকলাপের উত্তরগুলি গ্রহণ করছি।
dan04

উত্তর:


3

কাঠকয়লা , 60 বাইট

Nθ≔×θNη≔×θNζ≔⁰θFI⪪”;‴üφ↷Σ↗SEX&¿h'⊟”³«W‹θη≧⁺ιθ¿›θζ≧⁻ιθ»﹪%.2fθ

এটি অনলাইন চেষ্টা করুন! দশমিক হিসাবে ইনপুট নেয়। লিঙ্কটি কোডটির ভার্জোজ সংস্করণ। ব্যাখ্যা:

Nθ

বিলটি ইনপুট করুন।

≔×θNη≔×θNζ

টিপ দশমিক ভগ্নাংশ ইনপুট করুন এবং মিনিমাম এবং সর্বাধিক টিপ গণনা করুন।

≔⁰θ

শূন্য টিপ দিয়ে শুরু করুন।

FI⪪”;‴üφ↷Σ↗SEX&¿h'⊟”³«

SEXy স্ট্রিং প্রসারিত হয় 10050.20.10.5.01.0.250.1.05.01যা তিনটি অক্ষরের গ্রুপে বিভক্ত হয়ে ভাসতে কাস্ট করা।

W‹θη≧⁺ιθ

ন্যূনতম টিপ পৌঁছানোর জন্য প্রয়োজনীয় হিসাবে বর্তমান প্রচুর সংখ্যা যোগ করুন।

¿›θζ≧⁻ιθ»

সর্বাধিক টিপ অতিক্রম করা হলে একটি স্বীকৃতি সরান।

﹪%.2fθ

প্রদর্শনের জন্য টিপ ফর্ম্যাট করুন।


1
আমি মনে করি না যে ফর্ম্যাটিংটি একটি প্রয়োজনীয়তা ছিল (উদাহরণস্বরূপ কোড কোডটি কেবল কিছু করে)।
জোনাথন অ্যালান

@ জোনাথান অ্যালান ভাল সে ক্ষেত্রে আপনি পরিবর্তে ব্যবহার করে 4 বাইট সংরক্ষণ করতে পারবেন ﹪%.2f
নিল

6

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

(x,m,M)=>(g=(t,c=1e4)=>t>x*M?0:t<x*m?[...'1343397439'].some(d=>g(t+(c/=-~d/2)))*r:r=t)(0)/100

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

কিভাবে?

আমরা সর্বদা সর্বোচ্চ মানটি চেষ্টা করে, গ্রহণযোগ্য সীমার মধ্যে না আসা পর্যন্ত আমরা পুনরাবৃত্তভাবে বিল / মুদ্রার মানগুলির যোগফল গণনা করি।

{0,...,এন}

  • 0এন{0,...,-1,এক্স}এক্স0<এন
  • 0<এনএক্সএন{0,...,-1,-এক্স,+ +1,...,এন}{0,...,এন-1}
  • 0<এক্স<এন{0,...,এন-1,এক্স}

এন

{0=10000এন+ +1=এন(এন+ +1)/2

(0,...,9)=(1,3,4,3,3,9,7,4,3,9)

 n | c(n)  | d(n) | k = (d(n)+1)/2 | c(n+1) = c(n)/k
---+-------+------+----------------+-----------------
 0 | 10000 |   1  | (1+1)/2 = 1    |      10000
 1 | 10000 |   3  | (3+1)/2 = 2    |       5000
 2 |  5000 |   4  | (4+1)/2 = 2.5  |       2000
 3 |  2000 |   3  | (3+1)/2 = 2    |       1000
 4 |  1000 |   3  | (3+1)/2 = 2    |        500
 5 |   500 |   9  | (9+1)/2 = 5    |        100
 6 |   100 |   7  | (7+1)/2 = 4    |         25
 7 |    25 |   4  | (4+1)/2 = 2.5  |         10
 8 |    10 |   3  | (3+1)/2 = 2    |          5
 9 |     5 |   9  | (9+1)/2 = 5    |          1

4

পাইথন 3.x: 266 185 বাইট

প্রশ্নে আমার উদাহরণ প্রোগ্রামে একটি সোজা পরিবর্তন। দ্রষ্টব্য যে আউটপুট আর 2 দশমিক জায়গা প্রয়োজন ফর্ম্যাট করা হয়।

সম্পাদনা করুন: জো কিংকে আরও ছোট করার জন্য ধন্যবাদ।

import sys
p,m,M,T=*map(float,sys.argv[1:]),0
C=p*M
for t in range(-int(-p*m),int(p*M)+1):
 n,a=0,t
 for d in 1e4,5e3,2e3,1e3,500,100,25,10,5,1:n+=a//d;a%=d
 if n<C:T,C=t,n
print(T/100)


4

জাভা 10, 186 185 বাইট

(p,m,M)->{double r=0,t,Q=99,q;for(m*=p+.02;m<M*p;m+=.01){q=0;t=m;for(var c:new double[]{100,50,20,10,5,1,.25,.1,.05,.01})for(;t>=c;t-=c)q++;if(q<Q){Q=q;r=m;}}return"".format("%.2f",r);}

সর্বনিম্ন এবং সর্বাধিক শতাংশ /100দশমিক হিসাবে (যেমন 15%হিসাবে 0.15) নেয়।

3.51সম্ভাব্য আউটপুট হিসাবে একই সমস্যাটি ঠিক করার জন্য -1 বাইট এবং একই সময়ে 1 বাইট দ্বারা রাউন্ডিং ত্রুটিগুলি ঠিক করার উপায় গল্ফ করে।

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

ব্যাখ্যা:

(p,m,M)->{                // Method with three double parameters and String return-type
  double r=0,             //  Result-double, starting at 0
         t,               //  Temp-double
         Q=99,            //  Min amount of coins, starting at 99
         q;               //  Temp-double for the amount of coins
  for(m*=p-.02;m<M*p;     //  Loop in the range [`m*p-0.02`, `M*p`]
           m+=.01){       //  in steps of 0.01 (1 cent) per iteration
                          //  (the -0.02 (minus 2 cents) is to fix rounding errors)
    q=0;                  //   Reset `q` to 0
    t=m;                  //   Reset `t` to the current iteration `m`
    for(var c:new double[]{100,50,20,10,5,1,.25,.1,.05,.01})
                          //   Loop over the coins (largest to smallest)
      for(;t>=c;          //    As long as `t` is larger than or equal to the current coin
          t-=c)           //     Remove the coin from the value `t`
          q++;            //     And increase the quantity-counter by 1
      if(q<Q){            //   If the quantity-counter is smaller than the current smallest
        Q=q;              //    Replace the smallest with the current
        r=m;}}            //    And replace the result with the current `m`
  return"".format("%.2f",r)l;}
                          //  Return the result with 2 decimal places

আমি মনে করি না যে এই মুহুর্তে এটি প্রযুক্তিগতভাবে বৈধ আছে কারণ প্রশ্নটি একটি প্রোগ্রাম নির্দিষ্ট করে, তবে ওপি স্পষ্ট করে দেয় না।
5urous

1
ওপি স্পষ্ট করেছে যে ফাংশনগুলি এখন অনুমোদিত, সুতরাং আপনাকে আকার দ্বিগুণ করার বিষয়ে চিন্তা করার দরকার নেই।
Οurous

3

পরিষ্কার , 207 156 বাইট

কোনও ক্রিয়াকলাপে অদলবদল করা বিস্ময়করভাবে 51 বাইট সংরক্ষণ করেছে।

import StdEnv
d=[10000,2000,1000,500,100,25,10,5,1]
$n u l=snd(hd(sort[(sum[foldl(rem)m(d%(0,i))/k\\k<-d&i<-[-1..]],toReal m)\\m<-map toInt[n*u..n*l]]))/1E2

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


2
ওপি স্পষ্ট করে জানিয়েছে যে ফাংশনগুলি এখন অনুমোদিত।
লাইকনি

@ লাইকনি আমাকে জানানোর জন্য ধন্যবাদ :) প্রচুর বাইট সংরক্ষণ করে - সম্পূর্ণ প্রোগ্রামগুলি ক্লিনের জন্য ব্যয়বহুল!
Οurous





0

জেলি ,  33  32 বাইট

“ñṇzi;’b⁴×H¥\ɓ_>Ƈ-Ṫ
PĊ1¦r/ÇƬL$ÞḢ

একটি লিখিত লিঙ্ক গ্রহণ করে [cost in cents, [minimum ratio, maximum ratio]]যা একটি তালিকা গ্রহণ করে যা সেন্টগুলিতে একটি টিপ পরিমাণ উপার্জন করে।

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

কিভাবে?

প্রথম লাইনটি হেল্পার লিঙ্ক যা সবচেয়ে বড় সংখ্যার নোট / মুদ্রাকে প্রদত্ত পরিমাণের কম ফল দেয়:

“ñṇzi;’b⁴×H¥\ɓ_>Ƈ-Ṫ - Link 1, get next lower amount: integer, V
“ñṇzi;’             - base 250 number = 112835839060
       b⁴           - to base 16 = [1,10,4,5,8,10,4,4,5,4]
            \       - cumulative reduce with:       e.g.: 1,10   5,4   10,5   25,8
           ¥        -   last two links as a dyad:
         ×          -     multiply                        10     20    50     200
          H         -     halve                            5     10    25     100
                    - ...yielding: [1,5,10,25,100,500,1000,2000,5000,10000]
             ɓ      - start a new dyadic link with swapped arguments
              _     - subtract (vectorises) ...i.e. [V-1,V-5,V-10,...]
                Ƈ   - filter keep those which satisfy:
                 -  -   literal -1
               >    -   greater than? (i.e. if V-X > -1)
                  Ṫ - tail (tailing an empty list yields 0)

শূন্যে পৌঁছানোর জন্য প্রয়োজনীয় কলগুলির সংখ্যা টিপের পরিমাণের পরিসীমা বাছাই করতে ব্যবহৃত হয় এবং তারপরে বামদিকের ফলন পাওয়া যায়:

PĊ1¦r/ÇƬL$ÞḢ - Main Link: [cost, [min, max]]
P            - product = [cost*min, cost*max]
   ¦         - sparse application...
  1          - ...to indices: 1
 Ċ           - ...what: ceiling   -> [ceil(cost*min), cost*max]
     /       - reduce by:
    r        -   inclusive range (implicit floor of arguments)
          Þ  - sort by:
         $   -   last two links as a monad:
       Ƭ     -     repeat collecting results until a fixed point is reached:
      Ç      -       last link (1) as a monad  (e.g. 32 -> [32,7,2,1,0])
        L    -     length (i.e. coins/notes required + 1)
           Ḣ - head
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.