Nos dias clássicos da Starbucks antes dessas novas impressoras de adesivos e drivers sem fio através do scanner de palmtop, nos dias inebriantes da década de 2000, a Starbucks tinha um sistema conciso para descrever bebidas com uma sintaxe estrita e o formulário codificado que a acompanha.
Verticalmente no copo, há uma série de caixas rotuladas que podem conter certos valores:
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
Mas usaremos uma forma horizontal para facilitar a manipulação. Estes são os nomes dos 6 campos da entrada que podem ser de qualquer forma conveniente. Exemplos aqui são simples CSV. Os campos Custom e Syrup podem ser uma concatenação de vários valores. Você pode usar qualquer subdelimitador conveniente. Exemplos aqui usam espaço. O campo Tiros também é uma concatenação de um número (possível) e uma designação do tamanho do copo (que está implícito no copo físico, mas naturalmente se encaixa nesse local na codificação).
Os valores do campo Descafeinado são traduzidos em palavras como esta
-blank- -nothing-
X "decaf"
1/2 "half-caf"
1/3 "one-third-caf"
2/3 "two-thirds-caf"
Logicamente, os valores fracionários são permitidos apenas quando o número de disparos é divisível pelo denominador; mas para esse desafio, não é necessário detectar ou diagnosticar esse erro.
O campo Tiros deve ser dividido em seu componente numérico (se presente) e no identificador de tamanho. O número deve ser exibido na forma de tupla em latim: único, duplo, triplo, quádruplo, quintuplo, além de 5, apenas imprima o número e o sufixo "-tuple" ie. 7-tuple
,16-tuple
. As designações de tamanho são:
S short
T tall
G grande
V venti
Por exemplo.
2T double tall
3G triple grande
O campo Xarope pode conter um ou mais dentre vários tokens de número opcional / código de letra. O número máximo de xarope é 20. Mesmo isso é demais. RI MUITO.
V vanilla
C caramel
M mocha
H hazelnut
Por exemplo.
2V 2C two vanilla two caramel
H hazelnut
M H 1V mocha hazelnut one vanilla
O campo Leite pode conter um dos seguintes.
Wh whole-milk
% two-percent
N skim
B breve
O campo Personalizado pode conter um ou mais dos vários modificadores com opcional x
ou -
sinal.
x extra F foam
- no WC whip
M mocha drizzle
CR caramel drizzle
O campo Bebida contém um ID de bebida.
E espresso
EM espresso macchiato
ECP espresso con panna
A americano
L latte
C cappuccino
CM caramel macchiato
Qualquer campo pode ficar em branco, exceto a designação do tamanho e o ID da bebida.
Exemplos.
,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
Não há necessidade de diagnosticar misturas errôneas ou ilógicas, como um "cappuccino" sem espuma ...
Complicação Adicional
Para apenas as bebidas com a palavra espresso
, o número single
deve ser substituído por solo
e double
deve ser substituído por doppio
. E o tamanho pode ser não especificado e omitido. Além disso, apenas para a espresso
bebida em si, se a única outra especificação for um desses dois números de fotos especialmente substituídos, a palavra em espresso
si deve ser omitida.
,2,1V,B,,EM => doppio one vanilla breve espresso macchiato
,1,,,,E => solo
,2,,,,E => doppio
,3,,,,E => triple espresso
Observações adicionais sobre 'ler um copo'
Esta parte não é um requisito para esse desafio, mas pode ser um refinamento útil na aplicação desse tipo de sistema verbalizado em outros domínios.
Mencionei sintaxe no início, e aplicando o esquema de fluxos de entrada de palavras, ordens poderiam ser transmitido verbalmente por vários tomadores de ordem para o bebidas barista fazer. A estrutura aproximada SIZE .... DRINK
fornece demarcação entre várias ordens faladas ao mesmo tempo. Existe, portanto, uma tendência a tornar todos os atributos interiores como frases adjetivas, de modo que a ordem também tenha uma estrutura de frase substantiva em inglês válida. Então, whip
é freqüentemente falado with whip
ou whipped
e foam
frequentemente falado foamy
ou with foam
.
Assim, para alguns baristas dos velhos tempos , eles não estão "corrigindo você" quando repetem a ordem no formato adequado ( bem, ... às vezes ). Eles estão simplesmente organizando as informações com o objetivo de lembrar exatamente todos os detalhes. Ao esquematizar as informações, um pedido inteiro de bebida se torna uma única unidade com a finalidade de aplicar o número mágico 7 mais ou menos 2 . Portanto, um barista com essa habilidade pode manter de 5 a 9 ordens em suas cabeças, desde que outras distrações não consumam muito espaço. :)
Respostas:
Retina 0.8.2 , 640 bytes
Executa uma série de substituições para transformar a entrada na saída esperada.
Experimente online!
A maioria são substituições bastante diretas. Algumas partes interessantes são:
Lida com os casos especiais de bebidas que contêm a palavra "espresso". Ele transforma o 1 e o 2 em "solo" e "doppio" antes de chegarmos ao estágio em que transformamos esses números em forma de tupla latina.
Remove a palavra "espresso" se "solo" ou "doppio" for o único outro modificador.
Anexa um
R
a qualquer umM
com apenas uma vírgula entre ele e o final da sequência. Isso nos permite transformar todos osR
s em "garoa" posteriormente.Permite transformar 14,16,17 e 19 em suas formas de palavras de uma só vez, pois substituímos 4,6,7 e 9 de antemão.
fonte
Javascript ES6,
902900 bytes"Ungolfed":
Exemplo é executado:
fonte
(R=...)("=-.no.!...
(R definir em linha, em seguida, usar o resultado como uma função)Pitão,
824815807805 bytesUm pouco mais legível:
Demonstração em https://repl.it/C8Hz/3
fonte
Ruby
-plaF,
,975870 bytesRecebi uma votação aleatória da minha antiga resposta de quase quatro anos para esta pergunta e, por causa dos meus comentários sobre o quão horrível foi (você pode verificar o histórico do post, se quiser ver o que escrevi antes). inspirado para torná-lo melhor (também conhecido como: reescrever a maior parte do zero) e conseguiu jogar mais de cem bytes nele. Ainda mais do que a resposta do Python, mas estou muito mais feliz com o resultado.
Cerca de 20 bytes foram salvos ao passar da tentativa de executar padrões regex para afetar partes específicas da estrutura de vírgulas e usar o
-aF,
sinalizador para dividir automaticamente uma linha de entrada em vírgulas e salvá-la$F
, permitindo que eu modifique alguns elementos antes de costurá-los novamente e finalmente modificando a variável de saída com os últimossub
/gsub
comandos.Honestamente, o número de substituições regex feitas aqui significa que a maior parte disso pode ser um programa Retina, mas não conheço o Retina suficientemente bem para isso.
Experimente online!
fonte