À 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-tuple
16-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 x
ou -
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 single
doit être remplacé par solo
et double
doit être remplacé par doppio
. Et la taille peut être non spécifiée et omise. De plus, juste pour la espresso
boisson 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 espresso
lui-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 .... DRINK
offre 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 whip
est souvent parlé with whip
ou whipped
et foam
est souvent parlé foamy
ou 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. :)
Réponses:
Retina 0.8.2 , 640 octets
Effectue une série de substitutions pour transformer l'entrée en sortie attendue.
Essayez-le en ligne!
La plupart sont des remplacements assez simples. Quelques parties intéressantes sont:
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.
Supprime le mot "espresso" si "solo" ou "doppio" est le seul autre modificateur.
Ajoute un
R
à toutM
avec une seule virgule entre lui et la fin de la chaîne. Cela nous permet de transformer tous lesR
s en "bruine" plus tard.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.
la source
Javascript ES6,
902900 octets"Non golfé":
L'exemple s'exécute:
la source
(R=...)("=-.no.!...
(définissez R en ligne puis utilisez le résultat en tant que fonction)Python,
824815807805 octetsUn peu plus lisible:
Démo sur https://repl.it/C8Hz/3
la source
Rubis
-plaF,
,975870 octetsJ'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 commandessub
/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.
Essayez-le en ligne!
la source