পাই দোকান পরিচালনা করুন!


12

সারসংক্ষেপ

কোড গল্ফ ভাল। পাই ভাল । আপনি যখন দুজনকে একসাথে রাখবেন তখন কেবল ভাল জিনিসই ঘটতে পারে।

বিশেষ উল্লেখ

এই চ্যালেঞ্জে আপনি পাই দোকান পরিচালনা করবেন। ব্যবহারকারী পাঁচটি পৃথক কমান্ড ইনপুট সক্ষম হবে: list, count, buy, sell, এবং exit। এখানে প্রত্যেকের জন্য নির্দিষ্টকরণ রয়েছে:

  • list

    • সমস্ত পাইগুলির মালিকানাধীন এবং কতটি একটি তালিকা মুদ্রণ করুন। |উভয় পাশে একটি স্থান দিয়ে আলাদা করুন এবং প্যাড করুন। |গুলি অবশ্যই সারিবদ্ধ হতে হবে। পাই পরিমাণ নেতিবাচক হতে পারে (এর অর্থ আপনি কারও কাছে পাই owণী :()। উদাহরণ স্বরূপ:

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

    • কত {{type}}পাই আছে তা মুদ্রণ করুন । মুদ্রণ " {{type}}পাই নেই!" যদি কিছুই না থাকে। {{type}}সর্বদা রেগেক্সের সাথে মিলবে \w+(অর্থাত্, এটি সর্বদা একক শব্দ হবে)। উদাহরণস্বরূপ, যদি আমার উপরের উদাহরণ তালিকায় প্রদর্শিত পাইগুলির পরিমাণ থাকে তবে then

      > 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}}সংখ্যা না হওয়া ইত্যাদি অন্তর্ভুক্ত includes
  • পাই ভাল।
  • আপনার ইনপুট অবশ্যই আপনার আউটপুট থেকে পৃথক করা উচিত। আপনি যদি কমান্ড লাইন / টার্মিনাল / শেল / অন্যান্য পাঠ্য-ভিত্তিক জিনিসটিতে প্রোগ্রামটি চালাচ্ছেন তবে আপনাকে অবশ্যই " > ​"(" একটি "এর চেয়ে বড়" চিহ্ন এবং একটি স্থান) বা অন্য কোনও শেল ইনপুট উপসর্গের সাথে ইনপুট উপসর্গ করতে হবে।
  • পাই ভাল।
  • এই সমস্ত ব্যাখ্যা যদি যথেষ্ট পরিমাণে ভাল না হয় তবে এখানে কিছু নমুনা আউটপুট দেওয়া হল:

    > 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
তাহলে শুধু স্পষ্ট করে বলতে পারি ... পাই ভাল?
ইগবি লার্জম্যান

4
শূন্য গণনা করে তালিকায় পাই রাখা কি গ্রহণযোগ্য? ভালো লেগেছে যদি আপনি না buy 1 appleএবং sell 1 apple। এবং এটা তারপর বৈধ হতে হবে count appleফিরতে 0পরিবর্তে There is no apple pie!?
ইগবি লার্জম্যান

@ ইগবিএলার্জম্যান এটিকে ঘৃণা করুন, আমি ভেবেছিলাম আমি সবকিছু পরিষ্কার করে দিয়েছি! : পি অতিরিক্ত পরীক্ষার ক্ষেত্রে নতুন পরীক্ষার কেস যুক্ত করেছে
ডোরকনব

@ ডুরকনব ওহে! আমি সর্বশেষ বিক্রি হওয়ার পরে "কোনও অ্যাপল পাই নেই" আউটপুট দিচ্ছি।
জন ডিভোরাক

@ জনডভোরাক ঠিক আছে, আমি মনে করি যে কোনওভাবেই কাজ করবে। আবার আপডেট হয়েছে
ডুরকনব

উত্তর:


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

আক্ষরিক অর্থে এখানে ফর্ম্যাটর ব্যবহার করার জন্য ডুরকনব ধারণাটি আরও একধাপ এগিয়ে নিয়ে গেছে। প্রথমত, সমস্ত কী এবং মানগুলির মধ্যে হ্যাশের দীর্ঘতম স্ট্রিং এর " %%%ds |"মতো স্ট্রিং তৈরি করে বিন্যাস করা হয় " %6s |"। হ্যাঁ, প্রতিটি কলাম আলাদাভাবে সঙ্কুচিত হয় না। প্রয়োজন ছিল না। এক আকার সব ফিট করে। তারপরে এই স্ট্রিংটি সদৃশ এবং বর্তমান সারিযুক্ত দ্বি-উপাদান অ্যারের জন্য বিন্যাসকরণ স্ট্রিং হিসাবে ব্যবহৃত হয়। শেষ +অবধি, শুরুটির কাছাকাছিটি তার শব্দটি পেয়েছে এবং একটি একক শীর্ষস্থানীয় পাইপ প্রস্তুত করে। ওহ, এবং putsঅ্যারেগুলির একটি দুর্দান্ত পরিচালনা রয়েছে।

রেজেক্স লিটারালগুলিতে রুবির ইন্টারপোলেশন রয়েছে। এটি একটি শক্ত সংরক্ষণ, তবে এটি কিছুটা সাশ্রয় করে।

রুবি whenঅভিব্যক্তির পরে সেমিকোলন প্রয়োজন , তবে কীওয়ার্ডের আগে নয়। সেমিকোলনটি যখন একটি নতুন লাইনের সাথে প্রতিস্থাপন করা হয় তখন এটি একটি অদ্ভুত রেন্ডারিং আর্টিফ্যাক্টের দিকে নিয়ে যায়।

এবং, অবশ্যই, যাদুর গ্লোবাল এবং তাদের বিরুদ্ধে রেগেক্স লিটারালগুলির স্বয়ংক্রিয় ম্যাচিং হিসাবে পরিচিত পারলিজম।

এছাড়াও, বেশিরভাগ বিবৃতি সহ caseএক্সপ্রেশন।


খুব চালাক কৌশল! +1 টি
Doorknob

হুম, তবে Hash.new(0)বদলে কেন {}?
Doorknob

1
@ ডুরকনব রুবির হ্যাশগুলির ডিফল্ট মান থাকতে পারে (যদি আপনি কোনও বস্তুটি পাস করেন) বা এমনকি জেনারেটরও (যদি আপনি কোনও ব্লক (কী, হ্যাশ -> মান) পাস করেন তবে আপনি যদি পাস না করেন তবে ডিফল্ট মান হয় 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]একবারের পরিবর্তে দু'বার মূল্যায়ন করা বাদে ) এবং এর চেয়েও দীর্ঘস্থায়ী। পরেরটি ব্যবহার করুন।
জন ডিভোরাক

@ জানডভোরাক ওহ, সমস্ত টিপসের জন্য ধন্যবাদ: ডিআই ভাবেন যে রুবির +=অপারেটর নেই; এজন্য আমি এটি ব্যবহার করিনি। হয়তো যে শুধু জন্য ++। আমি শীঘ্রই আমার পোস্টটি সম্পাদনা করব
ডুরকনব

3

পাইথন পাই- থোন 437

আমি নিশ্চিত যে দ্বিতীয় শেষ লাইনে কিছুটা ckিল আছে, তবে পাই টাইপ এবং সংখ্যা উভয়ের জন্য বারগুলি সারিবদ্ধ করার প্রয়োজনীয়তা হতাশ।

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

প্রতি Igby Largeman এর মন্তব্য বিধি কি যদি সেখানে কি কাছাকাছি অস্পষ্ট ছিল কোনও নির্দিষ্ট ধরণের একটি পাই, কিন্তু আছে 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 potatoThat's not a valid command.There is no potato pie!
এটির

@ ডুরকনব আপনি কি এটি আইডিএল চালাচ্ছেন?

হ্যাঁ. আমি একটি ফাইল চেষ্টা করব
ডুরকনব

আসলে, গণনা মোটেও কাজ করছে বলে মনে হচ্ছে না । আসলে এটি কখনও কখনও কাজ করে তবে কখনও কখনও তা হয় না। এটি খুব অদ্ভুত ...
ডুরকনব

3
হেই, আমি জানতাম এটি কোনওরকমের নামকরণের সংঘর্ষ: পি +1 ওহ এবং আপনার প্রোগ্রামের জন্য আমার ফাইলটির একটি মজাদার নাম ছিল pie.py: পি
ডোরকনব

3

সি # - 571 568 559

হতাশহীন ভার্বোস সি # দিয়ে যথারীতি পিছনের দিকে নিয়ে আসা।

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, আমি অবাক হয়েছি যে আপনি এই জাতীয়
শব্দভাণ্ডারের

জাভা সহ আমার লক্ষ্য কেবলমাত্র # # বাস্তবায়নকে পরাজিত করা। হা হা। এই এক সঙ্গে দুর্দান্ত কাজ।
asteri


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 :)। সি # এর সাথে আমি দেখতে পেয়েছি যে যদি {r নির্মাণ করে তবে স্যুইচ স্টেটমেন্টটি সাধারণের চেয়ে বেশি ব্যয়বহুল। জাভার ক্ষেত্রেও এটি সত্য হওয়া উচিত।
ইগবি লার্জম্যান

@ ইগবিএলার্জম্যান হ্যাঁ, আমি if/elseকম ব্যয়বহুল হওয়ার চেষ্টা চালিয়েছি , তবে এর s[0]=s[0].intern()সাথে তুলনা করার জন্য আমাকে আরও কিছু করতে হবে, এই কারণে ==এটি সর্বদা আরও বেশি হয়ে যায় । আমি জানি, খুব পাল্টা।
asteri
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.