W klasycznych czasach Starbucks, zanim te nowiutkie drukarki naklejek i bezprzewodowe czytniki palmtopów ze sterowanym bezprzewodowo zestawem słuchawkowym, w czasach 2000 roku Starbucks miał zwięzły system opisywania napojów o ścisłej składni i towarzyszącej im zakodowanej formie.
Pionowo na kubku znajduje się seria oznakowanych pudełek, które mogą zawierać określone wartości:
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
Ale dla łatwiejszej manipulacji użyjemy poziomej formy. Są to nazwy 6 pól danych wejściowych, które mogą mieć dowolną dogodną formę. Przykładami są proste pliki CSV. Każde z pól Custom i Syrop może być połączeniem kilku wartości. Możesz użyć dowolnego wygodnego subdelimera. Przykłady tutaj wykorzystują spację. Pole Shots jest także połączeniem (możliwej) liczby i oznaczenia rozmiaru kubka (który jest domyślny w kubku fizycznym, ale naturalnie pasuje do tego miejsca w kodowaniu).
Wartości pól Decaf są tłumaczone na słowa takie jak ten
-blank- -nothing-
X "decaf"
1/2 "half-caf"
1/3 "one-third-caf"
2/3 "two-thirds-caf"
Logicznie, wartości ułamkowe są dopuszczalne tylko wtedy, gdy liczba strzałów jest podzielna przez mianownik; ale w przypadku tego wyzwania nie jest konieczne wykrywanie ani diagnozowanie tego błędu.
Pole Shots powinno zostać podzielone na jego składową liczbową (jeśli jest obecna) i identyfikator wielkości. Liczba powinna być wyświetlana w kratce łacińskiej: pojedyncza, podwójna, potrójna, czteroosobowa, pięciokrotna, powyżej 5 wystarczy wydrukować liczbę i sufiks „-tuple” tj. 7-tuple
,16-tuple
. Oznaczenia wielkości to:
S short
T tall
G grande
V venti
Na przykład.
2T double tall
3G triple grande
Pole Syrop może zawierać jeden lub więcej kilku tokenów z opcjonalnym numerem / kodem literowym. Maksymalna liczba syropu wynosi 20. Nawet to za dużo. LOL.
V vanilla
C caramel
M mocha
H hazelnut
Na przykład.
2V 2C two vanilla two caramel
H hazelnut
M H 1V mocha hazelnut one vanilla
Pole Mleko może zawierać jedno z poniższych.
Wh whole-milk
% two-percent
N skim
B breve
Pole niestandardowe może zawierać jeden lub więcej modyfikatorów z opcją opcjonalną x
lub -
znakiem.
x extra F foam
- no WC whip
M mocha drizzle
CR caramel drizzle
Pole Napój zawiera jeden identyfikator napoju.
E espresso
EM espresso macchiato
ECP espresso con panna
A americano
L latte
C cappuccino
CM caramel macchiato
Każde pole może być puste, z wyjątkiem oznaczenia rozmiaru i identyfikatora napoju.
Przykłady
,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
Nie ma potrzeby diagnozowania błędnych lub nielogicznych mikstur, takich jak „bez piany ... cappuccino *.
Dodatkowe komplikacje
W przypadku tylko napojów ze słowem espresso
numer single
powinien zostać zastąpiony przez solo
i double
powinien zostać zastąpiony przez doppio
. Rozmiar może być nieokreślony i pominięty. Ponadto, tylko dla samego espresso
napoju bezalkoholowego, jeśli jedyną inną specyfikacją jest jedna z tych dwóch specjalnie zastąpionych liczb strzałów, to espresso
samo słowo należy pominąć.
,2,1V,B,,EM => doppio one vanilla breve espresso macchiato
,1,,,,E => solo
,2,,,,E => doppio
,3,,,,E => triple espresso
Dodatkowe uwagi na temat „czytania kubka”
Ta część nie jest wymagana do tego wyzwania, ale może być użytecznym dopracowaniem w stosowaniu tego rodzaju zwerbalizowanego systemu w innych domenach.
Na początku wspomniałem o składni , a stosując schemat do przychodzących strumieni słów, zamówienia mogły być przekazywane ustnie przez kilku przyjmujących zamówienia do baristy produkującego napoje. Szorstkie ramy SIZE .... DRINK
zapewniają rozgraniczenie między kilkoma zamówieniami wypowiadanymi jednocześnie. Istnieje zatem tendencja do tworzenia wszystkich atrybutów wewnętrznych jako wyrażeń przymiotnikowych, więc kolejność ma również prawidłową strukturę angielskich wyrażeń rzeczownikowych. Tak whip
jest często używany with whip
lub whipped
i foam
jest często używany foamy
lub with foam
.
Tak więc, dla niektórych dawnych baristów , nie „poprawiają cię”, kiedy powtarzają kolejność we właściwym formacie ( no cóż… czasami ). Po prostu organizują informacje w celu dokładnego zapamiętania wszystkich szczegółów. Dzięki schematycznym informacjom całe zamówienie na napój staje się pojedynczą jednostką w celu zastosowania magicznej liczby 7 plus lub minus 2 . Tak więc barista posiadający tę umiejętność może trzymać w głowie 5-9 rozkazów, pod warunkiem, że inne zakłócenia nie zajmują zbyt dużo miejsca na głowie. :)
Odpowiedzi:
Retina 0.8.2 , 640 bajtów
Wykonuje serię podstawień, aby przekształcić dane wejściowe w oczekiwane dane wyjściowe.
Wypróbuj online!
Większość z nich to dość proste zamienniki. Kilka interesujących części to:
Obsługuje specjalne skrzynki na napoje zawierające słowo „espresso”. Przekształca cyfry 1 i 2 w „solo” i „doppio”, zanim przejdziemy do etapu, na którym przekształcamy te liczby w kratę łacińską.
Usuwa słowo „espresso”, jeśli „solo” lub „doppio” jest jedynym innym modyfikatorem.
Dołącza
R
dowolnyM
z jednym przecinkiem między nim a końcem łańcucha. To pozwala namR
później przekształcić wszystkie s w „mżawkę”.Pozwala nam jednocześnie przekształcić 14, 16, 17 i 19 w ich formy słów, ponieważ wcześniej zastępujemy 4,6,7 i 9.
źródło
JavaScript ES6,
902900 bajtów„Niegolfowany”:
Przykładowe przebiegi:
źródło
(R=...)("=-.no.!...
(zdefiniuj R inline, a następnie użyj wyniku jako funkcji)Python,
824815807805 bajtówNieco bardziej czytelny:
Demo na https://repl.it/C8Hz/3
źródło
Rubinowy
-plaF,
,975870 bajtówOtrzymałem losową opinię na temat mojej starej, prawie czteroletniej odpowiedzi na to pytanie, a ze względu na moje komentarze na temat tego, jak okropnie poszło (możesz sprawdzić historię postów, jeśli chcesz zobaczyć, co napisałem wcześniej) byłem zainspirowany, by uczynić go lepszym (inaczej: przepisać większość od podstaw) i udało mu się zagrać w golfa ponad sto bajtów. Nadal dłużej niż odpowiedź w Pythonie, ale jestem znacznie bardziej zadowolony z tego, jak sprawy potoczyły się teraz.
Zapisano około 20 bajtów, przechodząc od próby uruchomienia wzorców
-aF,
wyrażeń regularnych, aby wpłynąć na określone części struktury przecinka, na użycie flagi do automatycznego podziału wiersza wprowadzania przecinków i zapisania go$F
, co pozwala mi modyfikować niektóre elementy przed ponownym zszywaniem i na koniec modyfikując zmienną wyjściową za pomocą kilku ostatnich komendsub
/gsub
.Szczerze mówiąc, liczba zamienników wyrażeń regularnych tutaj oznacza, że większość z nich może być programem Retina, ale nie znam wystarczająco dobrze Retina do tego.
Wypróbuj online!
źródło