Starbucks до англійської


12

У класичні дні Starbucks перед тим, як ці новомодні наклейки-принтери та бездротовий прохідний гарнітур з пальчиковим сканером вимикаються, у суворі дні 2000-х років Starbucks створили стисну систему для опису напоїв із суворим синтаксисом та супровідною кодованою формою.

По вертикалі на чашці є серія мічених коробок, яка може містити певні значення:

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

Але ми будемо використовувати горизонтальну форму для більш легких маніпуляцій. Це назви 6 полів вводу, які можуть мати будь-яку зручну форму. Прикладами тут є простий CSV. Кожне поле та Сироп може бути об'єднанням кількох значень. Ви можете використовувати будь-який зручний субделімітер. Приклади тут використовують простір. Поле "Постріли" також є об'єднанням (можливого) числа та позначенням розміру чашки (який неявний у фізичній чашці, але природно вміщується в цьому місці в кодуванні).

Значення поля Decaf переводяться такими словами

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

За логікою, дробові значення допустимі лише тоді, коли кількість знімків ділиться на знаменник; але для цього завдання не потрібно виявляти та не діагностувати цю помилку.

Поле "Кадри" має бути розбито на його числовий компонент (якщо є) та ідентифікатор розміру. Число повинно бути відображене в латинській формі кортежу: одинарний, подвійний, потрійний, чотириразовий, чотирьохкратний, понад 5 просто надрукуйте число та суфікс "-tuple", тобто. 7-tuple,16-tuple . Позначення розміру:

S  short
T  tall
G  grande
V  venti

Напр.

2T  double tall
3G  triple grande

Поле Сироп може містити один або більше з декількох маркерів необов'язкового числа / буквеного коду. Максимальна кількість сиропу - 20. Навіть це занадто багато. ЛОЛ.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Напр.

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

Поле Молоко може містити одне з наступних.

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

Спеціальне поле може містити один або більше з декількох модифікаторів з необов'язковим xабо -знаком.

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

Поле "Напій" містить один ідентифікатор напою.

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

Будь-яке поле може бути порожнім, крім позначення розміру та ідентифікатора напою.

Приклади.

,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

Немає необхідності діагностувати помилкові чи нелогічні страви, такі як «без піни ... капучино *.

Додаткове ускладнення

Для лише напоїв зі словом espressoцифру singleслід замінити на soloі doubleзамінити на doppio. А розмір може бути невизначеним і пропущеним. Крім того, лише для самого голого espressoнапою, якщо єдиною іншою специфікацією є один із цих двох спеціально замінених номерів знімків, то саме слово espressoслід опустити.

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

Додаткові спостереження щодо "читання чашки"

Ця частина не є вимогою для цього виклику, але може бути корисним уточненням у застосуванні подібної вербалізованої системи в інших областях.

Я згадав синтаксис на самому початку, і, застосувавши схему до вхідних потоків слів, замовлення можна було передавати усно декількома ордерами на замовлення барісту, що виготовляє напої. Приблизні рамки SIZE .... DRINKзабезпечують розмежування декількох замовлень, вимовлених одночасно. Таким чином, існує тенденція робити всі внутрішні атрибути як дієприкметникові фрази, тому наказ також має дійсну структуру англійської іменникової фрази. Так whipчасто говорять with whipабо whippedі foamчасто говорять foamyабо with foam.

Таким чином, для старих барістів вони не "виправляють вас", коли вони повторюють порядок у відповідному форматі ( ну ... іноді ). Вони просто організовують інформацію з метою запам'ятовування всіх деталей. Схематизуючи інформацію, ціле замовлення напоїв стає єдиною одиницею з метою застосування магічного числа 7 плюс або мінус 2 . Тож бариста з цією майстерністю може утримувати 5-9 замовлень у голові за умови, що інші відволікання не займають занадто багато місця для голови. :)


5
Я радий, що ви назвали це напоями, а не кавою.
Ніл

Що ви маєте на увазі новомодні. Якщо я не замовляю з мобільного телефону, всі баристи Starbucks, які я коли-небудь бачив, все ще записують це чорним маркером.
Джо Z.

@JoeZ. Я просто засмучуюся тим, що простота старого способу постійно руйнується. Самі бариста повинні переводити на третю форму способом введення замовлення в систему. А для магазину з накопичувачем - замовлення друкується на наклейці у четвертому вигляді. Тоді як список у черговій черзі має п'ятий чіткий формат (опускаючи всі номери сиропу).
luser droog

1
s / розчарування / плач /
luser droog

Відповіді:


3

Сітківка 0,8,2 , 640 байт

Виконує серію підстановок, щоб перетворити вхід у очікуваний вихід.

-
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

Спробуйте в Інтернеті!

Більшість це досить прості замінники. Кілька цікавих частин:

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

Обробляє спеціальні корпуси для напоїв, що містять слово "еспресо". Він перетворює 1 і 2 в "соло" і "доппіо", перш ніж ми дістанемося до етапу, де перетворимо ці числа в латинську форму кортежу.

Z,,,,E$
Z

Видаляє слово "еспресо", якщо "соло" або "доппіо" є єдиним іншим модифікатором.

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

Додає додаток Rдо будь-якого Mзі лише однією комою між ним та кінцем рядка. Це дозволяє нам Rзгодом перетворити всі " s" на дріжанку.

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

Дозволяє нам перетворити 14,16,17 та 19 у їхні словоформи всі відразу, оскільки ми попередньо замінюємо 4,6,7 та 9.


6

Javascript ES6, 902 900 байт

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

"Безголів":

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

Приклад виконання:

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

Спробуйте так: (R=...)("=-.no.!...(визначте R inline, тоді використовуйте результат як функцію)
Conor O'Brien

4

Python, 824 815 807 805 байт

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

Трохи легше читати:

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

Демонстрація на https://repl.it/C8Hz/3


3

Рубі -plaF, , 975 870 байт

Я отримав випадкове опитування на свою стару, майже чотирирічну відповідь на це питання, і через мої коментарі щодо того, як жахливо це пішло (ви можете перевірити історію публікацій, якщо хочете подивитися, що я писав раніше), я був надихнули зробити це краще (він же: перепишіть більшу частину його з нуля) і встиг пограти в гольф на понад сто байт. Ще довше, ніж відповідь Python, але я набагато щасливіший, як зараз все вийшло.

Близько 20 байтів було збережено шляхом переходу від спроби запуску шаблонів регулярних виразів, щоб впливати на конкретні частини структури коми, до використання -aF,прапора для автоматичного роздвоєння рядка введення на комах і збереження до нього $F, що дозволяє мені змінювати деякі елементи, перш ніж зшивати його назад і нарешті , змінюючи вихідну змінний з останніми sub/ gsubкомандами.

Чесно кажучи, кількість замінених регулярних виразів тут означає, що більша частина цього може бути програмою Retina, але я не знаю Retina досить добре для цього.

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

Спробуйте в Інтернеті!


Я оновлю прийняття, якщо статус зміниться!
luser droog

1
Можливо? Я просто не дуже добре стискаю інформацію, як і інші два відповіді; можливо, хтось інший буде перемогти Python, оскільки це дуже наївне рішення
Value Ink
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.