Starbucks na angielski

12

W klasycznych czasach Starbucks, zanim te nowiutkie drukarki naklejek i bezprzewodowe czytniki palmtopów ze sterowanym bezprzewodowo zestawem słuchawkowym, w czasach 2000 roku Starbucks miał zwięzły system opisywania napojów o ścisłej składni i towarzyszącej im zakodowanej formie.

Pionowo na kubku znajduje się seria oznakowanych pudełek, które mogą zawierać określone wartości:

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

Ale dla łatwiejszej manipulacji użyjemy poziomej formy. Są to nazwy 6 pól danych wejściowych, które mogą mieć dowolną dogodną formę. Przykładami są proste pliki CSV. Każde z pól Custom i Syrop może być połączeniem kilku wartości. Możesz użyć dowolnego wygodnego subdelimera. Przykłady tutaj wykorzystują spację. Pole Shots jest także połączeniem (możliwej) liczby i oznaczenia rozmiaru kubka (który jest domyślny w kubku fizycznym, ale naturalnie pasuje do tego miejsca w kodowaniu).

Wartości pól Decaf są tłumaczone na słowa takie jak ten

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

Logicznie, wartości ułamkowe są dopuszczalne tylko wtedy, gdy liczba strzałów jest podzielna przez mianownik; ale w przypadku tego wyzwania nie jest konieczne wykrywanie ani diagnozowanie tego błędu.

Pole Shots powinno zostać podzielone na jego składową liczbową (jeśli jest obecna) i identyfikator wielkości. Liczba powinna być wyświetlana w kratce łacińskiej: pojedyncza, podwójna, potrójna, czteroosobowa, pięciokrotna, powyżej 5 wystarczy wydrukować liczbę i sufiks „-tuple” tj. 7-tuple,16-tuple . Oznaczenia wielkości to:

S  short
T  tall
G  grande
V  venti

Na przykład.

2T  double tall
3G  triple grande

Pole Syrop może zawierać jeden lub więcej kilku tokenów z opcjonalnym numerem / kodem literowym. Maksymalna liczba syropu wynosi 20. Nawet to za dużo. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Na przykład.

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

Pole Mleko może zawierać jedno z poniższych.

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

Pole niestandardowe może zawierać jeden lub więcej modyfikatorów z opcją opcjonalną xlub -znakiem.

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

Pole Napój zawiera jeden identyfikator napoju.

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

Każde pole może być puste, z wyjątkiem oznaczenia rozmiaru i identyfikatora napoju.

Przykłady

,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

Nie ma potrzeby diagnozowania błędnych lub nielogicznych mikstur, takich jak „bez piany ... cappuccino *.

Dodatkowe komplikacje

W przypadku tylko napojów ze słowem espressonumer singlepowinien zostać zastąpiony przez soloi doublepowinien zostać zastąpiony przez doppio. Rozmiar może być nieokreślony i pominięty. Ponadto, tylko dla samego espressonapoju bezalkoholowego, jeśli jedyną inną specyfikacją jest jedna z tych dwóch specjalnie zastąpionych liczb strzałów, to espressosamo słowo należy pominąć.

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

Dodatkowe uwagi na temat „czytania kubka”

Ta część nie jest wymagana do tego wyzwania, ale może być użytecznym dopracowaniem w stosowaniu tego rodzaju zwerbalizowanego systemu w innych domenach.

Na początku wspomniałem o składni , a stosując schemat do przychodzących strumieni słów, zamówienia mogły być przekazywane ustnie przez kilku przyjmujących zamówienia do baristy produkującego napoje. Szorstkie ramy SIZE .... DRINKzapewniają rozgraniczenie między kilkoma zamówieniami wypowiadanymi jednocześnie. Istnieje zatem tendencja do tworzenia wszystkich atrybutów wewnętrznych jako wyrażeń przymiotnikowych, więc kolejność ma również prawidłową strukturę angielskich wyrażeń rzeczownikowych. Tak whipjest często używany with whiplub whippedi foamjest często używany foamylub with foam.

Tak więc, dla niektórych dawnych baristów , nie „poprawiają cię”, kiedy powtarzają kolejność we właściwym formacie ( no cóż… czasami ). Po prostu organizują informacje w celu dokładnego zapamiętania wszystkich szczegółów. Dzięki schematycznym informacjom całe zamówienie na napój staje się pojedynczą jednostką w celu zastosowania magicznej liczby 7 plus lub minus 2 . Tak więc barista posiadający tę umiejętność może trzymać w głowie 5-9 rozkazów, pod warunkiem, że inne zakłócenia nie zajmują zbyt dużo miejsca na głowie. :)

luser droog
źródło
5
Cieszę się, że nazywasz je raczej napojami, a nie kawą.
Neil
Co masz na myśli? O ile nie zamawiam z telefonu komórkowego, wszyscy bariści Starbucks, których kiedykolwiek widziałem, nadal zapisują to czarnym markerem.
Joe Z.
@JoeZ. Po prostu moja frustracja, że ​​prostota starego sposobu jest ciągle niszczona. Sami bariści muszą przełożyć się na trzecią formę w celu wprowadzenia zamówienia do systemu. W przypadku sklepu z przejazdem zamówienie jest drukowane w czwartej formie na naklejce. Natomiast wykaz w kolejce heads-up ma piąty odrębny format (pomijając wszystkie numery syropów).
luser droog
1
s / frustracja / lamentacja /
luser droog

Odpowiedzi:

3

Retina 0.8.2 , 640 bajtów

Wykonuje serię podstawień, aby przekształcić dane wejściowe w oczekiwane dane wyjściowe.

-
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

Wypróbuj online!

Większość z nich to dość proste zamienniki. Kilka interesujących części to:

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

Obsługuje specjalne skrzynki na napoje zawierające słowo „espresso”. Przekształca cyfry 1 i 2 w „solo” i „doppio”, zanim przejdziemy do etapu, na którym przekształcamy te liczby w kratę łacińską.

Z,,,,E$
Z

Usuwa słowo „espresso”, jeśli „solo” lub „doppio” jest jedynym innym modyfikatorem.

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

Dołącza Rdowolny Mz jednym przecinkiem między nim a końcem łańcucha. To pozwala nam Rpóźniej przekształcić wszystkie s w „mżawkę”.

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

Pozwala nam jednocześnie przekształcić 14, 16, 17 i 19 w ich formy słów, ponieważ wcześniej zastępujemy 4,6,7 i 9.

ćpun matematyki
źródło
6

JavaScript ES6, 902 900 bajtów

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

„Niegolfowany”:

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

Przykładowe przebiegi:

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
źródło
Spróbuj tego: (R=...)("=-.no.!...(zdefiniuj R inline, a następnie użyj wyniku jako funkcji)
Conor O'Brien
4

Python, 824 815 807 805 bajtów

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

Nieco bardziej czytelny:

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

Chuck Morris
źródło
3

Rubinowy -plaF, , 975 870 bajtów

Otrzymałem losową opinię na temat mojej starej, prawie czteroletniej odpowiedzi na to pytanie, a ze względu na moje komentarze na temat tego, jak okropnie poszło (możesz sprawdzić historię postów, jeśli chcesz zobaczyć, co napisałem wcześniej) byłem zainspirowany, by uczynić go lepszym (inaczej: przepisać większość od podstaw) i udało mu się zagrać w golfa ponad sto bajtów. Nadal dłużej niż odpowiedź w Pythonie, ale jestem znacznie bardziej zadowolony z tego, jak sprawy potoczyły się teraz.

Zapisano około 20 bajtów, przechodząc od próby uruchomienia wzorców -aF,wyrażeń regularnych, aby wpłynąć na określone części struktury przecinka, na użycie flagi do automatycznego podziału wiersza wprowadzania przecinków i zapisania go $F, co pozwala mi modyfikować niektóre elementy przed ponownym zszywaniem i na koniec modyfikując zmienną wyjściową za pomocą kilku ostatnich komend sub/ gsub.

Szczerze mówiąc, liczba zamienników wyrażeń regularnych tutaj oznacza, że ​​większość z nich może być programem Retina, ale nie znam wystarczająco dobrze Retina do tego.

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

Wypróbuj online!

Wartość tuszu
źródło
Zaktualizuję akceptację, jeśli status się zmieni!
luser droog
1
Może? Po prostu nie jestem zbyt dobry w kompresji informacji, jak pozostałe dwie odpowiedzi; może ktoś inny pokona Pythona, ponieważ jest to bardzo naiwne rozwiązanie
Value Ink