एक पाई की दुकान का प्रबंधन!


12

सारांश

कोड गोल्फ अच्छा है। पाई अच्छी है । जब आप दोनों को एक साथ रखते हैं, केवल अच्छी चीजें हो सकती हैं।

विशेष विवरण

इस चुनौती में आप एक पाई दुकान का प्रबंधन करेंगे। उपयोगकर्ता पांच अलग-अलग आदेशों इनपुट करने के लिए सक्षम हो जाएगा: list, count, buy, sell, और exit। यहाँ प्रत्येक के लिए विनिर्देशों हैं:

  • list

    • सभी pies के स्वामित्व की सूची, और कितने प्रिंट करें। |दोनों तरफ एक जगह के साथ और पैड के साथ अलग । |s गठबंधन होना चाहिए। पाई राशि नकारात्मक हो सकती है (इसका मतलब है कि आप किसी को पाई देना चाहते हैं :()। उदाहरण के लिए:

      | apple     | 500 |
      | blueberry | 2   |
      | cherry    | -30 |
      
  • count [type]

    • प्रिंट कितने {{type}}पीज़ हैं। प्रिंट करें "कोई {{type}}पाई नहीं है!" अगर कोई नहीं है। {{type}}हमेशा रेगेक्स से मेल खाएगा \w+(यानी, यह हमेशा एक ही शब्द होगा)। उदाहरण के लिए, यदि मेरे पास उपरोक्त उदाहरण सूची में दिखाए गए पाई की मात्रा थी, तो

      > count apple
      500
      > count peach
      There is no peach pie!
      
  • buy [n] [type]

    • पाई {{n}}की गिनती में जोड़ें {{type}}, और इसे प्रिंट करें। {{type}}यदि यह मौजूद नहीं है तो पाई बनाएं । {{n}}हमेशा रेगेक्स से मेल खाएगा [0-9]+(यानी, यह हमेशा एक नंबर होगा)। यहां एक और उदाहरण है (पिछले उदाहरणों के समान पाई सूची के साथ):

      > count blueberry
      2
      > buy 8 blueberry
      10
      
  • sell [n] [type]

    • पाई {{n}}की गिनती से घटाएं {{type}}, और इसे प्रिंट करें। {{type}}यदि यह मौजूद नहीं है तो पाई बनाएं । पाई नकारात्मक हो सकती है (अरे नहीं, इसका मतलब यह होगा कि आप किसी को पाई देना चाहते हैं!)।

      > sell 15 blueberry
      -5
      > buy 5 blueberry
      0
      
  • exit

    • प्रिंट करें "पाई स्टोर बंद हो गया है!" और प्रोग्राम से बाहर निकलें।

      > exit
      The pie store has closed!
      

और स्पष्टीकरण

  • यदि एक गैर-मौजूदा फ़ंक्शन को (पहला शब्द) कहा जाता है, तो "यह एक मान्य कमांड नहीं है" प्रिंट करें।
  • यदि किसी मौजूदा फ़ंक्शन को अमान्य तर्कों (पहले शब्द के बाद के शब्द) के साथ बुलाया जाता है, तो आपका प्रोग्राम कैसे व्यवहार करता है, इससे कोई फर्क नहीं पड़ता। "अमान्य तर्क" में बहुत सारे तर्क शामिल हैं, बहुत कम तर्क, {{n}}संख्या नहीं होना, आदि।
  • पाई अच्छी है।
  • आपका इनपुट आपके आउटपुट से अलग होना चाहिए। यदि आप कमांड लाइन / टर्मिनल / शेल / अन्य टेक्स्ट-आधारित चीज़ पर प्रोग्राम चला रहे हैं, तो आपको " > ​"(" से अधिक "साइन और स्पेस) या कुछ अन्य शेल इनपुट उपसर्ग चीज़ के साथ प्रीफ़िक्स इनपुट करना होगा ।
  • पाई अच्छी है।
  • यदि ये सभी स्पष्टीकरण पर्याप्त नहीं हैं, तो यहां कुछ नमूना आउटपुट हैं:

    > list
    > buy 10 apple
    10
    > sell 10 blueberry
    -10
    > list
    | apple     | 10  |
    | blueberry | -10 |
    > count apple
    10
    > count peach
    There is no peach pie!
    > exit
    The pie store has closed!
    
  • आप / बिक्री पाई खरीद सकते हैं और शुद्ध गिनती हो जाता है 0, तो आप कर सकते हैं या तो उस में रखना listहै या नहीं, और आप कर सकते हैं या तो वापस कर 0या There is no {{type}} pie!जब आप countयह।

  • यह ; सबसे छोटा कोड जीतता है।
  • क्या मैंने उल्लेख किया कि पाई अच्छी है?

3
तो बस स्पष्ट करने के लिए ... पाई अच्छी है?
Igby Largeman

4
क्या शून्य की गिनती के साथ सूची में पाई रखना स्वीकार्य है? जैसा यदि आप buy 1 appleऔर sell 1 apple। और फिर क्या इसके बदले count appleलौटना वैध होगा ? 0There is no apple pie!
Igby Largeman

@IgbyLargeman डारन, मैंने सोचा कि मैंने सब कुछ स्पष्ट कर दिया है! : पी अतिरिक्त स्पष्टीकरण के लिए नए परीक्षण का मामला जोड़ा
दरवाज़े

@ डॉर्कनोब हे! मैं पिछले एक बेच दिए जाने के बाद "कोई सेब पाई नहीं है" आउटपुट कर रहा हूं।
जॉन ड्वोरक

@JDDvorak ठीक है, मुझे लगता है कि दोनों तरह से काम करेंगे। फिर से अपडेट किया गया
दरवाज़े

जवाबों:


3

माणिक, 335 330

h=Hash.new 0
loop{$><<"> "
puts case gets when/^list/
h.map{|x|?|+" %%%ds |"%h.flatten.map{|e|e.to_s.size}.max*2%x}when/^count (.*)/
h[$1]!=0?h[$1]:"There is no #{$1} pie!"when/^buy#{m=" (.*)"*2}/
h[$2]+=$1.to_i when/^sell#{m}/
h[$2]-=$1.to_i when/^exit/
puts"The pie store has closed!"
break else"That's not a valid command."end}

कुछ ट्रिक्स यहाँ:

?|+" %%%ds |"%[*h].flatten.map{|e|e.to_s.size}.max*2%x

एक फॉर्मेटर का उपयोग करने के लिए Doorknob के विचार को यहां एक कदम आगे बढ़ाया गया है, शाब्दिक रूप से। सबसे पहले, सभी कुंजियों और मानों के बीच हैश में सबसे लंबी स्ट्रिंग है " %%%ds |"जैसे स्ट्रिंग का उत्पादन करने के लिए " %6s |"। हां, प्रत्येक कॉलम को अलग से सिकोड़ना नहीं है। की आवश्यकता कभी नहीं थी। एक आकार सभी में फिट बैठता है। फिर इस स्ट्रिंग को डुप्लिकेट किया जाता है और वर्तमान पंक्ति वाले दो-तत्व सरणी के लिए स्वरूपण स्ट्रिंग के रूप में उपयोग किया जाता है। अंत में, +शुरुआत के पास अपना शब्द मिलता है और एक प्रमुख पाइप को प्रस्तुत करता है। ओह, और putsसरणियों का एक अच्छा हैंडलिंग है।

रूबी का रेगेक्स शाब्दिक अर्थ में प्रक्षेप है। यह एक तंग बचत है, लेकिन यह थोड़ी बचत करता है।

रूबी को whenअभिव्यक्ति के बाद अर्धविराम की आवश्यकता होती है , लेकिन कीवर्ड से पहले नहीं। यह एक अजीब प्रतिपादन विरूपण साक्ष्य की ओर जाता है जब अर्धविराम को एक नई रेखा के साथ बदल दिया जाता है।

और, निश्चित रूप से, पेरलिज्म को जादू के ग्लोबल्स के रूप में जाना जाता है और उनके खिलाफ रेगेक्स शाब्दिक का स्वचालित मिलान।

इसके अलावा, अधिकांश बयान caseभाव हैं।


बहुत चालाक चाल! +1
दरवाज़े

हम्म, लेकिन Hash.new(0)इसके बजाय क्यों {}?
दरवाज़े

1
@Doorknob Ruby के हैश में डिफ़ॉल्ट मान हो सकते हैं (यदि आप कोई ऑब्जेक्ट पास करते हैं) या जनरेटर भी (यदि आप किसी ब्लॉक (कुंजी, हैश -> मान) को पास करते हैं। यदि आप या तो पास नहीं करते हैं, तो डिफ़ॉल्ट मान है nil(जो नहीं करता है) अनुमति दें)। शाब्दिक nilडिफ़ॉल्ट मूल्य के रूप में उपयोग करता है ।
जॉन ड्वोरक

h=Hash.new(0)=> h=Hash.new 0, print"> "=> के साथ कुछ पात्रों को बचा सकता है $><<'> ', और मुझे लगता है कि [*h]बस हो सकता है h। मैंने स्विच स्टेटमेंट के बिना एक वर्जन को एक साथ रखने की कोशिश की, क्योंकि बॉयलरप्लेट टेक्स्ट वास्तव में जोड़ता है: gist.github.com/chron/6315218 । मैं कुछ काम करने की कोशिश कर रहा था, ruby -apलेकिन प्रॉम्प्ट की आवश्यकता ने इसे मुश्किल बना दिया: <
पॉल प्रेस्टिज

@ तुल्यकालन धन्यवाद! विश्वास नहीं कर सकता कि मैं पहले एक को याद कर रहा हूं, और मुझे यकीन नहीं है कि मैंने क्यों सोचा कि मैंने $><<एक नई रूपरेखा मुद्रित की है। अंतिम सुझाव के लिए ... दुर्भाग्य से, हैश में "समतल" विधि नहीं है।
जॉन ड्वोरक

3

रूबी, 427 384 अक्षर

alias x puts
p={}
loop{
print'> '
case(u=gets.chop.split)[0]when'exit'
x'The pie store has closed!'
exit
when'list'
p.each{|k,v|printf"| %-#{p.keys.map(&:size).max}s | %-#{p.map{|e,a|a.to_s.size}.max}s |\n",k,v}
when'count'
x p[t=u[1]]||"There is no #{t} pie!"
when/sell|buy/
m=(u[0]<?s?1:-1)*u[1].to_i
if p[t=u[2]]
x p[t]+=m
else
x p[t]=m
end
else x"That's not a valid command."
end}

427 से 384 (!) तक भारी सुधार के जन द्वारका का धन्यवाद


आप उपयोग कर सकते हैं loop{...}के बजाय while 1do...end
जॉन ड्वोरक

आप splitइसके तर्क के बिना उपयोग कर सकते हैं । डिफ़ॉल्ट रूप से, यह व्हाट्सएप द्वारा विभाजित होता है (या $;यदि वह सेट है)
जॉन ड्वोरक

p.keys.group_by(&:size).max[0]- क्या आप ढूंढ रहे हैं p.keys.map(&:size).maxया p.map{|x,_|x.size}.max? यहाँ: [(t=p.values).max.to_s.size,t.min.to_s.size].maxआप के लिए देख रहे हैं p.map{|_,x|x.to_s.size}.max? मैं आपका विचार लेने जा रहा हूं और फॉर्मेटर का दुरुपयोग कर रहा हूं, हालांकि :-)
जॉन ड्वोरक

p[t]=p[t]+mके बराबर है p[t]+=m( p[t]एक बार के बजाय दो बार मूल्यांकन किया जाता है) और लंबे समय तक। उत्तरार्द्ध का उपयोग करें।
जॉन ड्वोरक

@JDDvorak Oooh, सभी युक्तियों के लिए धन्यवाद: DI ने सोचा कि रूबी के पास कोई +=ऑपरेटर नहीं है ; इसलिए मैंने इसका उपयोग नहीं किया। शायद यह सिर्फ के लिए है ++। मैं जल्द ही अपनी पोस्ट संपादित होगा
दरवाज़े

3

अजगर पाई -थॉन 437

मुझे यकीन है कि दूसरी अंतिम पंक्ति में कुछ सुस्ती है, लेकिन पाई प्रकार और संख्या दोनों के लिए सलाखों को संरेखित करने की आवश्यकता एक डोज है।

p,C,l={},"count",len
while 1:
 a=raw_input("> ").split();c=a.pop(0)
 if"exit"==c:print"The pie store has closed!";break
 if"sell"==c:a[0]=int(a[0])*-1
 if c in[C,"buy","sell"]:
  y=a[-1]
  if c!=C:p[y]=p.get(y,0)+int(a[0])
  print p.get(y,"There is no %s pie!"%y)
 elif"list"==c:
  for i in p:print"| %s | %s |"%(i.ljust(l(max(p.keys(),l))),str(p[i]).rjust(max([l(str(x)) for x in p.values()])))
 else:print"That's not a valid command."

इग्बी लार्गेमैन की टिप्पणी के अनुसार नियम स्पष्ट नहीं हैं कि यदि कोई विशिष्ट प्रकार का एक पाई था, तो क्या करना चाहिए , लेकिन 0अब हैं। इसलिए मैंने अपने पक्ष में इसकी व्याख्या की है।

नमूना उत्पादन:

> buy 10 apple
10
> sell 1 blueberry
-1
> buy 1 keylime
1
> sell 3 apple
7
> buy 5 blueberry
4
> list
| keylime   | 1 |
| apple     | 7 |
| blueberry | 4 |
> sell 1 keylime
0
> count keylime
0

क्षमा करें, लेकिन इस एक में > count potatoपैदा करता है That's not a valid command.के बजायThere is no potato pie!
दरवाज़े

@Doorknob क्या आप इसे IDLE में चला रहे हैं?

हाँ। मैं एक फ़ाइल में कोशिश करता हूँ
दरवाज़े

वास्तव में, गिनती बिल्कुल काम नहीं कर रही है । वास्तव में यह कभी-कभी काम करता है लेकिन कभी-कभी ऐसा नहीं होता है। यह बहुत अजीब है ...
दरवाज़े

3
हेहे, मुझे पता था कि यह किसी तरह के नामकरण संघर्ष था: पी +1 ओह और भी, अपने कार्यक्रम के लिए मेरी फाइल एक मनोरंजक नाम था: pie.py: पी
दरवाज़े

3

सी # - 571 568 559

हमेशा की तरह verbose C # के साथ पीछे की ओर लाना।

using C=System.Console;class Z{static void Main(){var P=new 
System.Collections.Generic.Dictionary<string,int>();int i=0,n;a:C.Write
("> ");var I=C.ReadLine().Split(' ');var c=I[0];object s=c=="exit"?
"The pie store has closed!":"That's not a valid command.";if(c==
"count")try{s=P[c=I[1]];}catch{s="There is no "+c+" pie!";}if(c==
"buy"||c=="sell"){n=int.Parse(I[1]);n=c=="sell"?-n:n;try{n+=P[c=
I[2]];}catch{}s=P[c]=n;i=(n=c.Length)>i?n:i;}if(c=="list")foreach(
var p in P.Keys)C.Write("| {0,"+-i+"} | {1,11} |\n",p,P[p]);else C.
WriteLine(s);if(c!="exit")goto a;}}

यहाँ छवि विवरण दर्ज करें

मैंने सूची उत्पादन के बारे में नियम के साथ कुछ स्वतंत्रता ली। कुछ वर्णों को सहेजने के लिए मैंने गणना कॉलम की चौड़ाई को पूर्णांक मान की अधिकतम चौड़ाई तक हार्डकोड किया। (नियम कहते हैं कि अतिरिक्त स्थान की अनुमति नहीं थी।)

प्रारूपित:

using C = System.Console;
class Z
{
    static void Main()
    {
        var P = new System.Collections.Generic.Dictionary<string, int>();
        int i = 0, n;
    a:
        C.Write("> ");
        var I = C.ReadLine().Split(' ');
        var c = I[0];
        object s = c == "exit" ? "The pie store has closed!" 
                               : "That's not a valid command.";

        // allow Dictionary to throw exceptions; cheaper than using ContainsKey()
        if (c == "count")
            try { s = P[c = I[1]]; }
            catch { s = "There is no " + c + " pie!"; }

        if (c == "buy" || c == "sell")
        {
            n = int.Parse(I[1]);
            n = c == "sell" ? -n : n;

            try { n += P[c = I[2]]; }
            catch { }

            s = P[c] = n;
            i = (n = c.Length) > i ? n : i;
        }

        if (c == "list")
            foreach (var p in P.Keys) 
                C.Write("| {0," + -i + "} | {1,11} |\n", p, P[p]);
        else
            C.WriteLine(s);

        if (c != "exit") goto a; // goto is cheaper than a loop
    }
}

1
+1, मैं हैरान हूँ कि आप भाषा वर्बोज़ इस तरह के एक साथ इस तरह के एक कम वर्ण को प्राप्त कर सकते हैं: डी
दरवाज़े

जावा के साथ मेरा लक्ष्य केवल सी # कार्यान्वयन को हरा देना है। Haha। इस एक के साथ अच्छा काम।
एस्टरी

2

पायथन 3, 310

p={}
c=G=p.get
while c:
 l=("exit list buy count sell "+input("> ")).split();c=l.index(l[5]);*_,n=l
 if~-c%2*c:p[n]=(3-c)*int(l[6])+G(n,0)
 print(["The pie store has closed!","\n".join("| %*s | %9s |"%(max(map(len,p)),k,p[k])for k in p),G(n),G(n,"There is no %s pie!"%n),G(n),"That's not a valid command."][c])

1

जावा - 772 751 739 713 666 619

मुझे पता है कि यह प्रतियोगिता नहीं जीत रहा है, लेकिन सिर्फ मनोरंजन के लिए!

import java.util.*;class a{static<T>void p(T p){System.out.print(p);}public static
 void main(String[]s){z:for(Map<String,Long>m=new HashMap();;){p("> ");s=new
 Scanner(System.in).nextLine().split(" ");switch(s[0]){case"list":for(Map.Entry 
e:m.entrySet())System.out.printf("|%12s|%6s|\n",e.getKey(),e.getValue());break;
case"count":p(m.get(s[1])!=null?m.get(s[1]):"There is no "+s[1]+" pie!\n");break;
case"buy":case"sell":long r=(s[0].length()==3?1:-1)*new Long(s[1])+(m.get(s[2])!=null?
m.get(s[2]):0);p(r+"\n");m.put(s[2],r);break;case"exit":p("The pie store has
 closed!");break z;default:p("That's not a valid command.\n");}}}}

पंक्ति विराम और टैब के साथ:

import java.util.*;

class a{

    static<T>void p(T p){
        System.out.print(p);
    }

    public static void main(String[]s){
        z:for(Map<String,Long>m=new HashMap();;){
            p("\n> ");
            s=new Scanner(System.in).nextLine().split(" ");
            switch(s[0]){
            case"list":
                for(Map.Entry e:m.entrySet())
                    System.out.printf("|%12s|%6s|\n",e.getKey(),e.getValue());
                break;
            case"count":
                p(m.get(s[1])!=null?m.get(s[1]):"There is no "+s[1]+" pie!");
                break;
            case"buy":
            case"sell":
                long r=(s[0].length()==3?1:-1)*new Long(s[1])+(m.get(s[2])!=null?m.get(s[2]):0);
                p(r);
                m.put(s[2],r);
                break;
            case"exit":
                p("The pie store has closed!");
                break z;
            default:
                p("That's not a valid command.");
            }
        }
    }

}

1
गैर-पारंपरिक गोल्फिंग भाषा के लिए +1 :)। C # के साथ मैंने पाया कि स्विच स्टेटमेंट सिंपल से ज्यादा महंगा है अगर {} कंस्ट्रक्शंस। यह जावा के लिए भी सही होना चाहिए।
Igby Largeman

@IgbyLargeman हाँ, मैं if/elseकम खर्चीला होने की कोशिश करता रहा , लेकिन इस तथ्य के कारण कि मुझे s[0]=s[0].intern()तुलना करने के लिए ऐसा करना होगा ==, यह हमेशा अधिक होता है । मुझे मालूम है, बहुत उल्टा।
एस्टी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.