Es fin de semana y ¿qué hacen los chicos geniales los fines de semana? Beber por supuesto! ¿Pero sabes lo que no es tan genial? Beber y conducir. Por lo tanto, decide escribir un programa que le diga qué tan cargado está y cuándo podrá conducir nuevamente sin que la policía lo detenga y pierda su licencia.
El reto
Dada una lista de bebidas que disfrutó esta noche, calcule su nivel de alcohol en sangre y el tiempo que tiene que esperar hasta que pueda subir a su automóvil y llegar a casa.
Entrada
La entrada será una lista de bebidas que tomaste esta noche. Esto se verá así:
4 tiros de alcohol 1 copas de vino 2 botellas de cerveza 3 vasos de agua
Los contenedores siempre serán plurales.
Como puede ver cada entrada consta de:
- El tipo de bebida (alcohol, vino, cerveza, agua).
- El recipiente para la bebida (tragos, vasos, botellas).
- La cantidad x de las bebidas que tomaste de ese tipo como entero con x> 0,
Cada tipo de bebida agrega una cierta cantidad de alcohol a la sangre:
alcohol -> 0.5 ‰ / 100 ml cerveza -> 0.1 ‰ / 100 ml vino -> 0.2 ‰ / 100 ml agua -> -0.1 ‰ / 100 ml
El agua es la excepción aquí, ya que diluye la sangre y disminuye el nivel de alcohol (sería muy bueno si eso realmente funcionara ...).
Cada contenedor tiene un cierto volumen:
disparos -> 20 ml vasos -> 200 ml botellas -> 500 ml
Salida
Tienes que generar dos números:
- El nivel de alcohol en ‰
- El tiempo en horas que tiene que esperar hasta llegar a 0.5 ‰ o menos, para que pueda conducir nuevamente. Pierdes 0.1 ‰ por hora.
Notas
- El nivel de alcohol nunca puede caer por debajo de cero.
- Lo mismo vale para el tiempo de espera. Si tiene 0.5 ‰ o menos, salida cero.
- El orden de las bebidas no importa, por lo que el agua potable puede reducir el nivel de alcohol por debajo de cero en el proceso del cálculo. Si permanece allí, debe reemplazarlo con cero.
El nivel de alcohol para el ejemplo anterior se calcularía así:
4 tiros de alcohol -> 0.4 ‰ 1 copas de vino -> 0.4 ‰ 2 botellas de cerveza -> 1.0 ‰ 3 vasos de agua -> -0.6 ‰ => 0.4 + 0.4 + 1 - 0.6 = 1.2 ‰
Para alcanzar 0.5 ‰ necesitas perder 0.7 ‰. Pierdes 0.1 ‰ por hora, por lo que debes esperar 7 horas para volver a conducir.
Reglas
- Puede tomar la entrada en cualquier formato que desee, pero debe usar las cadenas exactas como se indicó anteriormente. Puedes tomar los números como enteros.
- Puede generar los dos números en cualquier orden, solo deje claro cuál usa en su respuesta.
- Puede suponer que la entrada siempre tendrá al menos una entrada.
- Función o programa completo permitido.
- Reglas predeterminadas para entrada / salida.
- Se aplican lagunas estándar .
- Este es el código de golf , por lo que gana el conteo de bytes más bajo. Tiebreaker es una presentación anterior.
Casos de prueba
Entrada como lista de cadenas. Primero muestra el nivel de alcohol, valores separados por una coma.
["4 tragos de alcohol", "1 vaso de vino", "2 botellas de cerveza", "3 vasos de agua"] -> 1.2, 7 ["10 tiros de alcohol", "1 botella de agua"] -> 0.5, 0 ["3 copas de vino", "2 botellas de alcohol"] -> 6.2, 57 ["6 disparos de cerveza", "3 vasos de agua"] -> 0, 0 ["10 vasos de cerveza"] -> 2.0, 15
¡Feliz codificación!
fuente
function drive(a) { if (a.every(v=>/water/.test(v))) return [0, 0]; throw new TeetotalException; }
Respuestas:
Javascript (ES6), 109
Toma datos como matrices de matrices de cadenas / enteros, p. Ej.
Salidas a una matriz simple, p. Ej.
[1.2, 7]
Explicado
fuente
[[3,"shots", "booze"]]
TSQL,
301,299,219, 206 bytesLa entrada va a la tabla temporal
#I
(dijiste cualquier formato :)Código:
Gracias por las ideas para mejorarlo, Micky T :)
fuente
IIF
función en lugar deCASE
declaraciones para algunos bytesJOIN(SELECT .. )A(Y,S)ON Y=N
y(L+ABS(L))/2,10*((L-.5+ABS(L-.5))/2)
es más corto que la función IIF mencionada anteriormente. También puede ahorrar un poco si considera hacer una unión cruzada en los valores de tamaño y fuerza. por ejemploSELECT V,N,Q*S FROM(VALUES(...))A(N,S),(VALUES(...)B(V,Q)
JavaScript (ES6), 131
Menos golf
fuente
Perl,
133119 + 3 =136122 bytesPara ser ejecutado con
perl -p
. Toma entrada orientada a línea en STDIN, produce salida en STDOUT.Versión menos golfizada:
Gracias a dev-null por las sugerencias que ahorraron 11 bytes.
fuente
\d
a.