Starbucks sang tiếng Anh


10

Trong những ngày kinh điển của Starbucks trước những máy in nhãn dán mới và các thỏa thuận quét tai nghe không dây truyền thống không dây, vào những ngày đầu của năm 2000, Starbucks đã có một hệ thống ngắn gọn để mô tả đồ uống với cú pháp nghiêm ngặt và hình thức được mã hóa đi kèm.

Theo chiều dọc trên cốc có một loạt các hộp được dán nhãn có thể chứa các giá trị nhất định:

Decaf
[   ]     -blank-  X  1/2  1/3  2/3
Shots
[   ]     -blank-  0 1 2 3 ... 20    followed by    S T G V
Syrup
[   ]     -blank-  V M C H
Milk
[   ]     -blank-  Wh % N B
Custom
[    ]    -blank- ((-|x)?(F|WC|M|CR) )+
Drink
[   ]     E EM ECP A L C CM

Nhưng chúng tôi sẽ sử dụng một hình thức ngang để thao tác dễ dàng hơn. Đây là tên của 6 trường của đầu vào có thể là bất kỳ dạng thuận tiện nào. Ví dụ ở đây là CSV đơn giản. Mỗi trường Tùy chỉnh và trường Syrup có thể là một kết hợp của một số giá trị. Bạn có thể sử dụng bất kỳ sơ đồ thuận tiện. Ví dụ ở đây sử dụng không gian. Trường Shots cũng là sự kết hợp của một số (có thể) và chỉ định kích thước cốc (được ẩn trong cốc vật lý nhưng tự nhiên phù hợp ở vị trí này trong mã hóa).

Các giá trị trường Decaf được dịch thành các từ như thế này

-blank-   -nothing-
X         "decaf"
1/2       "half-caf"
1/3       "one-third-caf"
2/3       "two-thirds-caf"

Về mặt logic, các giá trị phân số chỉ được phép khi số lượng ảnh chia hết cho mẫu số; nhưng đối với thử thách này, không cần thiết phải phát hiện hoặc chẩn đoán lỗi này.

Trường Shots nên được chia thành thành phần số (nếu có) và định danh kích thước. Số phải được hiển thị ở dạng tuple Latin: đơn, đôi, ba, bốn, bốn, ngoài 5 chỉ cần in số và hậu tố "-tuple" tức là. 7-tuple,16-tuple . Các chỉ định kích thước là:

S  short
T  tall
G  grande
V  venti

Ví dụ.

2T  double tall
3G  triple grande

Trường Syrup có thể chứa một hoặc nhiều mã thông báo mã số / mã tùy chọn. Số lượng tối đa của một xi-rô là 20. Thậm chí đó là quá nhiều. CƯỜI LỚN.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Ví dụ.

2V 2C     two vanilla two caramel
H         hazelnut
M H 1V    mocha hazelnut one vanilla

Trường Sữa có thể chứa một trong những điều sau đây.

Wh  whole-milk
%   two-percent
N   skim
B   breve

Trường tùy chỉnh có thể chứa một hoặc nhiều bộ sửa đổi với tùy chọn xhoặc -dấu hiệu.

x  extra     F   foam
-  no        WC  whip
             M   mocha drizzle
             CR  caramel drizzle

Lĩnh vực đồ uống có chứa một id đồ uống.

E    espresso
EM   espresso macchiato
ECP  espresso con panna
A    americano
L    latte
C    cappuccino
CM   caramel macchiato

Bất kỳ trường nào cũng có thể để trống ngoại trừ chỉ định kích thước và id đồ uống.

Ví dụ.

,3G,V,Wh,,L    =>   triple grande vanilla whole-milk latte
X,2T,,N,,L     =>   decaf double tall skim latte
1/2,V,,,,CM    =>   half-caf venti caramel macchiato
2/3,3V,3V,B,WC,L  => two-thirds-caf triple venti three vanilla breve whip latte
,G,,,xCR,CM    =>   grande extra caramel drizzle caramel macchiato
X,4T,2M 2C,B,xWC -F xM,C  =>
  decaf quadruple tall two mocha two caramel breve extra whip no foam extra mocha drizzle cappuccino

Không cần phải chẩn đoán những pha chế sai lầm hoặc phi logic như "không có bọt ... cappuccino *.

Biến chứng bổ sung

Chỉ đối với đồ uống có chữ espresso, số singlenên được thay thế bằng solodoublenên được thay thế bằng doppio. Và kích thước có thể không xác định và bỏ qua. Ngoài ra, chỉ đối với espressobản thân đồ uống trần , nếu chỉ có một đặc điểm kỹ thuật khác là một trong hai số lần chụp thay thế đặc biệt này, thì espressobản thân từ đó sẽ bị bỏ qua.

,2,1V,B,,EM   =>  doppio one vanilla breve espresso macchiato
,1,,,,E       =>  solo
,2,,,,E       =>  doppio
,3,,,,E       =>  triple espresso

Quan sát bổ sung về 'đọc một cốc'

Phần này không phải là một yêu cầu cho thách thức này nhưng có thể là một sàng lọc hữu ích trong việc áp dụng loại hệ thống bằng lời nói này trong các lĩnh vực khác.

Tôi đã đề cập cú pháp ngay từ đầu, và bằng cách áp dụng lược đồ cho các luồng từ đến, các đơn đặt hàng có thể được truyền bằng lời nói bởi một số người nhận đặt hàng đến barista làm đồ uống. Khung thô SIZE .... DRINKcung cấp ranh giới giữa một số đơn đặt hàng được nói cùng một lúc. Do đó, có xu hướng biến tất cả các thuộc tính bên trong thành cụm tính từ để thứ tự cũng có cấu trúc cụm danh từ tiếng Anh hợp lệ. Vì vậy, whipthường được nói with whiphoặc whippedfoamthường được nói foamyhoặc with foam.

Do đó, đối với một số baristas thời xưa , họ không "sửa lỗi cho bạn" khi họ lặp lại thứ tự theo định dạng phù hợp ( đôi khi, ... đôi khi ). Họ chỉ đơn giản là tổ chức thông tin cho mục đích ghi nhớ tất cả các chi tiết chính xác. Bằng cách lập sơ đồ thông tin, toàn bộ đơn hàng đồ uống trở thành một đơn vị duy nhất cho mục đích áp dụng phép thuật số 7 cộng hoặc trừ 2 . Vì vậy, một barista với kỹ năng này có thể giữ 5-9 đơn hàng trong đầu với điều kiện những phiền nhiễu khác không tiêu tốn quá nhiều phòng đầu. :)


4
Tôi rất vui vì bạn gọi chúng là đồ uống, hơn là cà phê.
Neil

Bạn có ý nghĩa gì mới lạ. Trừ khi tôi đặt hàng từ điện thoại di động, tất cả các baristas Starbucks tôi từng thấy vẫn viết nó xuống bằng một điểm đánh dấu màu đen.
Joe Z.

@JoeZ. Chỉ là sự thất vọng của tôi rằng sự đơn giản của cách cũ liên tục bị xói mòn. Các baristas phải dịch sang dạng thứ ba theo cách nhập lệnh vào hệ thống. Và đối với một cửa hàng có ổ đĩa, đơn đặt hàng được in ở dạng thứ tư trên nhãn dán. Trong khi danh sách trên hàng đợi có một định dạng riêng biệt thứ năm (bỏ qua tất cả các số xi-rô).
kẻ lừa đảo người lái xe

1
s / sự thất vọng / than thở /
kẻ lừa đảo người đưa tin

Câu trả lời:


3

Python, 824 815 807 805 byte

f=lambda s,a=0:a==0and" ".join(" ".join(f(" "+s.split(",")[i],(["X,deC,1/2,half-C,1/3,oneT-C,2/3,twoTs-C,C,caf,T,-third","".join(" %i"%i+f(",%i-tupL,"%i,["1","x","2","y"])for i in range(6,21))+"1,solo,2,doppio,"*('E'in s)+"1,singL,2,doubL, 3,tripL, 4,quadrupL, 5,quintupL,x,1,y,2,S,short,T,tall,G,grande,V,Vnti","V, vanilla,H, hazelnut,10,ten,11,eleVn,12,twelV,13,thirT,14,4T,15,fifT,16,6T,17,7T,18,8een,19,9T,20,twenty,1,one,2,two,3,three,4,four,5,fiV,6,six,7,seVn,8,eight,9,nine,T,teen","Wh,whole-milk,%,two-percent,N,skim,B,breV","x,extra ,-,no ,F,foam,WC,whip,M,MR,R, drizzL","CM,xM,E,espresso,M, macchiato,CP, con panna,A,americano,L,latte,C,cappuccino,x,C"][i]+",C, caramel,M, mocha,L,le ,V,ve").split(","))for i in range(6-(s in",1,,,,E,2,,,,E"))).split())or a and f(s.replace(a[0],a[1]),a[2:])or s

Hơi dễ đọc hơn:

def f(s,a=0):
 if a==0:
  a=["X,deC,1/2,half-C,1/3,oneT-C,2/3,twoTs-C,C,caf,T,-third"]
  a+=["".join(" %i"%i+f(",%i-tupL,"%i,["1","x","2","y"])for i in range(6,21))+"1,solo,2,doppio,"*('E'in s)+"1,singL,2,doubL, 3,tripL, 4,quadrupL, 5,quintupL,x,1,y,2,S,short,T,tall,G,grande,V,Vnti"]
  a+=["V, vanilla,H, hazelnut,10,ten,11,eleVn,12,twelV,13,thirT,14,4T,15,fifT,16,6T,17,7T,18,8een,19,9T,20,twenty,1,one,2,two,3,three,4,four,5,fiV,6,six,7,seVn,8,eight,9,nine,T,teen"]
  a+=["Wh,whole-milk,%,two-percent,N,skim,B,breV"]
  a+=["x,extra ,-,no ,F,foam,WC,whip,M,MR,R, drizzL"]
  a+=["CM,xM,E,espresso,M, macchiato,CP, con panna,A,americano,L,latte,C,cappuccino,x,C"]
  return" ".join(" ".join(f(" "+s.split(",")[i],(a[i]+",C, caramel,M, mocha,L,le ,V,ve").split(","))for i in range(6-(s in",1,,,,E,2,,,,E"))).split())
 elif a:
  return f(s.replace(a[0],a[1]),a[2:])
 else:
  return s

Bản trình diễn tại https://repl.it/C8Hz/3


6

Javascript ES6, 902 900 byte

s=>(R=(l,r)=>(l.split`.`.map((e,i,l)=>!(i%2)&&(r=r.split(e).join(l[i+1]+" "))),r),R("-.no.!.-tuple.1/2.half-caf.1/3.one-third-caf.2/3.two-thirds-caf.ECP.Econ panna.CM.RY.CR.RZ.EM.EY.WC.whip.Wh.whole-milk.A.americano.B.breve.C.cappuccino.D.extra.E.espresso.F.foam.G.grande.H.hazelnut.I.venti.L.latte.M.OZ.N.skim.O.mocha.R.caramel.S.short.T.tall.V.vanilla.X.decaf.Y.macchiato.Z.drizzle.%.two-percent",R(",1,,,,E.solo.,2,,,,E.doppio",s).split`,`.map((e,i)=>(`1VI.2MO.2CR.4xD`.split`.`.map(k=>k[0]==i&&(e=e.split(k[1]).join(k[2]))),i==1?(e=R("1!.single.2!.double.3!.triple.4!.quadruple.5!.quintuple",e.replace(/(\d+)/,"$1!"))):i==2?(e=R("10.ten.20.twenty.11.eleven.12.twelve.13.thir0.14.four0.15.fif0.16.six0.17.seven0.18.eigh0.19.nine0.0.teen.1.one.2.two.3.three.4.four.5.five.6.six.7.seven.8.eight.9.nine",e)):s.includes`E`&&(e=R("single.solo.double.doppio",e)),e)).join` `).replace(/\s+/g," ").trim())

"Ungolfed":

s=>(
  R=(l,r)=>(l.split`.`.map((e,i,l)=>!(i%2)&&(r=r.split(e).join(l[i+1]+" "))),r),                                   // consecutive string replacement function
  R("-.no.!.-tuple.1/2.half-caf.1/3.one-third-caf.2/3.two-thirds-caf.ECP.Econ panna.CM.RY.CR.RZ.EM.EY.WC.whip.     // replace all symbols with appropriate values
     Wh.whole-milk.A.americano.B.breve.C.cappuccino.D.extra.E.espresso.F.foam.G.grande.H.hazelnut.I.venti.L.latte.
     M.OZ.N.skim.O.mocha.R.caramel.S.short.T.tall.V.vanilla.X.decaf.Y.macchiato.Z.drizzle.%.two-percent",
    R(",1,,,,E.solo.,2,,,,E.doppio",s)                                                                             // if special espresso cases, directly replace entire string
    .split`,`.map((e,i)=>(                                                                                         // split input at commas
      `1VI.2MO.2CR.4xD`.split`.`.map(k=>k[0]==i&&(e=e.split(k[1]).join(k[2]))),                                    // substitute duplicate symbols with unique symbols
      i==1?(e=R("1!.single.2!.double.3!.triple.4!.quadruple.5!.quintuple",e.replace(/(\d+)/,"$1!"))):              // if in shots section, expand all numbers
      i==2?(e=R("10.ten.20.twenty.11.eleven.12.twelve.13.thir0.14.four0.15.fif0.16.six0.17.seven0.18.eigh0.        // if in syrup section, expand all numbers
                  19.nine0.0.teen.1.one.2.two.3.three.4.four.5.five.6.six.7.seven.8.eight.9.nine",e)):
      s.includes`E`&&(e=R("single.solo.double.doppio",e)),                                                         // replace single,double with solo,doppio if espresso is in the string
    e)).join` `).replace(/\s+/g," ").trim())                                                                       // join sections, cleanup whitespaces

Ví dụ chạy:

f(",3G,V,Wh,,L")              -> triple grande vanilla whole-milk latte
f("X,2T,,N,,L")               -> decaf double tall skim latte
f("1/2,V,,,,CM")              -> half-caf venti caramel macchiato
f("2/3,3V,3V,B,WC,L")         -> two-thirds-caf triple venti three vanilla breve whip latte
f(",G,,,xCR,CM")              -> grande extra caramel drizzle caramel macchiato
f("X,4T,2M 2C,B,xWC -F xM,C") -> decaf quadruple tall two mocha two caramel breve extra whip no foam extra mocha drizzle cappuccino
f(",2,1V,B,,EM")              -> doppio one vanilla breve espresso macchiato
f(",1,,,,E")                  -> solo
f(",2,,,,E")                  -> doppio
f(",3,,,,E")                  -> triple espresso

Hãy thử điều này: (R=...)("=-.no.!...(xác định R nội tuyến sau đó sử dụng kết quả làm hàm)
Conor O'Brien

1

Ruby, 957 byte

Có lẽ tôi đã sử dụng sai phương pháp; Tôi có thể vội vàng đưa ra một giải pháp đặc biệt là sau khi tôi phát hiện ra rằng, giữa lúc tìm ra câu trả lời của mình, câu hỏi đã được chấp nhận. Tuy nhiên, cách mà bây giờ nó thậm chí còn tồi tệ hơn Javascript ...

Trên thực tế, rất có thể thay vì đưa ra gợi ý cho câu trả lời của tôi hơn nữa, một lập trình viên Ruby khác nên gửi câu trả lời tốt hơn nhiều

Hãy thử trực tuyến trong khi tôi khóc ở góc

->s{q=->n,c{n.find{|x|x=~/^ ?#{c}/i}||''};e='espresso'
([->c{c>''?(c==?X?'de':c['/2']?'half-':c[?1]?'one-third-':'two-thirds-')+'caf':c},->c{c.sub(/(\d*)(.)?/){i=$1.to_i;(i>0?i<6?%w"0 sing doub trip quadrup quintup"[i]+'le':$1+'-tuple':$1)+($2?' '+q[%w"short tall grande venti",$2]:'')}},->c{c.gsub(/(\d*)(\w)/){i=$1.to_i;n=%w"0 one two three four five six seven eight nine ten eleven twelve thir four fif";n+=n[6..9]<<'twenty';(i>0?n[i]+(i>12&&i<20?'teen ':' '):$1)+q[%w"vanilla caramel mocha hazelnut",$2]}},->c{{?%=>'two-percent','Wh'=>'whole-milk',?N=>'skim',?B=>'breve'}[c]||''},->c{c.gsub(/(x|-)?(\w+)/){({?x=>'extra ',?-=>'no '}[$1]||'')+q[%w"foam whip"+%w"caramel mocha".map{|x|x+' drizzle'},$2[0]]}},->c{c.gsub(/CM|CP|./){{'CP'=>' con pana','CM'=>'caramel'+m=' macchiato'}[$&]||q[%w"americano latte cappuccino"<<m<<e,$&]}}].zip(s.split ?,).map{|a,b|a[b]}-['']).join(' ').sub(/(single|double)(?=.*#{e})/){q[%w"solo doppio",$&[0]]}.sub /o #{e}$/,'o'}

Tôi sẽ cập nhật sự chấp nhận nếu trạng thái thay đổi!
kẻ lừa đảo người lái xe

1
Có lẽ? Tôi chỉ không giỏi nén thông tin như hai câu trả lời khác; có lẽ ai đó sẽ là người đánh bại Python vì đây là một giải pháp rất ngây thơ
Value Ink
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.