Starbucks ke Bahasa Inggris

12

Pada masa-masa klasik Starbucks sebelum printer-stiker bermodel baru ini dan perangkat nirkabel melalui headset palmtop scanner, pada masa-masa sulit tahun 2000-an, Starbucks memiliki sistem ringkas untuk menggambarkan minuman dengan sintaksis yang ketat dan bentuk yang disandikan.

Secara vertikal pada cangkir ada serangkaian kotak berlabel yang mungkin berisi nilai-nilai tertentu .:

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

Tapi kami akan menggunakan formulir horizontal untuk memudahkan manipulasi. Ini adalah nama-nama dari 6 bidang input yang mungkin merupakan bentuk yang mudah. Contoh di sini adalah CSV sederhana. Bidang Kustom dan bidang Sirup masing-masing dapat merupakan gabungan dari beberapa nilai. Anda dapat menggunakan subtitle yang mudah. Contoh di sini menggunakan ruang. Bidang Bidikan juga merupakan gabungan dari nomor (mungkin) dan penetapan ukuran cangkir (yang tersirat dalam cangkir fisik tetapi secara alami cocok di tempat ini dalam penyandian).

Nilai bidang Decaf diterjemahkan ke dalam kata-kata seperti ini

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

Secara logis, nilai fraksional hanya diperbolehkan ketika jumlah tembakan dapat dibagi oleh penyebut; tetapi untuk tantangan ini tidak perlu mendeteksi atau mendiagnosis kesalahan ini.

Bidang Bidikan harus dipecah menjadi komponen numeriknya (jika ada) dan pengidentifikasi ukuran. Angka tersebut harus ditampilkan dalam bentuk latin tuple: single, double, triple, quadruple, quintuple, di atas 5 cukup cetak angka dan akhiran "-tuple" yaitu. 7-tuple,16-tuple . Sebutan ukuran adalah:

S  short
T  tall
G  grande
V  venti

Misalnya.

2T  double tall
3G  triple grande

Bidang Syrup dapat berisi satu atau lebih dari beberapa token kode angka / huruf opsional. Jumlah maksimum sirup adalah 20. Bahkan itu terlalu banyak. LOL.

V  vanilla
C  caramel
M  mocha
H  hazelnut

Misalnya.

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

Bidang susu dapat berisi salah satu dari yang berikut ini.

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

Bidang Kustom dapat berisi satu atau beberapa pengubah dengan tanda xatau opsional -.

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

Bidang Minuman berisi satu id minuman.

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

Setiap bidang mungkin kosong kecuali untuk penunjukan ukuran dan id minuman.

Contohnya.

,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

Tidak perlu mendiagnosis ramuan yang keliru atau tidak logis seperti "tidak berbusa ... cappuccino *.

Komplikasi tambahan

Untuk hanya minuman dengan kata espresso, nomor singleharus diganti solodan doubleharus diganti oleh doppio. Dan ukurannya mungkin tidak ditentukan dan dihilangkan. Juga, hanya untuk espressominuman kosong itu sendiri, jika satu-satunya spesifikasi lain adalah salah satu dari dua angka tembakan yang diganti secara khusus ini, maka kata espressoitu sendiri harus dihilangkan.

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

Pengamatan tambahan tentang 'membaca cangkir'

Bagian ini bukan persyaratan untuk tantangan ini, tetapi mungkin merupakan penyempurnaan yang berguna dalam menerapkan sistem verbalisasi semacam ini di domain lain.

Saya sebutkan sintaks pada awalnya, dan dengan menerapkan skema ke aliran kata yang masuk, pesanan dapat ditransmisikan secara verbal oleh beberapa pengambil pesanan ke barista membuat minuman. Kerangka kerja kasar SIZE .... DRINKmemberikan demarkasi antara beberapa perintah yang diucapkan sekaligus. Dengan demikian ada kecenderungan untuk menjadikan semua atribut interior sebagai frase kata sifat sehingga urutannya juga memiliki struktur frase nomina bahasa Inggris yang valid. Begitu whipsering diucapkan with whipatau whippeddan foamsering diucapkan foamyatau with foam.

Jadi, untuk beberapa barista lama , mereka tidak "mengoreksi Anda" ketika mereka mengulangi urutan dalam format yang tepat ( yah, ... kadang-kadang ). Mereka hanya mengatur informasi dengan tujuan mengingat semua detail dengan tepat. Dengan menyusun informasi, seluruh pesanan minuman menjadi satu unit untuk tujuan menerapkan angka ajaib 7 plus atau minus 2 . Jadi seorang barista dengan keterampilan ini dapat menahan 5-9 pesanan di kepala mereka asalkan gangguan lain tidak mengkonsumsi ruang kepala terlalu banyak. :)

luser droog
sumber
5
Saya senang Anda menyebutnya sebagai minuman, bukan kopi.
Neil
Apa maksudmu bermodel baru? Kecuali saya memesan dari ponsel, semua barista Starbucks yang pernah saya lihat masih menuliskannya dengan spidol hitam.
Joe Z.
@ Joz. Hanya frustrasi saya bahwa kesederhanaan cara lama terus terkikis. Barista sendiri harus menerjemahkan ke bentuk ketiga dengan cara memasukkan urutan ke sistem. Dan untuk toko dengan drive-thru, pesanan dicetak dalam bentuk keempat pada stiker. Sedangkan daftar pada antrian kepala-up memiliki format berbeda kelima (menghilangkan semua nomor sirup).
luser droog
1
s / frustrasi / ratapan /
luser droog

Jawaban:

3

Retina 0.8.2 , 640 byte

Melakukan serangkaian pergantian untuk mengubah input menjadi output yang diharapkan.

-
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

Cobalah online!

Sebagian besar penggantian itu cukup mudah. Beberapa bagian yang menarik adalah:

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

Menangani wadah khusus untuk minuman yang mengandung kata "espresso". Itu mengubah 1 dan 2 menjadi "solo" dan "doppio" sebelum kita sampai ke tahap di mana kita mengubah angka-angka itu menjadi bentuk tuple latin.

Z,,,,E$
Z

Menghapus kata "espresso" jika "solo" atau "doppio" adalah satu-satunya pengubah lainnya.

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

Tambahkan sebuah Rke siapa saja Mdengan hanya satu koma di antara itu dan akhir dari string. Ini memungkinkan kita untuk mengubah semua Rmenjadi "gerimis" nanti.

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

Mengizinkan kami mengubah 14,16,17, dan 19 menjadi bentuk kata-kata mereka sekaligus, karena kami mengganti 4,6,7, dan 9 sebelumnya.

pecandu matematika
sumber
6

Javascript ES6, 902 900 byte

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

"Tidak Disatukan":

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

Contoh berjalan:

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
sumber
Coba ini: (R=...)("=-.no.!...(tentukan R sebaris lalu gunakan hasilnya sebagai fungsi)
Conor O'Brien
4

Python, 824 815 807 805 byte

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

Sedikit lebih mudah dibaca:

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

Demo di https://repl.it/C8Hz/3

Chuck Morris
sumber
3

Ruby -plaF, , 975 870 byte

Saya mendapat jawaban acak pada jawaban lama saya, hampir empat tahun untuk pertanyaan ini, dan karena komentar saya tentang betapa mengerikannya hal itu terjadi (Anda dapat memeriksa riwayat posting jika Anda ingin melihat apa yang saya tulis sebelumnya). terinspirasi untuk membuatnya lebih baik (alias: menulis ulang sebagian besar dari bawah ke atas) dan berhasil bermain golf lebih dari seratus byte darinya. Masih lebih lama dari jawaban Python, tapi aku jauh lebih bahagia dengan keadaan sekarang.

Sekitar 20 byte diselamatkan dengan beralih dari mencoba menjalankan pola regex untuk memengaruhi bagian-bagian spesifik dari struktur koma ke menggunakan -aF,flag untuk secara otomatis memisahkan satu baris input pada koma dan menyimpannya $F, memungkinkan saya untuk memodifikasi beberapa elemen sebelum menjahitnya kembali bersama-sama dan akhirnya memodifikasi variabel output dengan beberapa sub/ gsubperintah terakhir.

Jujur, jumlah penggantian regex yang dibuat di sini berarti sebagian besar ini bisa menjadi program Retina, tapi saya tidak tahu Retina cukup baik untuk itu.

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

Cobalah online!

Nilai Tinta
sumber
Saya akan memperbarui penerimaan jika statusnya berubah!
luser droog
1
Mungkin? Saya hanya tidak pandai kompresi informasi seperti dua jawaban lainnya; mungkin orang lain yang akan mengalahkan Python karena ini adalah solusi yang sangat naif
Value Ink