สตาร์บัคส์เป็นภาษาอังกฤษ


12

ในยุคคลาสสิคของสตาร์บัคส์ก่อนเครื่องพิมพ์สติกเกอร์ที่ถอดเปลี่ยนได้ใหม่และเครื่องสแกนฝ่ามือชุดหูฟังแบบไดรฟ์แบบไร้สายในยุค 2000 ถึง 2,000 สตาร์บัคส์มีระบบที่กระชับสำหรับการอธิบายเครื่องดื่มด้วยไวยากรณ์ที่เข้มงวด

ในแนวตั้งบนถ้วยมีชุดกล่องที่มีฉลากซึ่งอาจมีค่าบางอย่าง:

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

แต่เราจะใช้รูปแบบแนวนอนเพื่อการจัดการที่ง่ายขึ้น เหล่านี้เป็นชื่อของ 6 ฟิลด์ของอินพุตซึ่งอาจเป็นรูปแบบที่สะดวก ตัวอย่างที่นี่เป็น CSV อย่างง่าย เขตข้อมูลที่กำหนดเองและเขตข้อมูลน้ำเชื่อมแต่ละคนอาจเป็นการต่อเชื่อมของค่าหลายค่า คุณสามารถใช้ส่วนย่อยใดก็ได้ที่สะดวก ตัวอย่างที่นี่ใช้พื้นที่ เขตข้อมูลช็อตยังเป็นการต่อกันของหมายเลข (เป็นไปได้) และการกำหนดขนาดของถ้วย (ซึ่งมีความหมายในถ้วยทางกายภาพ

ค่าฟิลด์ Decaf ถูกแปลเป็นคำเช่นนี้

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

ตามหลักเหตุผลค่าเศษส่วนจะอนุญาตได้ก็ต่อเมื่อจำนวนนัดถูกหารด้วยตัวหาร; แต่สำหรับความท้าทายนี้ไม่จำเป็นต้องตรวจสอบหรือวินิจฉัยข้อผิดพลาดนี้

เขตข้อมูลภาพควรแบ่งออกเป็นองค์ประกอบที่เป็นตัวเลข (ถ้ามี) และตัวระบุขนาด หมายเลขควรจะแสดงในรูปแบบ tuple ละติน: เดี่ยวสองสามสามเท่าห้าเท่าเกิน 5 เพียงพิมพ์หมายเลขและคำต่อท้าย "-tuple" คือ 7-tuple,16-tuple . การกำหนดขนาดคือ:

S  short
T  tall
G  grande
V  venti

เช่น.

2T  double tall
3G  triple grande

ฟิลด์น้ำเชื่อมอาจมีโทเค็นทางเลือกหมายเลข / จดหมายหลายตัวเลือกอย่างน้อยหนึ่งรายการ จำนวนน้ำเชื่อมสูงสุดคือ 20 เท่านั่นก็มากเกินไป ฮ่า ๆ.

V  vanilla
C  caramel
M  mocha
H  hazelnut

เช่น.

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

ฟิลด์ Milk อาจมีหนึ่งในสิ่งต่อไปนี้

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

ฟิลด์กำหนดเองอาจมีตัวดัดแปลงอย่างน้อยหนึ่งตัวซึ่งมีxหรือ-ไม่มีก็ได้

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

ฟิลด์เครื่องดื่มมีรหัสเครื่องดื่มหนึ่งรายการ

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

ฟิลด์ใด ๆ อาจว่างเปล่ายกเว้นการกำหนดขนาดและรหัสเครื่องดื่ม

ตัวอย่าง.

,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

ไม่จำเป็นต้องวิเคราะห์การปรุงที่ผิดพลาดหรือไร้เหตุผลเช่น "ไม่มีฟอง ... คาปูชิโน่ *

ภาวะแทรกซ้อนเพิ่มเติม

เพียงเครื่องดื่มที่มีคำว่าespressoจำนวนsingleควรถูกแทนที่ด้วยsoloและควรถูกแทนที่ด้วยdouble doppioและขนาดอาจไม่ได้รับการกำหนดและละเว้น นอกจากนี้สำหรับespressoเครื่องดื่มที่ไม่มีแอลกอฮอล์หากข้อกำหนดอื่น ๆ เท่านั้นเป็นหนึ่งในสองภาพที่เปลี่ยนมาเป็นพิเศษเหล่านี้จำนวนมากดังนั้นคำespressoนั้นควรละเว้น

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

ข้อสังเกตเพิ่มเติมเกี่ยวกับ 'การอ่านถ้วย'

ส่วนนี้ไม่ได้เป็นข้อกำหนดสำหรับความท้าทายนี้ แต่อาจเป็นประโยชน์ในการปรับแต่งระบบการใช้คำพูดแบบนี้ในโดเมนอื่น

ฉันพูดถึงไวยากรณ์ตอนเริ่มต้นและโดยการใช้สคีมากับคำที่เข้ามาคำสั่งสามารถส่งคำสั่งด้วยวาจาโดยผู้ส่งคำสั่งหลายคนไปยังบาริสต้าที่ทำเครื่องดื่ม กรอบคร่าวๆSIZE .... DRINKให้การแบ่งเขตระหว่างคำสั่งซื้อหลายคำพูดในครั้งเดียว ดังนั้นจึงมีแนวโน้มที่จะสร้างคุณลักษณะทั้งหมดภายในเป็นวลีคำคุณศัพท์ดังนั้นคำสั่งซื้อนี้ยังมีโครงสร้างคำนามวลีภาษาอังกฤษที่ถูกต้อง ดังนั้นwhipมักจะพูดwith whipหรือwhippedและfoamมักจะพูดหรือfoamywith foam

ดังนั้นสำหรับบาริสต้าเก่าพวกเขาไม่ได้ "แก้ไขคุณ" เมื่อพวกเขาทำซ้ำคำสั่งในรูปแบบที่เหมาะสม ( ดี ... บางครั้ง ) พวกเขาเพียงแค่จัดระเบียบข้อมูลเพื่อจุดประสงค์ในการจดจำรายละเอียดทั้งหมด โดย schematizing ข้อมูลการสั่งซื้อเครื่องดื่มทั้งหมดจะกลายเป็นหน่วยเดียวเพื่อวัตถุประสงค์ของการใช้จำนวนมายากล 7 บวกหรือลบ 2 ดังนั้นบาริสต้าที่มีทักษะนี้สามารถเก็บคำสั่งได้ 5-9 คำสั่งในหัวของพวกเขาหากสิ่งรบกวนอื่น ๆ ไม่กินพื้นที่ที่มากเกินไป :)


5
ฉันดีใจที่คุณเรียกสิ่งเหล่านี้เป็นเครื่องดื่มมากกว่ากาแฟ
Neil

คุณหมายถึงอะไรใหม่ ๆ บาริสต้า Starbucks ทุกคนที่ฉันเคยเห็นจะยังคงเขียนมันด้วยเครื่องหมายสีดำยกเว้นว่าฉันสั่งจากมือถือ
โจซี

@JoeZ แค่ความหงุดหงิดของฉันที่ความเรียบง่ายแบบเก่า ๆ ถูกกัดเซาะอย่างต่อเนื่อง บาริสต้าต้องแปลเป็นรูปแบบที่สามเพื่อป้อนคำสั่งไปยังระบบ และสำหรับร้านค้าที่มีไดรฟ์ถึงจะมีคำสั่งพิมพ์ในรูปแบบที่สี่บนสติกเกอร์ ในขณะที่รายชื่อในคิวหัวขึ้นมีรูปแบบที่แตกต่างกันที่ห้า (ละเว้นหมายเลขน้ำเชื่อมทั้งหมด)
luser droog

1
s / แห้ว / คร่ำครวญ /
luser droog

คำตอบ:


3

เรติน่า 0.8.2 , 640 ไบต์

ดำเนินการชุดของการแทนที่เพื่อแปลงอินพุตเป็นเอาต์พุตที่คาดไว้

-
no 
x
extra 
Wh
whole-milk
%
2-percent
N
skim
B
breve
X
deJ
1/2
half-J
1/3
1Q-J
2/3
2Qs-J
Q
-third
J
caf 
^,
 ,
 ,1(?=\D.*E)
,soloZ
 ,2(?=\D.*E)
,doppioZ
Z,,,,E$
Z
 ,(\d+)
,$1UleZ
,1U
,sing
,2U
,doub
,3U
,trip
\d+(?!\d*U)
$&Y 
U
-tup
,4-.
,quadr
,5-
,quin
 ,
Z
S
short
T
tall
G
grande
ZV
 venti
M(?=[^,]*,\w*$)
MR
E
espresso
M$
 macchiato
CP
 con panna
A
americano
L
latte
C$
cappuccino
F
foam
WC
whip
R
 drizzle
4Y
fourY
6Y
sixY
7Y
sevenY
9Y
nineY
10Y
ten
11Y
eleven
12Y
twelve
13Y
thirK
15Y
fifK
18Y
eighK
20Y
twenty
1Y
one
2Y
two
3Y
three
5Y
five
8Y
eight
1(\w*)Y
$1K
K
teen
V
vanilla
C
caramel
M
mocha
H
hazelnut
 -
-
Z,*| ?,+
 
^ |Y

ลองออนไลน์!

ส่วนใหญ่เป็นการเปลี่ยนที่ตรงไปตรงมา ส่วนที่น่าสนใจคือ:

 ,1(?=\D.*E)
,soloZ
 ,2(?=\D.*E)
,doppioZ

จัดการกับกรณีพิเศษสำหรับเครื่องดื่มที่มีคำว่า "เอสเพรสโซ" มันแปลง 1 และ 2 เป็น "โซโล" และ "โดปปิโอ" ก่อนที่เราจะไปถึงขั้นตอนที่เราเปลี่ยนตัวเลขเหล่านั้นเป็นรูปแบบละติน tuple

Z,,,,E$
Z

ลบคำว่า "espresso" หาก "solo" หรือ "doppio" เป็นตัวดัดแปลงอื่นเท่านั้น

M(?=[^,]*,\w*$)
MR

ต่อท้ายคำRสั่งใด ๆMโดยคั่นด้วยเครื่องหมายจุลภาคเพียงอันเดียวระหว่างมันและท้ายของสตริง สิ่งนี้ทำให้เราสามารถแปลงRs ทั้งหมดเป็น "ละอองฝน" ในภายหลัง

1(\w*)Y
$1K
K
teen

ช่วยให้เราสามารถแปลง 14,16,17 และ 19 เป็นคำของพวกเขาทั้งหมดในครั้งเดียวเนื่องจากเราแทนที่ 4,6,7 และ 9 ล่วงหน้า


6

Javascript ES6, 902 900 ไบต์

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

ตัวอย่างการทำงาน:

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

ลองสิ่งนี้: (R=...)("=-.no.!...(นิยาม R inline จากนั้นใช้ผลลัพธ์เป็นฟังก์ชัน)
Conor O'Brien

4

Python 824 815 807 805 ไบต์

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

อ่านง่ายขึ้นเล็กน้อย:

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

สาธิตที่https://repl.it/C8Hz/3


3

Ruby -plaF, , 975 870 ไบต์

ฉันได้รับการสุ่มตอบคำถามเก่าของฉันอายุเกือบสี่ปีและเนื่องจากความคิดเห็นของฉันเกี่ยวกับวิธีการที่มันน่ากลัว (คุณสามารถตรวจสอบประวัติโพสต์หากคุณต้องการดูสิ่งที่ฉันเขียนก่อน) แรงบันดาลใจที่จะทำให้ดีขึ้น (aka: เขียนส่วนใหญ่จากพื้นดินขึ้นมาใหม่) และจัดการเล่นกอล์ฟด้วยความเร็วกว่าร้อยไบต์ ยังนานกว่าคำตอบของ Python แต่ฉันก็มีความสุขมากขึ้นกับสิ่งต่าง ๆ ที่เกิดขึ้นในตอนนี้

ประมาณ 20 ไบต์ถูกบันทึกไว้โดยการสลับจากการพยายามเรียกใช้รูปแบบ regex เพื่อส่งผลกระทบต่อส่วนเฉพาะของโครงสร้างจุลภาคเป็นการใช้-aF,แฟล็กเพื่อทำการแบ่งบรรทัดอินพุตในคอมมาโดยอัตโนมัติและบันทึกเป็น$Fอนุญาตให้ฉันแก้ไของค์ประกอบบางอย่างก่อนที่จะรวมเข้าด้วยกัน ในที่สุดก็ปรับเปลี่ยนตัวแปรเอาต์พุตด้วยคำสั่งsub/ gsubคำสั่งล่าสุด

ความจริงแล้วจำนวนการเปลี่ยน regex ที่ทำที่นี่หมายถึงสิ่งนี้ส่วนใหญ่อาจเป็นโปรแกรม Retina แต่ฉันไม่รู้ว่า Retina ดีพอสำหรับสิ่งนั้น

g=->n,c{n.grep(/^ ?#{c}/i)[0]}
n=%w"0 one two three four five six seven eight nine ten eleven twelve thir four fif";n+=n[6,4]<<'twenty'
$F[1].sub!(/(\d*)(\w)?/){i=eval$1;"#{i&&(%w"0 sing doub trip quadrup quintup"[i]||$1+"-tup")+"le"} #{g[%w"short tall grande venti",$2]if$2}"}
$F[2].gsub!(/(\d*)(\w)/){i=eval$1;"#{i&&n[i]}#{'teen'if(13..19)===i} #{g[%w"vanilla caramel mocha hazelnut",$2]}"}
$F[3].sub!(/.+/){%w"skim whole-milk breve two-percent"[$&.sum%26%4]}
$F[4].gsub!(/(x|-)?(\w+)/){"#{%w"extra no"[$1.ord%2]if$1} #{g[%w"caramelD mochaD whip foam",$2[0]].sub ?D,' drizzle'}"}
$_=$F*' '
sub(/^\S+/){%w"de - half- one-third- two-thirds-"[$&.sum%8]+"caf"}
sub'CP',' con pana'
sub'CM','caramel'+m=' macchiato'
e='espresso'
gsub(/[A-Z]/){g[%w"americano latte cappuccino"+[m,e],$&]}
gsub(/ +/,' ')
$_.strip!
sub(/[sd]...le/){g[%w"doppio solo",$&[0]]}if$_[e]
sub'o '+e,?o

ลองออนไลน์!


ฉันจะอัปเดตการยอมรับหากสถานะมีการเปลี่ยนแปลง!
luser droog

1
อาจจะ? ฉันแค่บีบอัดข้อมูลไม่เก่งเหมือนคำตอบอีกสองข้อ บางทีคนอื่นจะเป็นคนที่เอาชนะ Python ได้เพราะนี่เป็นวิธีแก้ปัญหาที่ไร้เดียงสา
Value Ink
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.