Starbucks - İngilizce


12

Starbucks'ın bu yeni çıkıntılı etiket yazıcıları ve kablosuz tahrikli kulaklık avuç içi tarayıcısı dealies'lerinden önceki klasik günlerinde, 2000-ish'ın ilk günlerinde Starbucks, katı bir sözdizimi ve eşlik eden kodlanmış forma sahip içecekleri tanımlamak için özlü bir sisteme sahipti.

Fincan üzerinde dikey olarak belirli değerler içerebilen bir dizi etiketli kutu vardır .:

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

Ancak daha kolay manipülasyon için yatay bir form kullanacağız. Bunlar, herhangi bir uygun form olabilen girişin 6 alanının adıdır. Buradaki örnekler basit CSV'dir. Özel alanı ve Şurup alanlarının her biri birkaç değerin birleşimi olabilir. Herhangi bir alt subayiter kullanabilirsiniz. Buradaki örnekler boşluk kullanır. Şut alanı aynı zamanda (olası) bir sayı birleştirme ve fincan boyutunun bir göstergesidir (fiziksel kapta örtük olan ancak doğal olarak kodlamada bu yere sığar).

Kafeinsiz alan değerleri böyle kelimelere çevrilir

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

Mantıksal olarak, kesirli değerlere sadece atış sayısı payda tarafından bölünebiliyorsa izin verilir; ancak bu sorun için bu hatayı tespit etmek veya teşhis etmek gerekli değildir.

Çekimler alanı sayısal bileşenine (varsa) ve boyut tanımlayıcısına bölünmelidir. Sayı latin tuple şeklinde görüntülenmelidir: tek, çift, üçlü, dörtlü, beşli, 5'in ötesinde sadece sayıyı ve "-tuple" sonekini yazdırın. 7-tuple,16-tuple . Boyut tanımları:

S  short
T  tall
G  grande
V  venti

Örneğin.

2T  double tall
3G  triple grande

Şurup alanı birkaç isteğe bağlı sayı / harf kodu belirtecinden birini veya daha fazlasını içerebilir. Bir şurubun maksimum sayısı 20'dir. Bu bile çok fazla. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Örneğin.

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

Süt alanı aşağıdakilerden birini içerebilir .

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

Özel alanı, isteğe bağlı xveya -işareti olan birkaç değiştiriciden birini veya daha fazlasını içerebilir .

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

İçecek alanı bir içecek kimliği içerir.

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

Boyut tanımı ve içecek kimliği dışında herhangi bir alan boş olabilir.

Örnekler.

,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

"Köpük yok ... kapuçino *" gibi hatalı veya mantıksız karışımları teşhis etmeye gerek yoktur.

Ek Komplikasyon

Yalnızca kelimesi olan içecekler için espresso, numara singleile değiştirilmeli solove doubledeğiştirilmelidir doppio. Ve boyut belirtilmemiş ve atlanmış olabilir. Ayrıca, sadece çıplak espressoiçecek için , eğer diğer tek şartname bu özel olarak değiştirilen iki çekim sayısından biriyse, kelimenin espressokendisi atlanmalıdır.

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

'Bir fincan okuma' ile ilgili ek gözlemler

Bu bölüm, bu meydan okuma için bir gereklilik değildir, ancak bu tür sözlü sistemin diğer alanlarda uygulanmasında yararlı bir ayrıntılandırma olabilir.

En başta sözdiziminden bahsettim ve şemayı gelen kelime akışlarına uygulayarak, siparişleri birkaç sipariş alan kişi tarafından barista içeceklerine sözlü olarak iletilebilir. Kaba çerçeve SIZE .... DRINK, aynı anda konuşulan birkaç emir arasında sınırlama sağlar. Bu nedenle, tüm iç özellikleri sıfat olarak ifade etme eğilimi vardır, bu nedenle düzen de geçerli bir İngilizce isim-ifade yapısına sahiptir. Yani whipsık sık konuşulan with whipveya whippedve foamsık sık konuşulan foamyveya with foam.

Bu nedenle, bazı eski zaman baristaları için , siparişi uygun formatta tekrarladığında (sizi , bazen ... ) "düzeltmezler" . Sadece tüm ayrıntıları tam olarak hatırlamak amacıyla bilgileri organize ediyorlar. Bilgiyi şema haline getirerek, tüm içecek siparişi sihirli sayı 7 artı veya eksi 2'yi uygulamak amacıyla tek bir birim haline gelir . Bu yüzden bu beceriye sahip bir barista, diğer dikkat dağıtıcıların çok fazla kafa odası tüketmemesi koşuluyla , başlarında 5-9 emir tutabilir . :)


5
Bunlara kahve yerine içecek olarak bahsettiğinize sevindim.
Neil

Ne demek yeni kafalı. Mobil cihazdan sipariş vermiyorsam, gördüğüm tüm Starbucks baristaları hala siyah bir marker ile yazıyorlar.
Joe Z.

@JoeZ. Sadece eski yolun sadeliğinin sürekli olarak aşındığına dair hayal kırıklığım var. Baristaların kendileri, düzeni sisteme girmek için üçüncü bir forma çevirmek zorundadır. Ve bir araba ile bir mağaza için, sipariş etiket üzerinde dördüncü bir formda yazdırılır. Heads-up kuyruğundaki liste beşinci farklı bir formata (tüm şurup numaralarını atlayarak).
luser droog

1
s / hayal kırıklığı / ağıt /
luser droog

Yanıtlar:


3

Retina 0.8.2 , 640 bayt

Girdiyi beklenen çıktıya dönüştürmek için bir dizi yerine koyma gerçekleştirir.

-
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

Çevrimiçi deneyin!

Çoğu oldukça basit değişimlerdir. Birkaç ilginç bölüm:

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

"Espresso" kelimesini içeren içeceklerin özel durumlarını işler. Bu sayıları latin tuple formuna dönüştürdüğümüz aşamaya gelmeden önce 1 ve 2'yi "solo" ve "doppio" ya dönüştürür.

Z,,,,E$
Z

Diğer tek değiştirici "solo" veya "doppio" ise "espresso" kelimesini kaldırır.

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

Dizenin sonuna ve arasına yalnızca bir virgül koyarak Rbirine ekler M. Bu Rdaha sonra tüm s "çiseleme" dönüştürmek sağlar .

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

Önceden 4,6,7 ve 9'u değiştirdiğimizden, 14,16,17 ve 19'u aynı anda kelime formlarına dönüştürmemizi sağlar.


6

Javascript ES6, 902 900 bayt

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

Örnek çalıştırmalar:

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

Şunu deneyin: (R=...)("=-.no.!...(R satır içi tanımlayın ve sonucu işlev olarak kullanın)
Conor O'Brien

4

Python, 824 815 807 805 bayt

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

Biraz daha okunabilir:

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 adresinde demo


3

Yakut -plaF, , 975870 bayt

Bu soruya neredeyse dört yaşında olan eski cevabım hakkında rastgele bir oylama aldım ve ne kadar korkunç gittiğine dair yorumlarım nedeniyle (daha önce ne yazdığımı görmek istiyorsanız yazı geçmişini kontrol edebilirsiniz) daha iyi yapmak için ilham verdi (aka: sıfırdan tekrar yaz) ve yüz baytın üzerinde golf oynamayı başardı. Hala Python cevabından daha uzun, ama şimdi işler nasıl ortaya çıktığından çok daha mutluyum.

Virgül yapısının belirli bölümlerini etkilemek için normal ifade desenlerini çalıştırmaya çalışmaktan, -aF, virgülde bir satır girişini otomatik olarak bölmek ve kaydetmek başlayarak ve $Fbazı öğeleri tekrar birleştirmeden önce değiştirmeme izin vererek son olarak çıktı değişkenini son birkaç ile değiştirmek sub/gsub komutları.

Dürüst olmak gerekirse, burada yapılan normal ifade değiştirme sayısı, bunun çoğu Retina programı olabilir, ancak Retina'yı bunun için yeterince iyi bilmiyorum.

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

Çevrimiçi deneyin!


Durum değişirse kabulü güncelleyeceğim!
luser droog

1
Olabilir? Diğer iki cevap gibi bilgi sıkıştırmada pek iyi değilim; belki bu çok naif bir çözüm olduğu için başkası Python'u yenecek biri olacaktır
Value Ink
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.