スターバックスから英語へ


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フィールドは、数値コンポーネント(存在する場合)とサイズ識別子に分割する必要があります。数字はラテンタプル形式で表示する必要があります。1、2、3、4、5、5を超えると、数字と接尾辞 "-tuple"を出力するだけです。7-tuple、16-tuple。サイズの指定は次のとおりです。

S  short
T  tall
G  grande
V  venti

例えば。

2T  double tall
3G  triple grande

Syrupフィールドには、いくつかのオプション番号/文字コードトークンの1つ以上が含まれる場合があります。シロップの最大数は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または-記号付きのいくつかの修飾子が1つ以上含まれる場合があります。

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

ドリンクフィールドには、1つのドリンクIDが含まれています。

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

サイズの指定とドリンクIDを除き、どのフィールドも空白にできます。

例。

,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ドリンク自体についてのみ、他の唯一の仕様がこれら2つの特別に置き換えられたショット数の1つである場合、単語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を適用するために、飲料注文全体が1つの単位になります。したがって、このスキルを持つバリスタは、他の気晴らしがヘッドルームをあまり消費しない限り、頭に5〜9のオーダーを保持できます。:)


5
これらをコーヒーではなく飲み物と呼んでもらえれば嬉しいです。
— Neil

newfangledとはどういう意味ですか。私が携帯から注文しているのでない限り、今まで見たすべてのスターバックスのバリスタはまだ黒いマーカーでそれを書き留めています。
— Joe Z.

@JoeZ。古い方法の単純さは絶えず侵食されているという私の欲求不満だけです。バリスタ自身が、注文をシステムに入力する方法で3番目の形式に変換する必要があります。ドライブスルーの店舗の場合、注文はステッカーに4番目のフォームで印刷されます。一方、ヘッドアップキューのリストには5番目の明確な形式があります(シロップ番号はすべて省略されています)。
— luser droog 2016

1
s / frustration / lamentation /
— luser droog 2016

回答:


3

Retina 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

「solo」または「doppio」が他の唯一の修飾子である場合、「espresso」という単語を削除します。

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

と文字列の終わりの間にカンマが1つだけあるR任意のものにMを追加します。これにより、R後ですべてのを「霧雨」に変換できます。

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

Ruby -plaF,、975 870バイト

私は、この質問に対する私の古い、ほぼ4年前の答えにランダムに賛成票を得ました。それがどれほどひどく進んだかについての私のコメントのため(私が以前書いたものを見たい場合は、投稿の履歴を確認できます)私はそれをより良くするために触発され(別名:ほとんどをゼロから書き直す)、何とか100バイトを超えてゴルフをすることができました。Pythonの回答よりはまだ長いですが、今の状況にとても満足しています。

約20バイトを使用して、コンマ構造の特定の部分に影響を与えるために正規表現パターンを実行しようとするから切り替えることによって救われた-aF,カンマで入力のラインを自動splitし、それを保存するためのフラグを$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 2016

1
多分?他の2つの答えのように、情報の圧縮はあまり得意ではありません。これは非常にナイーブなソリューションであるため、おそらく誰か他の人がPythonを打ち負かすでしょう
— Value Ink
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.