Quản lý một cửa hàng bánh!


12

Tóm lược

Mã golf là tốt. Pie là tốt . Khi bạn đặt hai thứ lại với nhau, chỉ những thứ tốt mới có thể xảy ra.

Thông số kỹ thuật

Trong thử thách này, bạn sẽ quản lý một cửa hàng bánh. Người dùng sẽ có thể nhập lăm lệnh khác nhau: list, count, buy, sell, và exit. Dưới đây là các thông số kỹ thuật cho từng:

  • list

    • In một danh sách tất cả các bánh sở hữu, và bao nhiêu. Riêng với |và pad với một không gian ở hai bên. |s phải được căn chỉnh. Số lượng bánh có thể âm (có nghĩa là bạn nợ ai đó :(). Ví dụ:

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

    • In có bao nhiêu {{type}}chiếc bánh. In "Không có {{type}}bánh!" nếu không có {{type}}sẽ luôn khớp với regex \w+(nghĩa là nó sẽ luôn là một từ duy nhất). Ví dụ: nếu tôi có số lượng bánh được hiển thị trong danh sách ví dụ trên, thì

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

    • Thêm {{n}}vào số lượng của {{type}}chiếc bánh, và in nó. Tạo {{type}}chiếc bánh nếu nó không tồn tại. {{n}}sẽ luôn khớp với regex [0-9]+(nghĩa là nó sẽ luôn là một số). Đây là một ví dụ khác (với cùng một kho bánh như các ví dụ trước):

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

    • Trừ đi {{n}}số lượng của {{type}}chiếc bánh, và in nó. Tạo {{type}}chiếc bánh nếu nó không tồn tại. Pie có thể âm tính (ồ không, điều đó có nghĩa là bạn nợ ai đó chiếc bánh!).

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

    • In "Cửa hàng bánh đã đóng cửa!" và thoát khỏi chương trình.

      > exit
      The pie store has closed!
      

Nhiều sự sáng tỏ hơn

  • Nếu một hàm không tồn tại được gọi (từ đầu tiên), sau đó in "Đó không phải là một lệnh hợp lệ."
  • Nếu một hàm hiện có được gọi với các đối số không hợp lệ (các từ sau từ đầu tiên), thì chương trình của bạn hoạt động như thế nào không quan trọng. "Đối số không hợp lệ" bao gồm quá nhiều đối số, quá ít đối số,{{n}} không phải là số, v.v.
  • Pie là tốt.
  • Đầu vào của bạn phải được phân biệt với đầu ra của bạn. Nếu bạn đang chạy chương trình trên dòng lệnh / terminal / shell / thứ dựa trên văn bản khác, bạn phải nhập tiền tố bằng "> ​" (dấu" lớn hơn "và dấu cách) hoặc một số tiền tố đầu vào shell khác.
  • Pie là tốt.
  • Nếu tất cả các giải thích này không đủ tốt, thì đây là một số kết quả đầu ra mẫu:

    > 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!
    
  • Nếu bạn mua / bán bánh và số lượng ròng trở thành 0, bạn có thể giữ nó trong listhoặc không, và bạn có thể trả lại 0hoặc There is no {{type}} pie!khi bạncount nó.

  • Đây là ; mã ngắn nhất thắng.
  • Tôi đã đề cập đến chiếc bánh đó là tốt?

3
Vì vậy, chỉ để làm rõ ... là bánh tốt?
Igby Largeeman

4
Có thể chấp nhận giữ một chiếc bánh trong danh sách với số không? Giống như nếu bạn làm buy 1 applesell 1 apple. Và sau đó nó có hợp lệ count appleđể trở lại 0thay vì There is no apple pie!?
Igby Largeeman

@IgbyLargeman Chết tiệt, tôi nghĩ tôi đã làm rõ mọi thứ! : P Đã thêm trường hợp thử nghiệm mới để làm rõ thêm
Doorknob

@Doorknob này! Tôi xuất ra "không có bánh táo" sau khi chiếc cuối cùng được bán.
John Dvorak

@JanDvorak Được rồi, tôi cho rằng một trong hai cách sẽ làm việc. Cập nhật lại
Doorknob

Câu trả lời:


3

Hồng ngọc 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}

Một số thủ thuật ở đây:

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

Ý tưởng của Doorknob để sử dụng một bộ định dạng được tiến thêm một bước ở đây, theo nghĩa đen. Đầu tiên, chuỗi dài nhất trong hàm băm trong số tất cả các khóa và giá trị được định dạng bằng cách sử dụng " %%%ds |"để tạo ra một chuỗi như thế nào " %6s |". Đúng, không thu nhỏ từng cột riêng biệt. Không bao giờ có yêu cầu. Một kích thước phù hợp với tất cả. Sau đó, chuỗi này được nhân đôi và được sử dụng làm chuỗi định dạng cho mảng hai phần tử có chứa hàng hiện tại. Cuối cùng, +gần bắt đầu có được từ của nó và chuẩn bị một đường ống dẫn duy nhất. Oh, và putscó một xử lý tốt của mảng.

Ruby có nội suy bằng chữ regex. Đó là một tiết kiệm chặt chẽ, nhưng nó tiết kiệm một chút.

Ruby yêu cầu dấu chấm phẩy sau whenbiểu thức, nhưng không phải trước từ khóa. Điều này dẫn đến một tạo tác kỳ lạ khi dấu chấm phẩy được thay thế bằng một dòng mới.

Và, tất nhiên, chủ nghĩa sai lầm được gọi là ma thuật toàn cầu và tự động kết hợp các chữ regex chống lại chúng.

Ngoài ra, hầu hết các báo cáo bao gồm caselà biểu thức.


Thủ đoạn rất thông minh! +1
Doorknob

Hmm, nhưng tại sao Hash.new(0)thay vì {}?
Doorknob

1
@Doorknob Băm của Ruby có thể có các giá trị mặc định (nếu bạn truyền một đối tượng) hoặc thậm chí các trình tạo (nếu bạn vượt qua một khối (khóa, hàm băm -> giá trị). Nếu bạn không vượt qua, giá trị mặc định là nil(không cho phép bổ sung). Nghĩa đen sử dụng nillàm giá trị mặc định.
John Dvorak

Có thể lưu một vài ký tự với h=Hash.new(0)=> h=Hash.new 0, print"> "=> $><<'> 'và tôi nghĩ [*h]chỉ có thể như vậy h. Tôi đã cố gắng kết hợp một phiên bản mà không có câu lệnh chuyển đổi vì tất cả văn bản soạn sẵn đó thực sự cộng lại: gist.github.com/ sync / 6315218 . Tôi đã cố gắng để làm cho một cái gì đó hoạt động với ruby -apnhưng yêu cầu cho lời nhắc làm cho nó khó khăn: <
Paul Prestidge

@ đồng bộ cảm ơn! Không thể tin rằng tôi đã bỏ lỡ cái đầu tiên, và tôi không chắc tại sao tôi nghĩ $><<in một dòng mới. Đối với gợi ý cuối cùng ... thật không may, băm không có phương pháp "làm phẳng".
John Dvorak

3

Ruby, 427 384 ký tự

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}

Cảm ơn Jan Dvorak đã cải thiện rất nhiều từ 427 lên 384 (!)


Bạn có thể sử dụng loop{...}thay vì while 1do...end.
John Dvorak

Bạn có thể sử dụng splitmà không cần đối số của nó. Theo mặc định, nó phân tách theo khoảng trắng (hoặc $;nếu được đặt)
John Dvorak

p.keys.group_by(&:size).max[0]- bạn đang tìm kiếm p.keys.map(&:size).maxhay p.map{|x,_|x.size}.max? Đây: [(t=p.values).max.to_s.size,t.min.to_s.size].maxbạn đang tìm kiếm p.map{|_,x|x.to_s.size}.max? Tôi sẽ lấy ý tưởng của bạn và lạm dụng công cụ định dạng, mặc dù :-)
John Dvorak

p[t]=p[t]+mtương đương với p[t]+=m(ngoại trừ p[t]được đánh giá hai lần thay vì một lần) và lâu hơn. Sử dụng cái sau.
John Dvorak

@JanDvorak Oooh, cảm ơn vì tất cả các mẹo: DI nghĩ rằng Ruby không có +=nhà điều hành; đó là lý do tại sao tôi không sử dụng nó Có lẽ đó chỉ là cho ++. Tôi sẽ chỉnh sửa bài viết của mình trong thời gian ngắn
Doorknob

3

Con trăn Pie- trăn 437

Tôi chắc chắn có một chút chùng trên dòng cuối cùng thứ hai, nhưng yêu cầu căn chỉnh các thanh cho cả loại và số bánh là rất ít.

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

Theo nhận xét của Igby Largeman của các quy tắc không rõ ràng xung quanh phải làm gì nếu có một chiếc bánh của một loại hình cụ thể, nhưng có 0bây giờ. Vì vậy, tôi đã giải thích nó theo ý của tôi.

Đầu ra mẫu:

> 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

Xin lỗi, nhưng trong cái này > count potatosản xuất That's not a valid command.thay vìThere is no potato pie!
Doorknob

@Doorknob Bạn đang chạy nó trong IDLE?

Đúng. Tôi sẽ thử trong một tệp
Doorknob

Trên thực tế, Count dường như không hoạt động . Trên thực tế đôi khi nó hoạt động nhưng đôi khi nó không. Thật kỳ quặc ...
Doorknob

3
Hehe, tôi biết đó là một cuộc đụng độ đặt tên nào đó: P +1 Ồ và cũng vậy, tập tin của tôi cho chương trình của bạn có một cái tên thú vị pie.py:: P
Doorknob

3

C # - 571 568 559

Đưa lên phía sau như thường lệ với C # dài vô vọng.

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

nhập mô tả hình ảnh ở đây

Tôi đã có một số tự do với các quy tắc về đầu ra danh sách. Để lưu một số ký tự, tôi đã mã hóa chiều rộng của cột đếm thành chiều rộng tối đa của một giá trị nguyên. (Các quy tắc không nói thêm không gian không được phép.)

Định dạng:

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, tôi ngạc nhiên khi bạn có thể có số lượng nhân vật thấp như vậy với ngôn ngữ dài dòng như vậy: D
Doorknob

Mục tiêu của tôi với Java chỉ là đánh bại việc thực hiện C #. Haha. Công việc tốt với cái này
asteri

2

Trăn 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

Java - 772 751 739 713 666 619

Tôi biết nó không chiến thắng trong cuộc thi, nhưng chỉ để cho vui thôi!

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");}}}}

Với dấu ngắt dòng và tab:

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 cho ngôn ngữ chơi golf phi truyền thống :). Với C # tôi thấy rằng câu lệnh switch đắt hơn đơn giản nếu {} xây dựng. Điều này cũng đúng với Java.
Igby Largeeman

@IgbyLargeman Vâng, tôi đã cố gắng để có if/elseđược ít tốn kém hơn, nhưng do thực tế là tôi phải làm s[0]=s[0].intern()để so sánh với ==, nó luôn luôn kết thúc nhiều hơn . Tôi biết, rất phản khoa học.
asteri
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.