星巴克转英文


12

在这些新颖的不干胶标签打印机和无线穿透式耳机掌上扫描仪交易问世之前的星巴克的经典时期,在2000年代的鼎盛时期,星巴克拥有简洁的系统,以严格的语法和随附的编码形式描述饮料。

在杯子的垂直方向上,有一系列带有标签的盒子,其中可能包含某些值:

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。“自定义”字段和“糖浆”字段可以分别是多个值的串联。您可以使用任何方便的子定界符。这里的示例使用空格。Shots字段也是一个(可能的)数字和一个杯子尺寸的名称的串联(这在物理杯子中是隐式的,但在编码中自然适合此位置)。

Decaf字段值被翻译成这样的单词

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

从逻辑上讲,分数值仅在拍摄数量可被分母整除时才被允许;但对于此挑战,无需检测或诊断此错误。

Shots字段应分为其数字部分(如果存在)和大小标识符。数字应以拉丁元组形式显示:单,双,三元组,四元组,五元组,超过5则只需打印数字和后缀“ -tuple”即可。7-tuple16-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

饮料字段包含一个饮料ID。

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应该用solodouble代替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 whipwhippedfoam经常讲foamywith foam

因此,对于一些老式的咖啡师,当他们以正确的格式重复命令时,他们并不会“纠正您”(嗯,...有时)。他们只是为了准确记住所有细节而组织信息。通过对信息进行模式化,整个饮料订单将变成一个单位,以应用7或2的幻数。因此,具备此技能的咖啡师可以将5-9份订单保留在他们的头脑中,前提是其他干扰因素不会占用太多的头部空间。:)


5
我很高兴您将这些称为饮料,而不是咖啡。
尼尔

你是什​​么意思 除非我从移动设备订购,否则我见过的所有星巴克咖啡师仍然会用黑色记号笔写下来。
Joe Z.

@JoeZ。只是我对旧方法的简单性不断受到侵蚀的不满。咖啡师本身必须以将订单输入系统的方式转换为第三种形式。对于具有直通车道的商店,订单以第四种形式打印在标签上。在抬头队列中列出的内容具有第五种不同的格式(忽略所有糖浆编号)。
luser droog

1
s / frustration /
lamentation

Answers:


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

处理包含“ espresso”一词的饮料的特殊情况。在进入将这些数字转换为拉丁元组形式的阶段之前,它将1和2转换为“ solo”和“ doppio”。

Z,,,,E$
Z

如果“ solo”或“ doppio”是唯一的其他修饰词,则删除“ espresso”一词。

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

R在任何M字符和字符串的结尾之间仅加一个逗号的后面附加一个。这使我们以后可以将所有Rs转换为“ drizzle”。

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

因为我们预先替换了4,6,7和9,所以我们可以立即将14,16,17和19转换成它们的单词形式。


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内联然后将结果用作函数)
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,975870字节

我对这个问题几乎是四岁的旧答案有一个随机的赞誉,并且由于我对它的可怕程度的评论(如果您想看看我以前写的内容,可以查看帖子的历史记录),我当时是受到启发,使它变得更好(又名:从头开始重写其中的大部分内容),并成功地将其击倒了一百多个字节。仍然比Python的答案更长,但是我对现在的结果感到更加高兴。

通过从尝试运行正则表达式模式以影响逗号结构的特定部分到使用-aF,标志自动分割逗号上的输入行并将其保存到该标志$F,我可以修改一些元素,然后再将其缝合在一起,从而节省了大约20个字节。最后用最后几个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 '16

1
也许?我只是不像其他两个答案那样擅长信息压缩;也许有人会成为击败Python的人,因为这是一个非常幼稚的解决方案
Value Ink
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.