Starbucks in inglese


12

Nei tempi classici di Starbucks prima di queste nuove stampanti per adesivi e di dispositivi wireless wireless per palmari con scanner palmari, nei giorni inebrianti del 2000, Starbucks aveva un sistema conciso per descrivere le bevande con una sintassi rigorosa e una forma codificata di accompagnamento.

In verticale sulla tazza ci sono una serie di scatole etichettate che possono contenere determinati valori .:

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

Ma useremo una forma orizzontale per una più facile manipolazione. Questi sono i nomi dei 6 campi dell'input che possono essere di qualsiasi forma conveniente. Esempi qui sono CSV semplici. I campi Custom e Syrup possono essere concatenati ciascuno di diversi valori. È possibile utilizzare qualsiasi sottodelimitatore conveniente. Gli esempi qui usano lo spazio. Il campo Colpi è anche una concatenazione di un numero (possibile) e una designazione della dimensione della tazza (che è implicita nella tazza fisica ma si adatta naturalmente a questo posto nella codifica).

I valori del campo Decaf sono tradotti in parole come questa

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

Logicamente, i valori frazionari sono ammessi solo quando il numero di colpi è divisibile per il denominatore; ma per questa sfida non è necessario rilevare o diagnosticare questo errore.

Il campo Colpi dovrebbe essere suddiviso nel suo componente numerico (se presente) e nell'identificatore della dimensione. Il numero deve essere visualizzato in forma di tupla latina: singolo, doppio, triplo, quadruplo, quintuplo, oltre 5 basta stampare il numero e il suffisso "-tuple", ad es. 7-tuple,16-tuple . Le designazioni delle dimensioni sono:

S  short
T  tall
G  grande
V  venti

Per esempio.

2T  double tall
3G  triple grande

Il campo Sciroppo può contenere uno o più di diversi token con numero / lettercode facoltativi. Il numero massimo di uno sciroppo è 20. Anche quello è troppo. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Per esempio.

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

Il campo Latte può contenere uno dei seguenti.

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

Il campo Personalizzato può contenere uno o più modificatori con facoltativo xo -segno.

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

Il campo Drink contiene un ID drink.

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

Qualsiasi campo può essere vuoto ad eccezione della designazione delle dimensioni e dell'ID bevanda.

Esempi.

,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

Non è necessario diagnosticare intrugli errati o illogici come un "no foam ... cappuccino *.

Complicazione aggiuntiva

Solo per le bevande con la parola espresso, il numero singledeve essere sostituito da soloe doubledeve essere sostituito da doppio. E la dimensione può essere non specificata e omessa. Inoltre, solo per la espressobevanda nuda stessa, se l'unica altra specifica è una di queste due serie di colpi appositamente sostituite, allora la parola espressostessa dovrebbe essere omessa.

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

Ulteriori osservazioni su "leggere una tazza"

Questa parte non è un requisito per questa sfida, ma può essere un utile perfezionamento nell'applicazione di questo tipo di sistema verbalizzato in altri domini.

Ho menzionato la sintassi all'inizio e applicando lo schema a flussi di parole in arrivo, gli ordini potevano essere trasmessi verbalmente da diversi acquirenti al barista che producevano bevande. La struttura approssimativa SIZE .... DRINKfornisce la demarcazione tra diversi ordini pronunciati contemporaneamente. Vi è quindi la tendenza a rendere tutti gli attributi interni come frasi aggettivali, quindi l'ordine ha anche una valida struttura di frasi in inglese. Quindi whipè spesso parlato with whipo whippeded foamè spesso parlato foamyo with foam.

Quindi, per alcuni baristi dei vecchi tempi , non ti "correggono" quando ripetono l'ordine nel formato corretto ( beh, ... a volte ). Stanno semplicemente organizzando le informazioni allo scopo di ricordare esattamente tutti i dettagli. Schematizzando le informazioni, un intero ordine di bevande diventa una singola unità allo scopo di applicare il numero magico 7 più o meno 2 . Quindi un barista con questa abilità può tenere in testa 5-9 ordini a condizione che altre distrazioni non consumino troppo spazio per la testa. :)


5
Sono contento che tu abbia indicato queste come bevande, piuttosto che caffè.
Neil,

Cosa intendi con newfangled. A meno che non stia ordinando da cellulare, tutti i baristi di Starbucks che abbia mai visto lo scrivono ancora con un pennarello nero.
Joe Z.

@JoeZ. Solo la mia frustrazione per il fatto che la semplicità del vecchio modo viene continuamente erosa. Gli stessi baristi devono tradurre in una terza forma nel modo di inserire l'ordine nel sistema. E per un negozio con un drive-thru, l'ordine è stampato in quarta forma sull'adesivo. Considerando che l'elenco sulla coda heads-up ha un quinto formato distinto (omettendo tutti i numeri di sciroppo).
Luser droog

1
s / frustrazione / lamento /
luser droog

Risposte:


3

Retina 0.8.2 , 640 byte

Esegue una serie di sostituzioni per trasformare l'input nell'output previsto.

-
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

Provalo online!

La maggior parte sono sostituzioni piuttosto semplici. Alcune parti interessanti sono:

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

Gestisce i casi speciali per bevande contenenti la parola "espresso". Trasforma 1 e 2 in "solo" e "doppio" prima di arrivare sul palco dove trasformiamo quei numeri in forma di tupla latina.

Z,,,,E$
Z

Rimuove la parola "espresso" se "solo" o "doppio" è l'unico altro modificatore.

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

Aggiunge un Ra qualsiasi Mcon solo una virgola tra esso e la fine della stringa. Questo ci consente di trasformare tutte le Rs in "pioviggine" in seguito.

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

Ci permette di trasformare 14,16,17 e 19 nelle loro forme di parole tutte in una volta, poiché sostituiamo in anticipo 4,6,7 e 9.


6

Javascript ES6, 902 900 byte

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

Esempi di esecuzione:

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

Prova questo: (R=...)("=-.no.!...(definisci R inline quindi usa il risultato come funzione)
Conor O'Brien

4

Python, 824 815 807 805 byte

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

Leggermente più leggibile:

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 su https://repl.it/C8Hz/3


3

Rubino -plaF, , 975 870 byte

Ho ricevuto un voto casuale sulla mia vecchia risposta di quasi quattro anni a questa domanda, e grazie ai miei commenti su quanto orribilmente è andata (puoi controllare la cronologia dei post se vuoi vedere cosa ho scritto prima) ispirato a migliorarlo (alias: riscriverlo per lo più da zero) e riuscì a golf oltre cento byte. Ancora più a lungo della risposta di Python, ma sono molto più felice di come sono andate le cose adesso.

Sono stati salvati circa 20 byte passando dal tentativo di eseguire modelli di regex per influire su parti specifiche della struttura della virgola all'utilizzo del -aF,flag per lo spaccatura automatica di una riga di input su virgole e salvarla in $F, permettendomi di modificare alcuni elementi prima di ricucirli insieme e infine modificando la variabile di uscita con gli ultimi sub/ gsubcomandi.

Onestamente, il numero di sostituzioni regex effettuate qui significa che la maggior parte di questo potrebbe essere un programma Retina, ma non conosco Retina abbastanza bene per quello.

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

Provalo online!


Aggiornerò l'accettazione se lo stato cambia!
Luser droog

1
Può essere? Non sono molto bravo nella compressione delle informazioni come le altre due risposte; forse qualcun altro sarà quello che batterà Python poiché questa è una soluzione molto ingenua
Value Ink
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.