परिवर्तनीय-मूल्य आय!


16

परिचय और श्रेय

आप एक बारटेंडर हैं मान लें। आपके पास कई बार आपके बार में कई खुशहाल लोग हैं, लेकिन कई कभी केवल एक ही पेय पीते हैं और बहुत कम अपने स्वाद के लिए और आप इसे बदलना चाहते हैं। तो आप एक ऐसी प्रणाली शुरू करते हैं जहां एक पेय की कीमत परिवर्तनशील होती है, यह इस बात पर निर्भर करता है कि कितने पहले ही बेचे जा चुके हैं, लेकिन किसी भी थ्रेशोल्ड की तुलना में अधिक या कम महंगा नहीं है। किसी विषम कारण के लिए आप हमेशा सभी बेचे जाने वाले पेय और कीमतों का उचित ट्रैक रखना भूल जाते हैं और इस तरह आपको कोड के एक छोटे (= यादगार!) टुकड़े के बारे में सोचने की ज़रूरत होती है जो आपके द्वारा पीए गए पेय की मात्रा को गणित देता है।

यह चुनौती 2012 में मेरी यूनी में फ़ंक्शनल प्रोग्रामिंग कोर्स में मध्यावधि परीक्षा में दिखाई दे चुकी है और मुझे यहाँ पर पोस्ट करने के लिए मेरे प्रोफेसर का ओके मिला है। हमें परीक्षा की भाषा में एक उदाहरण समाधान प्रदान किया गया है।

इनपुट

आपके इनपुट में स्ट्रिंग्स की एक सूची होगी जिसमें रिक्त स्थान नहीं हैं - ये बेचे गए पेय के नाम हैं। अपने पसंदीदा, आमतौर पर स्वीकृत इनपुट पद्धति का उपयोग करके इनपुट लें

उत्पादन

आपका आउटपुट एकल नंबर होगा - यह वह आय है जो आपने आज शाम को उत्पन्न की है। अपने पसंदीदा, आमतौर पर स्वीकृत आउटपुट पद्धति का उपयोग करके आउटपुट दें

क्या करें?

यह प्रत्येक पेय के लिए व्यक्तिगत रूप से लागू होता है:

  • शुरुआती कीमत 10 है।
  • जब भी पेय खरीदा जाता है, तो अगले खरीदार के लिए इसकी कीमत 1 से बढ़ जाती है।
  • अधिकतम मूल्य 50 है। यदि पेय 50 के लिए खरीदा गया है तो नया मूल्य 10 फिर से होगा।

आपका कार्य उपरोक्त आय को देखते हुए पेय की इनपुट सूची द्वारा उत्पन्न समग्र आय को खोजना है।


मामले में आप सोच रहे हैं: "50 रुपये वास्तव में एक पेय के लिए महंगा है!", यह 50-डेसी बक है, इसलिए 50 * 0.1 * यूनिट है, लेकिन मैंने 10-50 के लिए जाने का विकल्प चुना है, बिना भाषा के बाहर न जाने के लिए फ्लोटिंग पॉइंट अंकगणित।

किसी जीत?

यह , इसलिए बाइट्स में सबसे छोटा कोड जीतता है! मानक नियम लागू होते हैं।

संभावित कॉर्नर मामले

यदि इनपुट सूची खाली है, तो आउटपुट 0. होगा
। इनपुट सूची icannot को पेय द्वारा क्रमबद्ध माना जाएगा।

उदाहरण

[] -> 0
["A"] -> 10
["A","B"] -> 20
["A","A","B"] -> 31
["A","B","A"] -> 31
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1240
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"] -> 1304 
["D","A","A","C","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"] -> 1304
["A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"] -> 1304

1
पोस्ट करने से पहले अपने प्रोफेसर से पूछें, काफी ओजी मूव।
मैजिक ऑक्टोपस Urn

जवाबों:


4

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

a=>a.map(x=>t+=d[x]=d[x]<50?d[x]+1:10,t=0,d={})&&t

आप d[x]10 में से कहाँ जाते हैं ?
टाइटस

@ टिट्स यदि d[x]सेट नहीं किया गया है, तो यह undefined; यह d[x]<50गलत बनाता है , इसलिए d[x]=d[x]<50?d[x]+1:10सेट करता d[x]है 10
२३

मैं भूल गया कि जेएस है undefined। :)
टाइटस

4

पायथन 2, 79 74 54 48 बाइट्स

समस्या पर पुनर्विचार करके बड़े पैमाने पर बाइट की गिनती बढ़ जाती है। मैं intकलाकारों से छुटकारा पाना चाहूंगा लेकिन मेरा दिमाग काम नहीं कर रहा हैl.pop()सूची को दो बार ट्रिम करने से बचने के लिए उपयोग करना और कुछ अच्छे पुराने लंबोदर पुनरावृत्ति :)

f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0

6 बाइट बचाने के लिए जोनाथन एलन को धन्यवाद :)

मेरे पुराने 54-बाइट संस्करण पर मुझे काफी गर्व था :)

f=lambda l:int(l>[])and~-l.count(l[0])%41+10+f(l[1:])

...l>[]and 1*~... उन 3 बाइट्स को बचाने के लिए जिन्हें आप जानते थे कि आप कर सकते हैं।
जोनाथन एलन

वास्तव में 1 कम के साथ: f=lambda l:l and~-l.count(l[0])%41+10+f(l[1:])or 0
जोनाथन एलन

ऊह और एक और दो के साथ: f=lambda l:l and l.count(l.pop())%41+10+f(l)or 0
जोनाथन एलन

@JonathanAllan सुझावों के लिए धन्यवाद! मैं अपनी पोस्ट जल्द ही अपडेट करूंगा :)
Kade

2

अजगर, 15 बाइट्स

ssm<*lQ}T50/Qd{

एक प्रोग्राम जो किसी सूची का इनपुट लेता है और परिणाम प्रिंट करता है।

टेस्ट सूट (पहली इनपुट कई इनपुट की अनुमति देने के लिए)

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

ssm<*lQ}T50/Qd{   Program. Input: Q
ssm<*lQ}T50/Qd{Q  Implicit input fill
              {Q  Deduplicate Q
  m               Map over that with variable d:
       }T50        Yield [10, 11, 12, ..., 48, 49, 50]
    *lQ            Repeat len(Q) times
   <       /Qd     First Q.count(d) elements of that
 s                Flatten
s                 Sum
                  Implicitly print

2

जेली , १४ ११ 10 बाइट्स

50⁵rṁЀĠSS

TryItOnline!

कैसे?

50⁵rṁЀĠSS - Main link: list of drink names                e.g. ['d', 'a', 'b', 'a', 'c']
       Ġ   - group indices by values                       e.g. [[2, 4], [3], [5], [1]]
  ⁵        - 10
50         - 50
   r       - inclusive range, i.e. [10, 11, 12, ..., 48, 49, 50]
    ṁЀ    - mould left (the range) like €ach of right(Ð)  e.g. [[10, 11], [10], [10], [10]]
                 note: moulding wraps, so 42 items becomes [10, 11, 12, ..., 48, 49, 50, 10]
        S  - sum (vectorises)                              e.g. [40, 11]
         S - sum                                           e.g. 51

2

05AB1E , 16 15 बाइट्स

करने के लिए धन्यवाद एमिग्ना ने मानाबाइट बचाने !

ÎÙv¹y¢L<41%T+OO

CP-1252 एन्कोडिंग का उपयोग करता है । इसे ऑनलाइन आज़माएं!


ÎÙv¹y¢L<41%T+OO1 बाइट बचाकर काम करना चाहिए
Emigna

@Eignigna यह अच्छा है! धन्यवाद :)
अदनान

1

पर्ल 41 बाइट्स

के लिए +1 शामिल है -p

$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{

Newlines पर इनपुट लेता है।

वेतन वृद्धि एक हैश मान द्वारा: 10 यह है कि अगर undef, -40यह है कि अगर > 49यानी 50, या 1अन्यथा। यह तब $\आउटपुट विभाजक में जोड़ा जाता है , जो -pप्रिंट करता है।

उदाहरण:

$ echo -e 'A\nB\nA' | perl -pe '$\+=$H{$_}+=$H{$_}?$H{$_}>49?-40:1:10;}{'
31

1

05AB1E , 13 बाइट्स

{.¡€gL<41%T+O

व्याख्या

["A","B","A"] उदाहरण के रूप में इस्तेमाल किया।

{               # sort input
                # STACK: ["A","A","B"]
 .¡             # split on different
                # STACK: [["A","A"],["B"]]
   €g           # length of each sublist
                # STACK: [2,1]
     L          # range [1 ... x] (vectorized)
                # STACK: [1,2,1]
      <         # decrease by 1
                # STACK: [0,1,0]
       41%      # mod 41
                # STACK: [0,1,0]
          T+    # add 10
                # STACK: [10,11,10]
            O   # sum
                # OUTPUT: 31

1

सी ++ 14, 105 बाइट्स

संदर्भ पैरामीटर के माध्यम से लौटते हुए सामान्य अनाम लैम्ब्डा के रूप में। इनपुट की आवश्यकता है stringकि कंटेनर होना चाहिए push_back, जैसेvector<string>

%41+10काडे के पायथन उत्तर से चाल का उपयोग करना ।

[](auto X,int&r){r=0;decltype(X)P;for(auto x:X){int d=0;for(auto p:P)d+=x==p;r+=d%41+10;P.push_back(x);}}

Pस्मृति के रूप में एक खाली कंटेनर बनाता है जो पहले से ही परोसा गया है। में गिना जाता xहै P

अधूरा और उपयोग:

#include<iostream>
#include<vector>
#include<string>

using namespace std;

auto f=
[](auto X, int& r){
  r = 0;
  decltype(X) P;
  for (auto x:X){
    int d = 0;
    for (auto p:P)
      d += x==p;
    r += d % 41 + 10;
    P.push_back(x);
  }
}
;

int main(){
 int r;
 vector<string> V;
 f(V,r);cout << r << endl;
 V={"A"};
 f(V,r);cout << r << endl;
 V={"A","B"};
 f(V,r);cout << r << endl;
 V={"A","B","C"};
 f(V,r);cout << r << endl;
 V={"A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","B","B","C","C","D"};
 f(V,r);cout << r << endl;
 V={"A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","A","B","C"};
 f(V,r);cout << r << endl;
}

0

मैथेमेटिका, 64 बाइट्स

ऐसा लगता है कि यह छोटा होना चाहिए।

Tr[(19+#)#/2&/@(Length/@Gather@#//.z_/;z>41:>Sequence[41,z-41])]&

Length/@Gather@#प्रत्येक पेय की पुनरावृत्ति को गिना जाता है। //.z_/;z>41:>Sequence[41,z-41]किसी भी पूर्णांक को z41 से अधिक में विभाजित करता है 41और z-41मूल्य में गिरावट को दर्शाता है। फिर प्रत्येक काउंट्स को सूत्र में प्लग किया जाता है (19+#)#/2, जो कि #पेय की कुल लागत है जब तक कि #सबसे अधिक 41 हो। अंत में, Trउन लागतों को पूरा करता है।


0

k, 22 बाइट्स

तर्क कोई भी सूची हो सकती है - तार, संख्या विज्ञान आदि।

{+/,/10+(#:'=x)#\:!41}

qअनुवाद पढ़ने में आसान है:

{sum raze 10+(count each group x)#\:til 41}

0

सी #, 193 बाइट्स + 33

के लिए एक अतिरिक्त 33 बाइट्स using System.Collections.Generic;

void m(string[]a){int t=0;Dictionary<string,int>v=new Dictionary<string,int>();foreach(string s in a){if(v.ContainsKey(s)){v[s]=v[s]==50?10:v[s]+1;}else{v.Add(s,10);}t+=v[s];}Console.WriteLine(t);}

मुझे यकीन है कि यह विस्मरण के लिए तैयार किया जा सकता है, शब्दकोश निश्चित रूप से ऐसा करने का सबसे अच्छा तरीका नहीं है और मैं शायद अपने में एक टर्नरी काम कर सकता हूं। इसके अलावा मुझे लगता है कि यह ठीक है!

उदाहरण:

a = {"A", "A", "A", "B", "B", "C"};
//output = 64

a = {"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A",, "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A", "A" ,"A" "A" ,"A", "A" ,"A", "B", "B", "C"};
//output 727

Ungolfed

void m(string[] a)
{
    int t=0;
    Dictionary<string,int> v = new Dictionary<string,int>();
    foreach(string s in a)
    {
        if(v.ContainsKey(s))
        {
            v[s]=v[s]==50?10:v[s]+1;
        }
        else
        {
            v.Add(s,10);
        }
        t+=v[s];
    }
    Console.Write(t);
}

0

क्लोजर, 79 बाइट्स

#(apply +(mapcat(fn[l](for[i(range l)](+(mod i 41)10)))(vals(frequencies %)))))

पेय की आवृत्तियों की गणना करता है, फिर आधार मूल्य की गणना करता है 10 + (i % 41)mapcatउन्हें संक्षिप्त करता है और apply +योग की गणना करता है।


0

PHP, 47 बाइट्स

while($k=$argv[++$i])$s+=10+$p[$k]++%41;echo$s;

कमांड लाइन तर्कों से इनपुट लेता है; साथ चलाना -r

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