सिक्कों की सबसे छोटी संख्या का उपयोग करके एक टिप की गणना करें


23

अधिकांश टिप कैलकुलेटर ऐप केवल भोजन की कीमत का एक फ्लैट प्रतिशत लेते हैं। इसलिए, उदाहरण के लिए, यदि आपका भोजन $ 23.45 है, तो आप 15% टिप = $ 3.52, या अधिक उदार 20% टिप = $ 4.69 छोड़ सकते हैं।

क्रेडिट कार्ड उपयोगकर्ताओं के लिए पर्याप्त सुविधाजनक है। लेकिन ऐसा नहीं है यदि आप नकद युक्तियां छोड़ना पसंद करते हैं, तो जिस स्थिति में ये विषम मात्रा में राशि मिलती है। तो आइए नकद उपयोगकर्ताओं के लिए अधिक सुविधाजनक होने के लिए विचार को संशोधित करें।

आपका काम

जितना संभव हो, उतने बाइट्स में लिखें, एक प्रोग्राम या फंक्शन जो इनपुट के रूप में लेता है:

  • भोजन का मूल्य
  • न्यूनतम टिप प्रतिशत
  • अधिकतम टिप प्रतिशत

और सीमा के भीतर किसी भी टिप राशि का उत्पादन करें [कीमत * min_percentage / 100, कीमत * max_percentage / 100] जो बिल / बैंकनोट और सिक्कों की संख्या को न्यूनतम करता है।

1 5, 5 10, 10 US, 25 ¢, $ 1, $ 5, $ 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
मुझे लगता है कि कह में सही कर रहा हूँ 3.51और 3.75भी परीक्षण का मामला के लिए मान्य outputs हैं 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
मुझे नहीं लगता कि स्वरूपण एक आवश्यकता थी (बल्कि उदाहरण कोड कुछ करता है)।
जोनाथन एलन

@JonathanAllan अच्छी तरह से उस स्थिति में आप इसके बजाय 4 बाइट बचा सकते हैं ﹪%.2f
नील

6

जावास्क्रिप्ट (ईएस 6), 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

इसे ऑनलाइन आज़माएं!

कैसे?

जब तक यह स्वीकार्य सीमा के भीतर गिरता है, तब तक हम हमेशा बिल / सिक्का मूल्यों की गणना करते हैं।

यह किसी भी समाधान लिए बिल और सिक्कों की न्यूनतम राशि का उपयोग करने की गारंटी है।{b0,,bn} इस एल्गोरिथम द्वारा लौटाया गया है:

  • सभी शर्तों से b n की आवश्यकता होती है, अन्यथा एल्गोरिदम ने { b 0 , , b k - 1 का चयन किया होताb0bn{b0,,bk1,x}xbk0k<n
  • के लिए किसी भी और किसी भी एक्स n , { 0 , ... , कश्मीर - 1 , बी कश्मीर - एक्स , कश्मीर + 1 , ... , 0k<nxbn{b0,,bk1,bkx,bk+1,,bn}{b0,,bn1} चयन किया गया होगा
  • 0<x<bn{b0,,bn1,x}

cn

{c0=10000cn+1=cn(dn+1)/2

(d0,,d9)=(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 ) के ।

-1 बाइट 3.51संभावित आउटपुट के साथ समस्या को ठीक करने के लिए और एक ही समय में 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

मुझे नहीं लगता कि यह तकनीकी रूप से इस समय मान्य है क्योंकि प्रश्न एक कार्यक्रम निर्दिष्ट करता है, लेकिन ओपी ने स्पष्ट नहीं किया है।
Οसथ जूल

1
ओपी ने स्पष्ट किया है कि कार्यों को अब अनुमति दी गई है, इसलिए आपको आकार को दोगुना करने की चिंता करने की आवश्यकता नहीं है।
Οसथ जूल

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
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.