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 x
atau 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 single
harus diganti solo
dan double
harus diganti oleh doppio
. Dan ukurannya mungkin tidak ditentukan dan dihilangkan. Juga, hanya untuk espresso
minuman kosong itu sendiri, jika satu-satunya spesifikasi lain adalah salah satu dari dua angka tembakan yang diganti secara khusus ini, maka kata espresso
itu 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 .... DRINK
memberikan 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 whip
sering diucapkan with whip
atau whipped
dan foam
sering diucapkan foamy
atau 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. :)
Jawaban:
Retina 0.8.2 , 640 byte
Melakukan serangkaian pergantian untuk mengubah input menjadi output yang diharapkan.
Cobalah online!
Sebagian besar penggantian itu cukup mudah. Beberapa bagian yang menarik adalah:
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.
Menghapus kata "espresso" jika "solo" atau "doppio" adalah satu-satunya pengubah lainnya.
Tambahkan sebuah
R
ke siapa sajaM
dengan hanya satu koma di antara itu dan akhir dari string. Ini memungkinkan kita untuk mengubah semuaR
menjadi "gerimis" nanti.Mengizinkan kami mengubah 14,16,17, dan 19 menjadi bentuk kata-kata mereka sekaligus, karena kami mengganti 4,6,7, dan 9 sebelumnya.
sumber
Javascript ES6,
902900 byte"Tidak Disatukan":
Contoh berjalan:
sumber
(R=...)("=-.no.!...
(tentukan R sebaris lalu gunakan hasilnya sebagai fungsi)Python,
824815807805 byteSedikit lebih mudah dibaca:
Demo di https://repl.it/C8Hz/3
sumber
Ruby
-plaF,
,975870 byteSaya 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 beberapasub
/gsub
perintah 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.
Cobalah online!
sumber