스타 벅스에서 영어로


12

Starbucks는 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"

논리적으로, 분수 값은 샷 수가 분모로 나눌 수있는 경우에만 허용됩니다. 그러나이 문제에 대해서는이 오류를 감지하거나 진단 할 필요가 없습니다.

샷 필드는 숫자 구성 요소 (있는 경우)와 크기 식별자로 구분해야합니다. 숫자는 라틴 튜플 형식으로 표시해야합니다. 단일, 이중, 삼중, 4 중, 5 중, 5를 넘어 서면 숫자와 접미사 "-튜플"을 인쇄하면됩니다. 7-tuple,16-tuple . 크기 지정은 다음과 같습니다.

S  short
T  tall
G  grande
V  venti

예 :

2T  double tall
3G  triple grande

시럽 필드에는 여러 개의 선택적 숫자 / 문자 코드 토큰 중 하나 이상이 포함될 수 있습니다. 시럽의 최대 수는 20 개입니다. LOL.

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

크기 지정 및 음료 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드링크 자체의 경우, 다른 스펙 만이이 두 개의 특별히 교체 된 샷 수 중 하나 인 경우 단어 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또는 whippedfoam자주 이야기한다 foamywith foam.

따라서 일부 오래된 바리 스타의 경우 , 올바른 형식으로 주문을 반복 할 때 "정확하게"조정되지 않습니다 ( 때로는 ... ). 그들은 모든 세부 사항을 정확하게 기억하기 위해 단순히 정보를 구성하고 있습니다. 정보를 체계화함으로써, 음료수 전체가 매직 넘버 7 플러스 또는 마이너스 2 를 적용 목적으로 단일 단위가된다 . 따라서이 기술을 가진 바리 스타는 다른 방해 요소가 너무 많은 헤드 룸을 소비하지 않는 한 5-9 주문을 머리에 담을 수 있습니다. :)


5
커피 라기보다는 음료 라 부르는 것을 기쁘게 생각합니다.
Neil

새로운 것을 의미합니까? 모바일에서 주문하지 않는 한, 내가 본 모든 스타 벅스 바리 스타는 여전히 검은 색 마커로 적습니다.
Joe 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

"espresso"라는 단어가 포함 된 음료의 특수한 경우를 처리합니다. 이 숫자를 라틴 튜플 형식으로 변환하는 단계에 도달하기 전에 1과 2를 "solo"와 "doppio"로 변환합니다.

Z,,,,E$
Z

"solo"또는 "doppio"가 유일한 다른 수정자인 경우 "espresso"라는 단어를 제거합니다.

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

쉼표와 문자열 끝 사이에 쉼표가 하나만 있는 R을 추가 M합니다. 이를 통해 R나중에 모든 s를 "이슬비"로 변환 할 수 있습니다 .

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

사전에 4,6,7 및 9를 대체하기 때문에 14,16,17 및 19를 단어 형태로 한 번에 변환 할 수 있습니다.


6

자바 스크립트 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

파이썬, 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 바이트

나는이 질문에 대한 나의 거의 4 살짜리 대답에 대한 무작위 공감대를 얻었으며 얼마나 끔찍하게 진행되었는지에 대한 의견 때문에 (이전에 쓴 것을보고 싶다면 게시물 기록을 확인할 수 있음) 더 나은 것을 만들기 위해 영감을 얻었고 (일명 : 대부분을 처음부터 다시 작성) 100 바이트가 넘는 골프를 치렀습니다. 파이썬 답변보다 여전히 길이가 있지만 지금은 상황이 훨씬 행복합니다.

약 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
아마도? 나는 다른 두 가지 대답처럼 정보 압축에별로 좋지 않습니다. 이것은 매우 순진한 솔루션이기 때문에 다른 누군가가 파이썬을 이길 수있을 것입니다
Value Ink
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.