Starbucks à l'anglais

12

À l'époque classique de Starbucks, avant ces nouvelles imprimantes d'autocollants et de scanners palmtop de casque sans fil, dans les jours grisants de 2000, Starbucks avait un système concis pour décrire les boissons avec une syntaxe stricte et une forme codée qui l'accompagne.

Verticalement sur la tasse, il y a une série de boîtes étiquetées qui peuvent contenir certaines valeurs .:

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

Mais nous utiliserons une forme horizontale pour une manipulation plus facile. Ce sont les noms des 6 champs de l'entrée qui peuvent être n'importe quelle forme pratique. Les exemples ici sont de simples CSV. Le champ Personnalisé et le champ Sirop peuvent chacun être une concaténation de plusieurs valeurs. Vous pouvez utiliser n'importe quel sous-délimiteur pratique. Les exemples ici utilisent l'espace. Le champ Shots est également une concaténation d'un nombre (possible) et une désignation de la taille de la tasse (qui est implicite dans la tasse physique mais tient naturellement à cet endroit dans l'encodage).

Les valeurs du champ Decaf sont traduites en mots comme celui-ci

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

Logiquement, les valeurs fractionnaires ne sont autorisées que lorsque le nombre de tirs est divisible par le dénominateur; mais pour ce défi, il n'est pas nécessaire de détecter ou de diagnostiquer cette erreur.

Le champ Shots doit être divisé en sa composante numérique (si présente) et l'identificateur de taille. Le numéro doit être affiché sous forme de tuple latin: simple, double, triple, quadruple, quintuple, au7-tuple16-tuple - delà de 5, il suffit d'imprimer le numéro et le suffixe "-tuple", c'est-à-dire. , . Les désignations de taille sont:

S  short
T  tall
G  grande
V  venti

Par exemple.

2T  double tall
3G  triple grande

Le champ Sirop peut contenir un ou plusieurs jetons de nombre / code de lettre facultatifs. Le nombre maximum d'un sirop est de 20. Même cela, c'est trop. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Par exemple.

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

Le champ Lait peut contenir l' un des éléments suivants.

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

Le champ personnalisé peut contenir un ou plusieurs modificateurs avec option xou -signe.

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

Le champ Boisson contient un identifiant de boisson.

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

Tout champ peut être vide, à l'exception de la désignation de la taille et de l'identifiant de la boisson.

Exemples.

,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

Il n'est pas nécessaire de diagnostiquer des concoctions erronées ou illogiques telles qu'un "cappuccino sans mousse ...".

Complication supplémentaire

Pour les boissons uniquement avec le mot espresso, le numéro singledoit être remplacé par soloet doubledoit être remplacé par doppio. Et la taille peut être non spécifiée et omise. De plus, juste pour la espressoboisson nue elle-même, si la seule autre spécification est l'un de ces deux nombres de tirs spécialement remplacés, alors le mot espressolui-même doit être omis.

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

Observations supplémentaires sur la «lecture d'une tasse»

Cette partie n'est pas une exigence pour ce défi mais peut être un raffinement utile dans l'application de ce type de système verbalisé dans d'autres domaines.

J'ai mentionné la syntaxe au tout début, et en appliquant le schéma aux flux entrants de mots, les commandes pouvaient être transmises verbalement par plusieurs preneurs de commandes au barista faisant des boissons. Le cadre approximatif SIZE .... DRINKoffre une démarcation entre plusieurs ordres prononcés simultanément. Il y a donc une tendance à faire de tous les attributs intérieurs des phrases adjectivales, de sorte que l'ordre a également une structure de phrases nominales en anglais valide. Ainsi whipest souvent parlé with whipou whippedet foamest souvent parlé foamyou with foam.

Ainsi, pour certains baristas d'autrefois , ils ne "vous corrigent " pas lorsqu'ils répètent l'ordre au bon format ( enfin, ... parfois ). Ils organisent simplement les informations dans le but de se souvenir exactement de tous les détails. En schématisant les informations, une commande de boisson entière devient une seule unité dans le but d'appliquer le nombre magique 7 plus ou moins 2 . Ainsi, un barista avec cette compétence peut tenir 5-9 ordres dans sa tête à condition que les autres distractions ne consomment pas trop d'espace pour la tête. :)

luser droog
la source
5
Je suis content que vous les ayez appelés boissons plutôt que café.
Neil
Que voulez-vous dire par une nouvelle génération? À moins que je commande depuis un mobile, tous les baristas Starbucks que j'ai jamais vus l'écrivent toujours avec un marqueur noir.
Joe Z.
@JoeZ. Juste ma frustration que la simplicité de l'ancienne voie soit continuellement érodée. Les baristas eux-mêmes doivent se traduire par une troisième forme dans la manière de saisir l'ordre dans le système. Et pour un magasin avec service au volant, la commande est imprimée sous une quatrième forme sur l'autocollant. Alors que la liste dans la file d'attente tête haute a un cinquième format distinct (en omettant tous les numéros de sirop).
luser droog
1
s / frustration / lamentation /
luser droog

Réponses:

3

Retina 0.8.2 , 640 octets

Effectue une série de substitutions pour transformer l'entrée en sortie attendue.

-
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

Essayez-le en ligne!

La plupart sont des remplacements assez simples. Quelques parties intéressantes sont:

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

Gère les cas spéciaux pour les boissons contenant le mot "espresso". Il transforme le 1 et le 2 en "solo" et "doppio" avant d'arriver à l'étape où nous transformons ces nombres en forme de tuple latin.

Z,,,,E$
Z

Supprime le mot "espresso" si "solo" ou "doppio" est le seul autre modificateur.

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

Ajoute un Rà tout Mavec une seule virgule entre lui et la fin de la chaîne. Cela nous permet de transformer tous les Rs en "bruine" plus tard.

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

Permet de transformer 14,16,17 et 19 en leurs formes verbales d'un seul coup, puisque nous remplaçons 4,6,7 et 9 au préalable.

accro aux mathématiques
la source
6

Javascript ES6, 902 900 octets

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())

"Non golfé":

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

L'exemple s'exécute:

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
la source
Essayez ceci: (R=...)("=-.no.!...(définissez R en ligne puis utilisez le résultat en tant que fonction)
Conor O'Brien
4

Python, 824 815 807 805 octets

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

Un peu plus lisible:

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

Démo sur https://repl.it/C8Hz/3

Chuck Morris
la source
3

Rubis -plaF, , 975 870 octets

J'ai reçu un vote positif au hasard sur ma vieille réponse, vieille de presque quatre ans, à cette question, et à cause de mes commentaires sur la façon dont cela s'est horriblement passé (vous pouvez vérifier l'historique du message si vous voulez voir ce que j'ai écrit auparavant) j'étais inspiré pour l'améliorer (alias: réécrire la plupart à partir de zéro) et a réussi à jouer au golf sur une centaine d'octets. Encore plus longtemps que la réponse Python, mais je suis beaucoup plus heureux de la façon dont les choses se sont passées maintenant.

Environ 20 octets ont été enregistrés en passant d'essayer d'exécuter des modèles d'expression régulière pour affecter des parties spécifiques de la structure de virgule à utiliser l' -aF,indicateur pour fractionner automatiquement une ligne d'entrée sur des virgules et l'enregistrer $F, ce qui me permet de modifier certains éléments avant de les recoudre ensemble et enfin modifier la variable de sortie avec les dernières commandes sub/ gsub.

Honnêtement, le nombre de remplacements de regex effectués ici signifie que la plupart de cela pourrait être un programme Retina, mais je ne connais pas assez bien Retina pour cela.

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

Essayez-le en ligne!

Encre de valeur
la source
Je mettrai à jour l'acceptation si le statut change!
luser droog
1
Peut être? Je ne suis tout simplement pas très bon en compression d'informations comme les deux autres réponses; peut-être que quelqu'un d'autre sera le seul à battre Python, car il s'agit d'une solution très naïve
Value Ink