Starbucks auf Englisch

10

In den klassischen Tagen von Starbucks, bevor diese neuen Sticker-Drucker und kabellosen Headset-Palmtop-Scanner für Headsets angeboten wurden, verfügte Starbucks in den berauschenden Tagen des Jahres 2000 über ein präzises System zur Beschreibung von Getränken mit einer strengen Syntax und der dazugehörigen codierten Form.

Vertikal auf der Tasse befindet sich eine Reihe von beschrifteten Kästchen, die bestimmte Werte enthalten können :.

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

Wir werden jedoch eine horizontale Form verwenden, um die Manipulation zu erleichtern. Dies sind die Namen der 6 Felder der Eingabe, die eine beliebige Form haben können. Beispiele hierfür sind einfache CSV. Die Felder Benutzerdefiniert und Sirup können jeweils eine Verkettung mehrerer Werte sein. Sie können einen beliebigen geeigneten Subbegrenzer verwenden. Beispiele hier verwenden Raum. Das Feld "Schüsse" ist auch eine Verkettung einer (möglichen) Zahl und einer Bezeichnung der Bechergröße (die im physischen Becher enthalten ist, aber natürlich an diese Stelle in der Codierung passt).

Die Decaf-Feldwerte werden in solche Wörter übersetzt

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

Logischerweise sind die Bruchwerte nur zulässig, wenn die Anzahl der Schüsse durch den Nenner teilbar ist; Für diese Herausforderung ist es jedoch nicht erforderlich, diesen Fehler zu erkennen oder zu diagnostizieren.

Das Feld "Aufnahmen" sollte in seine numerische Komponente (falls vorhanden) und die Größenkennung unterteilt werden. Die Nummer sollte in lateinischer Tupelform angezeigt werden: einfach, doppelt, dreifach, vierfach, fünffach, über 5 hinaus drucken Sie einfach die Nummer und das Suffix "-tuple", dh. 7-tuple,16-tuple . Die Größenbezeichnungen sind:

S  short
T  tall
G  grande
V  venti

Z.B.

2T  double tall
3G  triple grande

Das Sirupfeld kann einen oder mehrere von mehreren optionalen Zahlen- / Buchstabencode-Token enthalten. Die maximale Anzahl eines Sirups beträgt 20. Auch das ist zu viel. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Z.B.

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

Das Milchfeld kann eines der folgenden Elemente enthalten .

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

Das Feld Benutzerdefiniert kann einen oder mehrere von mehreren Modifikatoren mit optionalem xoder -Vorzeichen enthalten.

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

Das Feld Getränk enthält eine Getränke-ID.

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

Jedes Feld kann leer sein, mit Ausnahme der Größenbezeichnung und der Getränke-ID.

Beispiele.

,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

Es besteht keine Notwendigkeit, fehlerhafte oder unlogische Zubereitungen wie "kein Schaum ... Cappuccino *" zu diagnostizieren.

Zusätzliche Komplikation

Für nur die Getränke mit dem Wort espressosollte die Nummer singledurch solound doubledurch ersetzt werden doppio. Und die Größe kann nicht spezifiziert und weggelassen werden. Nur für das bloße espressoGetränk espressoselbst sollte das Wort selbst weggelassen werden , wenn die einzige andere Spezifikation eine dieser beiden speziell ersetzten Schusszahlen ist .

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

Zusätzliche Beobachtungen zum Thema "Lesen einer Tasse"

Dieser Teil ist keine Voraussetzung für diese Herausforderung, kann jedoch eine nützliche Verfeinerung bei der Anwendung dieser Art von verbalisiertem System in anderen Bereichen sein.

Ich habe die Syntax ganz am Anfang erwähnt, und durch Anwenden des Schemas auf eingehende Wortströme konnten Befehle von mehreren Auftragnehmern mündlich an den Barista übertragen werden, der Getränke herstellt. Der grobe Rahmen SIZE .... DRINKbietet eine Abgrenzung zwischen mehreren gleichzeitig gesprochenen Befehlen. Es besteht daher die Tendenz, alle inneren Attribute als Adjektivphrasen zu definieren, sodass die Reihenfolge auch eine gültige englische Nominalphrasenstruktur aufweist. So whipwird oft gesprochen with whipoder whippedund foamwird oft gesprochen foamyoder with foam.

Daher "korrigieren" einige Baristas aus alter Zeit Sie nicht, wenn sie die Reihenfolge im richtigen Format wiederholen ( na ja , ... manchmal ). Sie organisieren die Informationen einfach, um sich alle Details genau zu merken. Durch die schematische Darstellung der Informationen wird eine gesamte Getränkebestellung zu einer Einheit, um die magische Zahl 7 plus oder minus 2 anzuwenden . Ein Barista mit dieser Fähigkeit kann also 5-9 Befehle in seinem Kopf halten, vorausgesetzt, andere Ablenkungen verbrauchen nicht zu viel Kopffreiheit. :) :)

luser droog
quelle
4
Ich bin froh, dass Sie diese eher als Getränke als als Kaffee bezeichnet haben.
Neil
Was meinst du mit Neugeborenen? Wenn ich nicht über das Handy bestelle, schreiben alle Starbucks-Baristas, die ich je gesehen habe, sie immer noch mit einem schwarzen Stift auf.
Joe Z.
@ JoeZ. Nur meine Frustration, dass die Einfachheit des alten Weges ständig untergraben wird. Die Baristas selbst müssen bei der Eingabe der Reihenfolge in das System in eine dritte Form übersetzen. Und für ein Geschäft mit Durchfahrt wird die Bestellung in einer vierten Form auf den Aufkleber gedruckt. Während die Auflistung in der Heads-up-Warteschlange ein fünftes unterschiedliches Format hat (wobei alle Sirupnummern weggelassen werden).
Luser Droog
1
s / Frust / Wehklage /
Luser Droog

Antworten:

3

Python, 824 815 807 805 Bytes

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

Etwas besser lesbar:

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

Demo unter https://repl.it/C8Hz/3

Chuck Morris
quelle
6

Javascript ES6, 902 900 Bytes

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

Beispielläufe:

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
Dendrobium
quelle
Versuchen Sie Folgendes: (R=...)("=-.no.!...(Definieren Sie R inline und verwenden Sie das Ergebnis als Funktion)
Conor O'Brien
1

Ruby, 957 Bytes

Vielleicht habe ich den falschen Ansatz gewählt; Ich könnte eine Lösung finden, besonders nachdem ich herausgefunden hatte, dass die Frage mitten in der Ausarbeitung meiner Antwort angenommen worden war. Die Art und Weise, wie es jetzt ist, ist jedoch noch schlimmer als Javascript ...

In der Tat sollte ein anderer Ruby-Codierer höchstwahrscheinlich eine viel bessere Antwort einreichen, anstatt Vorschläge zu machen, um meine Antwort weiter zu spielen

Probieren Sie es online aus, während ich in der Ecke weine

->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'}
Wert Tinte
quelle
Ich werde die Akzeptanz aktualisieren, wenn sich der Status ändert!
luser droog
1
Könnte sein? Ich bin einfach nicht sehr gut in der Info-Komprimierung wie die beiden anderen Antworten. Vielleicht ist jemand anderes derjenige, der Python besiegt, da dies eine sehr naive Lösung ist
Value Ink