नि: शुल्क लंच जैसी कोई चीज नहीं है


17

... या है?

आपकी चुनौती मेरे दोपहर के भोजन के बिल को पार्स करना है, जिसमें आधार मूल्य, युक्तियां, छूट, कूपन और एक्स्ट्रा शामिल हैं और पता करें कि क्या मेरा दोपहर का भोजन $ 0 या उससे कम था । यदि यह इनपुट है:

12.34
15 tip
25 discount
1.5 extra
2 coupon

तब आउटपुट हो सकता है false। यहां देखिए यह कैसे काम करता है:

12.34 आधार मूल्य है।

15 tipकुल करने के लिए 15% जोड़ने का मतलब है

25 discountसाधन के लिए कुल से 25% घटाना।

1.5 extraकुल में 1.5 जोड़ने का मतलब है

2 couponसाधन के लिए कुल 2 से घटाना।

युक्तियों, छूट, कूपन और एक्स्ट्रा की कोई भी राशि हो सकती है , लेकिन हमेशा एक आधार मूल्य होगा।

फिर हम (12.34 * 1.15) * 0.75 + 1.5 - 210.14 के आउटपुट के लिए करते हैं । 10.14 0 से अधिक है, इसलिए हम गलत उत्पादन करते हैं। मेरा लंच फ्री नहीं था।

नियम

संख्या का tip मतलब कुल में संख्या प्रतिशत जोड़ना है ।

संख्या का discount मतलब कुल से संख्या प्रतिशत को घटाना है

संख्या का extra मतलब कुल में संख्या को जोड़ना है

संख्या का coupon मतलब है कुल से संख्या घटाना

एक और उदाहरण:

10
20 tip
20 discount
2 coupon
2 coupon
1 coupon
50 discount
2.55 coupon

मूल्य -0.24((10 * 1.20 * 0.80 - 2 - 2 - 1) * 0.5 - 2.55) है, इसलिए आउटपुट सही है (मेरा दोपहर का भोजन मुफ्त था।)

टिप्पणियाँ:

  • परिशुद्धता कम से कम 2 दशमलव स्थानों पर होनी चाहिए।
  • आप newlines (अनुगामी newline वैकल्पिक) या किसी अन्य पृथक्करण वर्ण या इनपुट की सूची के साथ एक स्ट्रिंग के रूप में इनपुट ले सकते हैं।

5
क्या इनपुट के लिए नाम की आवश्यकता है, या क्या हम आदेश मान सकते हैं यदि हम संख्याओं की एक सरणी इनपुट करते हैं [12.34,15,25,1.5,2]?
साइनसॉइड

@StewieGriffin आपने आदेश नहीं चुना है। 5 से अधिक पंक्तियाँ हो सकती हैं या कम हो सकती हैं। आप 2.00 कूपन के रूप में 2 कूपन ले जा सकते हैं, और 15 tipके रूप में0.15 tip
programmer5000

क्या यह इनपुट केस-संवेदी है? क्या उन सभी शब्दों का समर्थन करने की आवश्यकता है?
18

@ रिकर जो सभी शब्दों की जरूरत है, और इनपुट हमेशा कम मामला होगा।
प्रोग्रामर

5
मूल्यांकन आदेश कैसे काम करता है? उदाहरण के लिए, यदि हमारे पास छूट है, तो एक टिप, क्या टिप मूल राशि या रियायती राशि पर लागू होती है?

जवाबों:


2

05AB1E , 37 33 34 बाइट्स

I|vy#`0èÇ7%`">* - (>* +"#sè.V}î0›_

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

व्याख्या

जोनाथन एलन के जेली जवाबmod 7 से चाल उधार लेता है

I                                  # initialize stack with first input
 |v                                # loop over all other inputs
   y#`                             # split input on space as separate to stack
      0èÇ                          # get the character code of the first letter of the type
         7%`                       # mod by 7
            ">* - (>* +"#          # push the list ['>*','-','(>*','+'] where
                                   # '>*' =  increment and multiply
                                   # '-' =   subtract
                                   # '(>*' = negate, increment, multiply
                                   # '+' =   add
                         s         # swap the top 2 items on the stack
                          è        # use the mod result to index into the list
                           .V      # run as 05AB1E code
                             }     # end loop
                              î0›_ # check if the result rounded up to nearest integer 
                                   # is less than or equal to 0

मुझे मिलता है 1जब मूल्य <1 है।
12431234123412341234123

@ 12431234123412341234123: अच्छी पकड़। तुलना स्पष्ट रूप से पूर्णांक के लिए डाली गई: /
एमिग्ना

9

जावास्क्रिप्ट (ईएस 6), 88 85 बाइट्स

स्ट्रिंग के एक सरणी के रूप में इनपुट लेता है। 0मुफ्त में या मुफ्त में नहीं लौटाता 1

a=>a.map(s=>([a,b]=s.split` `,t+={e:+a,c:-a,t:x=t*a/100,d:-x}[(b||'e')[0]]),t=0)|t<=0

यह काम किस प्रकार करता है

प्रत्येक पंक्ति को a= राशि, b= प्रकार के संचालन के लिए स्थान पर विभाजित किया गया है । यदि कोई ऑपरेशन नहीं है (जो पहली पंक्ति में मामला है), bडिफ़ॉल्ट रूप से "e""अतिरिक्त" के लिए सेट है ।

कुल में सही राशि जोड़ने के लिए t, हम एक ऑब्जेक्ट का उपयोग करते हैं, जिसकी कुंजी ऑपरेशन का पहला अक्षर है:

{
  e: +a,           // extra
  c: -a,           // coupon
  t: t * a / 100,  // tip
  d: -t * a / 100  // discount
}

नोट : यदि बिल में केवल एक तत्व शामिल map()होता है , तो एकल-तत्व सरणी लौटाएगा जो |ऑपरेटर को लागू करने पर एक पूर्णांक के लिए मजबूर किया जाएगा , जिससे अंतिम परीक्षण विफल हो जाएगा। लेकिन ओपी ने पुष्टि की कि ऐसा नहीं हो सकता। (2 या अधिक तत्वों की सारणियाँ 0. के लिए बाध्य हैं)

डेमो


3

CJam , 45 42 बाइट्स

q~Sf/(sd\{L(d\~ci6%"1\-* + )* -"S/=~}fL0>!

इनपुट को स्ट्रिंग्स के एक सरणी के रूप में लें, और टिप और छूट को दशमलव के रूप में लें।

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

व्याख्या

q~                e# Read and eval the input.
Sf/               e# Split each string by spaces.
(sd               e# Pull out the first element (base price) and cast it to a double.
\                 e# Bring the array back to the top.
{                 e# For each element L in the array:
 L                e#  Push L.
 (d               e#  Pop out the first element and cast it to a double.
 \~               e#  Bring the second element to the top of the stack.
 ci6%             e#  Mod its first character's ASCII value by 6. (c,d,e,t) -> (3,4,5,2)
 "1\-* + )* -"S/  e#  Push this string and split it on spaces.
 =                e#  Get the element given by number from the mod. CJam uses modular arrays,
                  e#    so 4 and 5 get elements 0 and 1 respectively.
 ~                e#  Eval whichever string was retrieved.
}fL               e# (end of loop)
0>!               e# Check if it's not greater than 0.

पहले अक्षरों के आधार पर मूल्यांकन किया जाने वाला कोड:

t -> ")*"    Adds 1 to the tip amount and multiplies it by the current price.

d -> "1\-*"  Subtracts the discount amount from 1 and multiplies it by the current price.

e -> "+"     Adds the extra amount to the current price.

c -> "-"     Subtracts the coupon amount from the current price.

3

जेली ,  42 39 बाइट्स

⁾_@
⁾C×
”+
⁾‘×
ḲµṪḢO%7µĿṭ
ḢW;Ç€j”µFV>0¬

दशमलव स्वरूपित संख्याओं के साथ तार की एक सूची लेता है
(अग्रणी शून्य काम करेगा , लेकिन अंतिम परिणाम से पहले STDOUT में शून्य मुद्रण के दुष्प्रभाव हैं)।

इसे ऑनलाइन आज़माएं! - खाली नहीं; या मुफ्त

कैसे?

⁾_@ - Link 1: a coupon
⁾_@ - literal "_@" - the Jelly code for subtraction with reversed arguments

⁾C× - Link 2: a discount
⁾C× - literal "C×" - the Jelly code for complement (1-input) then multiply

”+ - Link 3: extra cost
”+ - literal '+' - the Jelly code for add

⁾‘× - Link 4: a tip
⁾‘× - literal "‘×" - the Jelly code for increment (input+1) then multiply

ḲµṪḢO%7µĿṭ - Link 5, switch: char list
Ḳ          - split on spaces (gives [amount, type] as char lists)
 µ     µ   - monadic chain separation to get a value, say v
  Ṫ        - tail (get the type: "coupon", "discount", "extra", or "tip")
   Ḣ       - head (get the first character: 'c', 'd', 'e' or 't') 
    O      - cast to ordinal (99, 100, 101, or 116)
     %7    - mod 7 (1, 2, 3, or 4)
        Ŀ  - call link v as a monad
         ṭ - tack to the amount char list

ḢW;Ç€j”µFV>0¬ - Main link: list of strings (char lists)
Ḣ             - head - the base price char list
 W            - wrap in a list
   Ç€         - call the last link (5) as a monad for €ach of the rest
  ;           - concatenate
      ”µ      - literal 'µ' - Jelly's monadic chain separator
     j        - join all the parts with 'µ's             "10",".2 tip",".2 discount", "2 coupon","2 coupon","1 coupon",".5 discount","2.55 coupon":
        F     - flatten (makes a char list, for example: "10µ.20‘×µ.20C×µ2_@µ2_@µ1_@µ.50C×µ2.55_@")
         V    - evaluate as Jelly code (the above evaluates to -0.2499999999999991)
          >0  - greater than 0?
            ¬ - not

लगातार मेरे लिए 0 आउटपुट ...
प्रोग्रामर

आह, शायद मुझे कहना चाहिए कि प्रारूप दशमलव का उपयोग करता है?
जोनाथन एलन

ओह। हाँ तुम्हें करना चाहिए।
प्रोग्रामर

मैं मो पर स्पष्टीकरण लिख रहा हूं, यहां एक मुफ्त लंच का एक उदाहरण है।
जोनाथन एलन

3

GNU sed + dc, 117 111 107 बाइट्स

-zदुभाषिया ध्वज का उपयोग करना (1 बाइट के रूप में स्कोर में शामिल):

s/discount/_tip/g
s/tip/.01*1+*/g
s/extra/+/g
s/coupon/-/g
s/.*/dc -e '& 0r-p'/e
s/[^-]*$/free/
s/-/not /

व्याख्या

#!/bin/sed -fz

# Convert to dc expression (discount is just a negative tip)
s/discount/_tip/g
s/tip/.01*1+*/g
s/extra/+/g
s/coupon/-/g

# Run dc
s/.*/dc -e '& 0r-p'/e

# Convert to pretty output
s/[^-]*$/free/
s/-/not /

के बाद से इनपुट पहले से ही बहुत रिवर्स पोलिश संकेतन के करीब है, यह एक साधारण बात को बदलने के लिए है extraऔर couponकरने के लिए +और -, और भी बहुत कुछ मल्टीप्लायरों में प्रतिशत बदलने के लिए नहीं। फिर dcएक रिड्यूबल रिजल्ट मंगाएं और उत्पन्न करें, जो कि -पाया गया है (हमें परिणाम को नकारना है, इसलिए -इसका तात्पर्य "फ्री नहीं" है, अन्यथा 0 एक विशेष मामला होगा जिसे अपने स्वयं के हैंडलिंग की आवश्यकता होगी)।

उदाहरण

सवाल से दूसरा मामला है:

10
20 tip
20 discount
2 coupon
2 coupon
1 coupon
50 discount
2.55 coupon

यह dcकार्यक्रम बन जाता है :

10
20 .01*1+*
20 _.01*1+*
2 -
2 -
1 -
50 _.01*1+*
2.55 -
 0r-p

जिसके परिणामस्वरूप:

free

2

जावास्क्रिप्ट, 173 169 145 बाइट्स

i=>{w=i.split`\n`.map($=>$.split` `);t=+w.shift()[0];p=$=>t*$/100;w.map(x=>{k=+x[0];f=x[1][0];l={e:k,c:-k,t:p(k),d:-p(k)},t+=l[f]});return t<=0;}

अभी भी बहुत कुछ करने के लिए गोल्फ होना चाहिए

इसे ऑनलाइन आज़माएं! (वर्तमान में 145 बाइट्स)

कोशिश करके देखो:

<script>var _=i=>{w=i.split('\n').map($=>$.split(' '));t=+w.shift()[0];p=$=>t*$/100;w.map(x=>{k=+x[0];f=x[1][0];t+=f=='e'&&k||f=='c'&&(-k)||f=='t'&&p(k)||f=='d'&&(-p(k))});return t<=0;}</script>
<textarea oninput="document.querySelector('pre').innerText=_(this.value)"></textarea>
<pre></pre>

अपने सभी गोल्फ सलाह के लिए प्रोग्रामर 5000 का धन्यवाद


नोड की आवश्यकता क्यों है?
प्रोग्रामर

1
इसके अलावा, आप कर सकते हैं {w=i.split`<nl>`जहां <nl> एक शाब्दिक newline है
प्रोग्रामर

नोड की आवश्यकता नहीं है। मैंने अभी इसका इस्तेमाल TIO
अल्बर्टो रिवेरा

मैंने इसे आज़माने के लिए एक स्टैक स्निपेट जोड़ा। यदि आपको यह पसंद नहीं है तो बेझिझक रोलबैक करें।
प्रोग्रामर

1
आप निकाल सकते हैं f=हिस्सा है, यह नियमों के अनुसार की अनुमति दी है, और आप की जगह ले सकता $.split(' ')साथ $.split` `
प्रोग्रामर

2

जावास्क्रिप्ट (ईएस 6), 97 107

एक अनुगामी newline के साथ एक बहुस्तरीय स्ट्रिंग के रूप में इनपुट।

t=>t.replace(/(\S+) ?(.*)?\n/g,(x,d,b)=>t-=b>'t'?-t*d/100:b>'e'?d:b>'d'?t*d/100:b?-d:d,t=0)&&t>=0

Regexp प्रत्येक रेखा के लिए d और b में संख्यात्मक और वैकल्पिक पाठ भाग को विभाजित करता है ।
गणना अधिक या कम obviuos होनी चाहिए। बस कुछ ध्यान दें:
- -=तार के साथ संख्या को मिलाने में आने वाली समस्याओं से बचने के लिए
- 1 बाइट को बचाने के लिए राशि का योग किया जाता है, इसलिए अंतिम जांच >= 0इसके बजाय होती है<= 0

PS अभी भी @ अरनौल्ड की तुलना में अधिक लंबा है। चूहे।

परीक्षा

var f=
t=>t.replace(/(\S+) ?(.*)?\n/g,(x,d,b)=>t-=b>'t'?-t*d/100:b>'e'?d:b>'d'?t*d/100:b?-d:d,t=0)&&t>=0

a=`12.34
15 tip
25 discount
1.5 extra
2 coupon
`
b=`10
20 tip
20 discount
2 coupon
2 coupon
1 coupon
50 discount
2.55 coupon
`

console.log('Not free: '+a,f(a))
console.log('Free: '+b,f(b))


1

सी # 324 219 बाइट्स

bool a(string[] l){var x=0f;foreach(var s in l){var b=float.Parse(s.Split(' ')[0]);if(s.EndsWith("p"))x*=b;else if(s.EndsWith("t"))x*=1-b;else if(s.EndsWith("n"))x-=b;else if(s.EndsWith("a"))x+=b;else x=b;}return x<=0;}

यह सुंदर नहीं है, और शायद सबसे अच्छा तरीका नहीं है, लेकिन यहां यह है। इनपुट को एक स्ट्रिंग ऐरे के रूप में पारित किया जाना चाहिए, और टिप्स / छूट को फ़्लोट्स ( 0.15 tipइसके बजाय 15 tip) के रूप में पारित किया गया क्योंकि यह कल्पना की टिप्पणियों में स्वीकार्य के रूप में स्पष्ट किया गया है।

explaination:

bool a(string[] l){                         //Define method with input string array l and bool output
    var x=0f;                               //Initialize float x
    foreach(var s in l){                    //Iterate through lines
        var b=float.Parse(s.Split(' ')[0]); //Parse the number from the line and store it in float b
        if(s.EndsWith("p"))                 //If line ends with "p" then line is "tip"
            x*=b;                           //Parse number from line to float add 1 and multiply by x
        else if(s.EndsWith("t"))            //If line ends with "t" then line is "discount"
            x*=1-b;                         //Parse number from line to float, subtract from 1 and multiply by x
        else if(s.EndsWith("n"))            //If line ends with "n" then line is "coupon"
            x-=b;                           //Parse number from line to float and subtract from x
        else if(s.EndsWith("a"))            //If line ends with "a" then line is "extra"
            x+=b;                           //Parse number from line to float and add to x
        else x=b;                           //Line is base price
    }                                       //End foreach
    return x<=0;                            //Return x less than or equal to 0
}                                           //End method

यह करने के लिए एक बेहतर तरीका होना चाहिए, लेकिन यह कम से कम काम करता है


अगर आपको फ्लोट के रूप में टिप्स / छूट दी गई है तो आप शाखा 100में ऐसा नहीं चाहते हैं t
वाई हा ली

@AiHaLee उफ़, अच्छी बात है, कि 1 को बदलना भूल गए
Skidsdev

टिप: float.Parse(s.Split(' ')[0])नकल को कम करने के लिए किसी चीज़ में डालें । वह लगभग 80 वर्णों को बचाएगा।
वाई हा ली

अरे वाह मैं एक भयानक गोल्फर हूं मैंने अनावश्यक व्हाट्सएप भी नहीं हटाया। मैं विजुअल स्टूडियो को दोष देता हूं।
स्काइड्सदेव

एक बुरा प्रयास बिल्कुल नहीं!
वाई हा ली

1

पॉवरशेल , 218 156 143 बाइट्स

($n=$args)|%{[float]$v,$w=$_-split' ';switch -w($w){"t*"{$t+=$v}"d*"{$d+=$v}"e*"{$e+=$v}"c*"{$c+=$v}}};($n[0]*(1+$t/100)*(1-$d/100)+$e-$c)-lt 0

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

संपादित पाइप पहले से ही चर चर बंटवारे से बचे

EDIT 2 स्ट्रिंग का दूसरा भाग संग्रहीत करता है ताकि मैं बेहतर वाइल्डकार्ड कॉल कर सकूं


काम करने लगता है, और आपका इनपुट प्रारूप ठीक है।
प्रोग्रामर

1

पायथन 133 बाइट्स

def f(b):
 t=float(b.pop(0))
 for l in b:
  v,a=l.split(' ');v=float(v);t+={'t':t*v/100,'d':-t*v/100,'c':-v,'e':v}[a[0]]
 return t<=0

जावास्क्रिप्ट ईएस 6 संस्करण के समान। लेकिन इसके लिए टाइप रूपांतरण आवश्यक हैfloat पायथन में मूल्यों के ।

स्पष्टीकरण:

पहला मान निकालें और इसे फ्लोट में बदलें।

बिल में एक दूसरे पंक्ति के लिए:

  1. विभाजित करें और मान को इसमें परिवर्तित करें float
  2. का उपयोग dictपहले अक्षर के अनुसार सही संचालन का चयन करने के लिए का
  3. मान संचित करें

उपयोग:

print(f([
'12.34',
'15 tip',
'25 discount',
'1.5 extra',
'2 coupon'
]))

print(f([
'10',
'20 tip',
'20 discount',
'2 coupon',
'2 coupon',
'1 coupon',
'50 discount',
'2.55 coupon'
]))

साइट पर आपका स्वागत है!
DJMcMayhem

1

जावा 227 बाइट्स

कुछ समय और अभी भी कोई जावा उत्तर नहीं है जो मैं देख सकता हूं, इसलिए यहां मेरा C # उत्तर 8 बाइट्स की कीमत पर जावा में पोर्ट किया गया है

boolean a(String[] l){Float x=0f;for(String s:l){Float b=Float.parseFloat(s.split(" ")[0]);if(s.endsWith("p"))x*=b;else if(s.endsWith("t"))x*=1-b;else if(s.endsWith("n"))x-=b;else if(s.endsWith("a"))x+=b;else x=b;}return x<=0;}

स्पष्टीकरण के लिए और इस तरह, मेरा C # उत्तर देखें

उस उत्तर की तरह, यह उत्तर अपेक्षा करता है कि टिप और छूट को फ्लोट के रूप में पारित किया जाए ( 0.15नहीं 15)



1
@ प्रोग्रामर 5000 निष्पक्ष होने के लिए # जावा की तुलना में थोड़ा कम क्रिया है, मुख्य फायदे varजेनेरिक प्रकार के सी # का समर्थन और लैम्ब्डा जैसी चीजें हैं (मुझे पता है कि जावा उनके पास है, लेकिन सी # के गोल्फर हैं)
स्काइड्सडेव

1

Jq 1.5 , 129 119 114 112 बाइट्स

reduce (.[]/" "|.[0]|=tonumber|.[1]|=length)as[$n,$c](0;[$n,0,0,.+.*($n/100),0,.+$n,.-$n,0,.-.*($n/100)][$c])<=0

विस्तारित

  reduce (
      .[]/" "             # split each element into [value,command] 
    | .[0]|=tonumber      # convert value to number    
    | .[1]|=length        # convert command to length
  ) as [$n,$c]
  (  0
   ; [ $n                 # "" -> set base
     , 0
     , 0
     , .+.*($n/100)       # "tip"
     , 0
     , .+$n               # "extra"
     , .-$n               # "coupon"
     , 0                  
     , .-.*($n/100)       # "discount"
     ][$c]                # ... depending on command length
  ) <=0                   # true if lunch was free

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

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