É fim de semana e o que os caras legais estão fazendo nos finais de semana? Bebendo, é claro! Mas você sabe o que não é tão legal? Beber e dirigir. Então, você decide escrever um programa que diz a você como está carregado e quando poderá dirigir novamente sem ser detido pela polícia e perder sua licença.
O desafio
Dada uma lista de bebidas que você apreciou esta noite, calcule o seu nível de álcool no sangue e o tempo que você precisa esperar até entrar no seu carro e chegar em casa.
Entrada
Entrada será uma lista de bebidas que você tomou esta noite. Isso ficará assim:
4 tiros bebida 1 taça de vinho 2 garrafas de cerveja 3 copos de água
Os contêineres sempre serão plurais.
Como você pode ver, cada entrada consiste em:
- O tipo de bebida (bebida, vinho, cerveja, água)
- O recipiente para a bebida (doses, copos, garrafas)
- A quantidade x das bebidas que você tomou desse tipo como número inteiro com x> 0,
Cada tipo de bebida adiciona uma certa quantidade de álcool ao seu sangue:
bebida -> 0,5 0.5 / 100 ml cerveja -> 0,1 ‰ / 100 ml vinho -> 0,2 ‰ / 100 ml água -> -0,1 ‰ / 100 ml
A água é a exceção aqui, pois diminui o sangue e diminui o nível de álcool (seria muito bom se isso realmente funcionasse ...).
Cada contêiner possui um certo volume:
doses -> 20 ml copos -> 200 ml garrafas -> 500 ml
Resultado
Você precisa gerar dois números:
- O nível de álcool em ‰
- O tempo em horas em que você deve esperar até atingir 0,5 ‰ ou menos, para poder dirigir novamente. Você perde 0,1 ‰ por hora.
Notas
- O nível de álcool nunca pode cair abaixo de zero.
- O mesmo vale para o tempo de espera. Se você tiver 0,5 ‰ ou menos, produza zero.
- A ordem das bebidas não importa; portanto, a água potável pode diminuir o nível de álcool abaixo de zero no processo de cálculo. Se ele permanecer lá, você precisará substituí-lo por zero.
O nível de álcool para o exemplo acima seria calculado da seguinte forma:
4 doses de bebida -> 0,4 ‰ 1 taça de vinho -> 0,4 ‰ 2 garrafas de cerveja -> 1,0 ‰ 3 copos de água -> -0,6 ‰ => 0,4 + 0,4 + 1 - 0,6 = 1,2 ‰
Para atingir 0,5 ‰, você precisa perder 0,7 ‰. Você perde 0,1 ‰ por hora, e precisa esperar 7 horas para dirigir novamente.
Regras
- Você pode pegar a entrada no formato que quiser, mas precisa usar as strings exatas, conforme indicado acima. Você pode pegar os números como números inteiros.
- Você pode produzir os dois números em qualquer ordem, apenas deixe claro qual deles você usa na sua resposta.
- Você pode assumir que a entrada sempre terá pelo menos uma entrada.
- Função ou programa completo permitido.
- Regras padrão para entrada / saída.
- Brechas padrão se aplicam.
- Isso é código-golfe , e a menor contagem de bytes vence. O desempate é uma submissão anterior.
Casos de teste
Entrada como lista de strings. Emite primeiro o nível de álcool, valores separados por vírgula.
["4 doses de bebida", "1 copo de vinho", "2 garrafas de cerveja", "3 copos de água"] -> 1,2, 7 ["10 doses de bebida", "1 garrafa de água"] -> 0,5, 0 ["3 copos de vinho", "2 garrafas de bebida"] -> 6,2, 57 ["6 shots beer", "3 glasses water"] -> 0, 0 ["10 copos de cerveja"] -> 2,0, 15
Feliz codificação!
fonte
function drive(a) { if (a.every(v=>/water/.test(v))) return [0, 0]; throw new TeetotalException; }
Respostas:
Javascript (ES6), 109
Recebe entrada como matrizes de matrizes de strings / inteiros, por exemplo
Saídas para um array simples, por exemplo
[1.2, 7]
Explicado
fonte
[[3,"shots", "booze"]]
TSQL,
301,299,219, 206 bytesA entrada entra na tabela temporária
#I
(você disse qualquer formato :)Código:
Obrigado pelas idéias para melhorá-lo, Micky T :)
fonte
IIF
função em vez deCASE
declarações para alguns bytesJOIN(SELECT .. )A(Y,S)ON Y=N
e(L+ABS(L))/2,10*((L-.5+ABS(L-.5))/2)
é menor que a função IIF mencionada anteriormente. Você também pode economizar um pouco se tentar fazer uma junção cruzada nos valores de tamanho e resistência. por exemploSELECT V,N,Q*S FROM(VALUES(...))A(N,S),(VALUES(...)B(V,Q)
JavaScript (ES6), 131
Menos golfe
fonte
Perl,
133119 + 3 =136122 bytesPara ser executado com
perl -p
. Pega entrada orientada a linha em STDIN, produz saída em STDOUT.Versão com menos golfe:
Obrigado a dev-null por sugestões de economia de 11 bytes.
fonte
\d
para.