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

Поле Syrup может содержать один или несколько из нескольких маркеров необязательного числа / буквенного кода. Максимальное количество сиропа - 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, которые я когда-либо видел, все еще записывают его черным маркером.
Джо З.
@JoeZ. Просто мое разочарование тем, что простота старого пути постоянно размывается. Самим баристам приходится переводить в третью форму способ ввода заказа в систему. А для магазина с проездом заказ напечатан в четвертой форме на наклейке. Принимая во внимание, что список в очереди заголовков имеет пятый отдельный формат (исключая все номера сиропа).
Люсер Дрог
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позже преобразовать все в «моросящий дождь».

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

"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

Пример работы:

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=...)("=-.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

Попробуйте онлайн!

Значение чернил
источник
Я обновлю прием, если статус изменится!
Люзер Дрог
1
Может быть? Я просто не очень хорош в сжатии информации, как и два других ответа; может быть, кто-то еще победит Python, поскольку это очень наивное решение
Value Ink