নিখরচায় দুপুরের খাবারের মতো জিনিস নেই


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 দশমিক স্থান হতে হবে।
  • আপনি নিউলাইনগুলি (ট্রেলিং নিউলাইন optionচ্ছিক) বা অন্য বিচ্ছেদ চরিত্র, বা ইনপুটগুলির একটি অ্যারে / তালিকার স্ট্রিং হিসাবে ইনপুট নিতে পারেন take

5
ইনপুটটির কি নাম থাকা দরকার, বা আমরা কেবলমাত্র [12.34,15,25,1.5,2] সংখ্যার একটি অ্যারে ইনপুট দিলে আমরা অর্ডারটি ধরে নিতে পারি?
সিনুসয়েড

@ স্টিভিগ্রিফিন আপনি পছন্দটি পছন্দ করতে পারবেন না। এখানে 5 টিরও বেশি সারি বা কমও থাকতে পারে। আপনি ২ টি কুপন নিতে পারেন 2.00 কুপন হিসাবে, এবং 15 tipহিসাবে0.15 tip
প্রোগ্রামার

এই ইনপুট কি সংবেদনশীল? আমাদের কি সমর্থন করতে হবে এই সমস্ত শব্দ?
আর

@ রিকার যে সমস্ত শব্দ প্রয়োজন, এবং ইনপুট সবসময় নিম্ন ক্ষেত্রে হবে।
programmer5000

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

জাভাস্ক্রিপ্ট (ES6), 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

সিজেম , 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 আউটপুট করে ...
প্রোগ্রামার

আহ, সম্ভবত আমার বলা উচিত যে ফর্ম্যাটটি দশমিক ব্যবহার করে?
জোনাথন অ্যালান

উহু. হ্যাঁ তোমার উচিৎ.
programmer5000

আমি মো তে ব্যাখ্যাটি লিখছি, এখানে নিখরচায় দুপুরের খাবারের উদাহরণ।
জোনাথন অ্যালান

3

জিএনইউ সেড + ডিসি, 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করতে +এবং -, এবং আরো অনেক multipliers মধ্যে শতকরা পরিবর্তন না। তারপরে প্রার্থনা করুন 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;}

এখনও প্রচুর গল্ফ করা উচিত

এটি অনলাইন চেষ্টা করুন!(বর্তমানে ১৪5 বাইট)

চেষ্টা কর:

<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>

প্রোগ্রামার 5000000 তার সমস্ত গল্ফিং পরামর্শের জন্য ধন্যবাদ


নোড কেন প্রয়োজন?
programmer5000

1
এছাড়াও, আপনি {w=i.split`<nl>`যেখানে করতে পারেন <nl> একটি আক্ষরিক নতুনলাইন
প্রোগ্রামার

নোড প্রয়োজন হয় না। আমি এটি টিআইও
আলবার্তো রিভেরা

এটি চেষ্টা করার জন্য আমি একটি স্ট্যাক স্নিপেট যুক্ত করেছি। আপনি যদি না পছন্দ করেন তবে নির্দ্বিধায় রোলব্যাক করুন।
programmer5000

1
আপনি f=অংশটি সরাতে পারেন , এটি নিয়ম দ্বারা অনুমোদিত এবং আপনি এটির $.split(' ')সাথে প্রতিস্থাপন করতে পারেন $.split` `
programmer5000

2

জাভাস্ক্রিপ্ট (ES6), 97 107

ট্রেলিং করা নতুন লাইনের সাথে মাল্টলাইন স্ট্রিং হিসাবে ইনপুট।

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 এ প্রতিটি লাইনের জন্য সাংখ্যিক এবং alচ্ছিক পাঠ্য অংশকে বিভক্ত করে ।
গণনাগুলি কমবেশি অবভিউস হওয়া উচিত। কেবলমাত্র কিছু দ্রষ্টব্য:
- -=স্ট্রিংয়ের সাথে সংখ্যার মিশ্রণ করতে সমস্যা এড়াতে
- যোগফল 1 বাইট সংরক্ষণ করার জন্য অবহেলা করা হয়েছে, তাই শেষ চেকটি হ'ল>= 0 পরিবর্তে এর হয়<= 0

@ আরনাউল্ডের চেয়ে পিএস এখনও অনেক দীর্ঘ। ইঁদুর।

পরীক্ষা

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

এটি করার আরও ভাল উপায় থাকতে হবে তবে এটি কমপক্ষে কাজ করে


আপনি floats করে টিপ্স / ডিসকাউন্ট দেওয়া হয়েছে থাকেন তাহলে তারপর আপনি যে চান না 100tশাখা।
ওয়াই হা লি

@ ওয়াইএইলি উফ, ভাল কথা, এটি 1 এ পরিবর্তন করতে ভুলে
গিয়েছেন

টিপ: সদৃশতা float.Parse(s.Split(' ')[0])হ্রাস করার জন্য কিছু লাগান into এটি প্রায় 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

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

আগেই পাইপযুক্ত ভেরিয়েবলটি বিভক্ত করে সম্পাদনা বাইটস

সম্পাদনা 2 স্ট্রিংয়ের দ্বিতীয় অংশ সংরক্ষণ করা যাতে আমি আরও ভাল ওয়াইল্ডকার্ড কল করতে পারি


কাজ মনে হচ্ছে এবং আপনার ইনপুট ফর্ম্যাটটি ঠিক আছে is
programmer5000

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

জাভাস্ক্রিপ্ট ES6 সংস্করণ অনুরূপ। 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'
]))

সাইটে স্বাগতম!
ডিজেএমসিএমহেম

1

জাভা 227 বাইট

কিছুক্ষণ হয়ে গেছে এবং এখনও আমি দেখতে পাচ্ছি এমন কোনও জাভা উত্তর নেই, সুতরাং এখানে আমার সি # উত্তরটি জাভাতে 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;}

একটি ব্যাখ্যা এবং এর জন্য, আমার সি # উত্তর দেখুন

এই উত্তরটির মতো, এই উত্তরটি প্রত্যাশা করে যে টিপ এবং ছাড়টি ভাসমান হিসাবে পাস হবে ( 0.15নয় 15)



1
@ প্রোগ্রামার ৫০০০ ন্যায্য হতে সি # জাভা থেকে সামান্য কম ভার্বোস, প্রধান সুবিধাগুলি সি # এর varজেনেরিক ধরণের সমর্থন , এবং ল্যাম্বডাসের মতো জিনিস (আমি জানি জাভা তাদের রয়েছে, তবে সি # এর গল্ফিয়ার)
স্কিডেদেব

1

জকি 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

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

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