¿Puedes manejar el pub?

23

Fondo

Es tarde el viernes por la tarde y tú y tus amigos deciden ir al pub más tarde esa noche, pero antes de ir al pub piensas que debes tomar algunas bebidas. Sin embargo, las cosas se intensifican rápidamente; su amigo Shaddock Pamplemousse ganó la lotería a principios de esta semana y decidió traer cajas con cajas con diferentes bebidas. La seguridad en el pub es muy estricta, y si consume en exceso antes de intentar ingresar a las instalaciones, no se le permite entrar. Sin embargo, todos ustedes son programadores, por lo que creen que las cosas saldrán bien de todos modos.

Reto

Debe programar un medidor de alcohol que produzca verdadero / falso si está por encima / por debajo del límite razonable de pub. Antes de ir al pub, ingrese la cantidad y el tipo de bebida que ha consumido durante la noche parastdin que se lee su programa de medición. Si da salida a la verdad, estás por encima del límite del pub y te quedas en casa. Si sale falso, estás listo para irte.

Entrada

Un número entero mayor que el 0que representa su peso corporal en kilogramos seguido de una nueva línea. A esta entrada le sigue una serie de cantidades y bebidas de un dígito en el siguiente formulario:

<amount><amount type>o<beverage type>

Para una botella de cerveza esto se verá así:

1Bob

Cada entrada está separada por un espacio.

Especificación de entrada

Cada bebida tiene una unidad que corresponde al impacto causado por ella. Si consume más unidades que su peso dividido por dos, el pub ya no es una opción.

(Esto puede o no reflejar la realidad)

Las siguientes son bebidas válidas y las unidades alcohólicas correspondientes de la bebida:

  • Cerveza: b, 1unidad

  • Bebida energética: e, 0unidades

  • Salsa picante: h, 2unidades (material fuerte)

  • Juice (hecha de frutas orgánicos, etc): j, 0unidades

  • Ron: r, 6unidades

  • Tequila: t, 7unidades

  • Vodka: v, 6unidades

  • Vino: w, 3unidades

Hay diferentes tipos de cantidad:

  • Botella: B

  • Caja: C

  • Vaso: G

  • Barrilete: K

  • Sorbo: S

Cada tipo de cantidad tiene un multiplicador que multiplica las unidades alcohólicas de la bebida que contiene:

  • Botella: 3

  • Caja: 25

  • Vaso: 2

  • Barrilete: 50

  • Sorbo: 0.2

Salida

Su programa presentará a la salida Truthy / Falsy a stdoutsi la cantidad consumida es encima / debajo de su peso corporal dividido por 2. Si la cantidad consumida es igual a su peso dividido por 2, usted debe Falsy salida.

Muestras de posibles entradas y salidas.

Entrada

70
1Bob 3Soj

Salida

False

Entrada

2
1Cov

Salida

1

Entrada

50
1Cob

Salida

0

Entrada

100
4Gow 1Koe 1Bov 1Gow 2Sot

Salida

True

¡El programa más corto en bytes gana!

patata dulce
fuente
1
1. Parece que oes un carácter de formato, aunque no lo haya dicho específicamente. Debe aclarar esto (como otambién se refiere al aceite de oliva). 2. ¿Qué producimos si estamos exactamente en el límite? o no importa
Level River St el
1
Buena llamada; Lo extrañé por completo. Estoy eliminando el aceite de oliva (¿quién bebe eso de todos modos?) Por debajo o igual al límite debería producir falsas. Agregaré eso.
Sweerpotato
1
¿Habrá alguna vez más de un dígito de bebida? Por ejemplo, 43Gow?
Morgan Thrapp
66
+1 buena pregunta, pero es viernes por la tarde y tengo que salir a tomar una cerveza. Tal vez el lunes :)
MickyT
1
Tenía la intención de que fuera cualquier cantidad realmente, excepto las cantidades negativas. No pensé que fuera tan ambiguo. Me doy cuenta de que si cambio esto invalidará su respuesta, y no es así como hacemos las cosas. La cantidad se aclarará como un dígito.
Sweerpotato

Respuestas:

4

CJam, 53 bytes

6:B50:C2*:K4:G.4:S];q"behjrtvwo ""10206763*"er~*]:-U<

Pruébelo en línea en el intérprete de CJam .

Cómo funciona

6:B          e# Push 6 and save it in B.
50:C         e# Push 50 and save it in C.
2*:K         e# Multiply by 2 to push 100 and save it in K.
4:G          e# Push 4 and save it in G.
.4:S         e# Push 0.4 and save it in S.
             e#
             e# The letters representing the types will now push its doubled
             e# (to avoid diving the weight by 2) associated multiplier.
];           e# Clear the stack.
q            e# Read all input.
"behjrtvwo " e# Push the string of beverages, concatenated with "o ".
"10206763*"  e# Push the string of associated units of alcohol and '*'.
er           e# Transliterate. This replaces each beverage letter with the
             e# associated units of alcohol, and each 'o' and ' ' with '*'.
             e#
             e# For example, the input
             e# 70
             e# 1Bob 3Soj
             e# is transformed into
             e# 70
             e# 1B*1*3S*0
             e#
~            e# Evaluate the resulting string.
             e#
             e# For the example this does the following:
             e#   + Push 70.
             e#   + Push 1, push 6, multiply, push 1, multiply.
             e#   + Push 3, push 0.4, multiply, push 0.
             e#
*            e# Multiply the last two (for the lack of a trailing space).
]            e# Collect all results in an array.
:-           e# Reduce by subtraction; subtract all other elements from the
             e# first element (body weight).
U<           e# Compare the result with 0.
Dennis
fuente
8

Pitón 3, 131

¡Ahora estamos jugando al golf con serpientes!

Guardado 18 bytes gracias a shebang.
Guardado 4 bytes más gracias a DSM.
Ahorré muchos bytes gracias a tzaman.

Muchas gracias a tzaman por su brillante truco de abusar de .find()regresar -1si no encuentra un valor.

Actualmente, esto supone que este formato de bebida es exactamente la forma en que se indica en el desafío, por ejemplo, solo 1 dígito de cada bebida.

w=input()
print(sum([6,50,4,100,.4]['BCGKS'.find(b)]*int(a)*int('1267730'['bhrtvw'.find(v)])for a,b,_,v in input().split())>int(w))
Morgan Thrapp
fuente
Creo que puede ser bueno si eliminaste los dictados e hiciste todo en la declaración impresa. Entonces, quite my reemplace el m[p[-1]]bit con [3,25,2,50,.2]['BCGKS'.find(p[-1])], y lo mismo con d. Llegué a 168 con esos cambios en su código.
Kade
4

Minkolang 0.11 , 59 bytes

126763355*25l*2l$:"SKGCBwvtrhb"m(0pI)n(no0qoxo0q**2*-$I)`N.

Pruébalo aquí

Explicación

126763355*25l*2l$:    Pushes the values of the characters
"SKGCBwvtrhb"         Pushes the characters themselves
m                     Merge; interleaves the first and second halves of the stack
(                     Open while loop
 0p                   Put character's value in character's place in the codebox
   I)                 Close while loop when stack is empty
n                     Read in integer (weight)
(                     Open while loop
 n                    Read in integer, ignoring any non-numeric characters
  o0q                 Read in character and get its value from the codebox
     ox               Read in character and dump it
       o0q            Read in character and get its value from the codebox
          **          Multiply the three numbers together
            2*-       Multiply by 2 and subtract from weight
               $I)    Close while loop when input is empty
`                     1 if less than 0, 0 otherwise
 N.                   Output as integer and stop.
El'endia Starman
fuente
Supongo que CJam se está quedando obsoleto ... Necesito terminar mi idioma entonces
anOKsquirrel
@anOKsquirrel: O más bien, simplemente no lo has jugado lo suficiente. :)
El'endia Starman
O más bien, ambos. : P
anOKsquirrel
No, en realidad solo soy malo: p
anOKsquirrel
3

CJam, 54 bytes

ldlS/{A,s"CbretjvwSBK"+f#A,[25X6T7T6Z.2Z50Y]+f=:*-}/0<

Poco complicado y probablemente subóptimo, pero creo que esto funciona bien. Pruébalo en línea .

Explicación

ld             Read first line, convert to double
lS/            Read second line, split by space
{...}/         For each item in the second line...
  A,s"..."+f#    Get index in "0123456789CbretjvwSBK", or -1 if not found
  A,[...]+f=     Index into [0 1 2 3 4 5 6 7 8 9 25 1 6 0 7 0 6 3 0.2 3 50 2]
  :*             Take product
  -              Subtract from weight
0<             Check if < 0

Tenga en cuenta que la matriz numérica tiene 2 al final, lo que significa que Gho, que faltan en la primera cadena, se asignan a 2.

Sp3000
fuente
2

CJam, 77

qN%~S%{:BW="behjrtvw"\#10206773s:~\=[3 25 2 50 .2]"BCGKS"B-3=#=*1mO}%:+\~2/\>
anOKsquirrel
fuente
2

VBA, 251 bytes

Function k(x) As Boolean:q=Split(x):g="b1e0h2j0r6t7v6w3":h="B03C25G02K50S.2":For i=1 To UBound(q):j=j+Left(q(i),Len(q(i))-3)*Mid(h,InStr(h,Mid(Right(q(i),3),1,1))+1,2)*Mid(g,InStr(g,Mid(Right(q(i),3),3,1))+1,1):Next i:If q(0)/2<j Then k=1
End Function

Usar en :lugar de Newline no lo hace más corto, ¡pero se ve más golfoso!

Formato legible

Function b(x) As Boolean
q = Split(x)
g = "b1e0h2j0r6t7v6w3"
h = "B03C25G02K50S.2"
For i = 1 To UBound(q)
j = j + Left(q(i), Len(q(i)) - 3) * _          'Left most digits would be the Quantity
Mid(h, InStr(h, Mid(Right(q(i), 3), 1, 1)) + 1, 2) * _  'Find the Container value in h
Mid(g, InStr(g, Mid(Right(q(i), 3), 3, 1)) + 1, 1)      'Find the Drink value in g
Next i
If q(0) / 2 < j Then b = 1 'Checks if Drunk or not
End Function

Bastante seguro de que esto se puede jugar al golf. mi manipulación de cadenas Mid(Right())parece excesivamente prolija, pero ejecutar la matriz aunqueStrReverse hace más largo. Si suponemos que solo bebe 0-9 de una bebida en particular a la vez, podemos guardar un puñado de bytes

Tome la entrada como una cadena con peso separado por un espacio ya que la VBAdosis no admite entrada de varias líneas

JimmyJazzx
fuente
2

Ruby, 153 bytes

Necesito deshacerme de los gsubs de alguna manera

w=gets.to_i;$><<(eval(gets.chars{|c|c[/[0-9]/]!=p ? ($_[c]+='*'):0}.tr('behjrtvwo BG','10206763*+32').gsub('C','25').gsub('K','50').gsub('S','0.2'))>w/2)
Peter Lenkefi
fuente
2

JavaScript, 131 134 139 bytes

Este es un programa completo y básicamente una adaptación de mi respuesta PHP :

for(c=prompt,b=c(a=c(s=i=0));b[i];i+=2)s+=b[i++]*{B:3,C:25,G:2,K:50,S:.2}[b[i++]]*{b:1,h:2,r:6,t:7,v:6,w:3}[b[++i]]||0;alert(s>a/2)

Lee dos valores usando prompty alerts el resultado como [true|false].


Ediciones

  • Ahorró 5 bytes usando una expresión lógica en ||0lugar de declarar las bebidas con 0unidades. Gracias a user81655 .
  • Se guardaron 3 bytes almacenando prompten una variable y acortando la inicialización. Gracias a Stefnotch .
insertusernamehere
fuente
1
Puede guardar 6 bytes cambiando ,e:0,j:0}[b[++i]]a }[b[++i]]|0.
user81655
@ user81655 Ayer estaba pensando cómo deshacerme de esos 0valores. Bueno, no pensé en eso. Tuve que usar en ||lugar del operador bit a bit. Todavía 5 bytes menos. Gracias.
insertusernamehere
No hay problema. Olvidé los posibles valores no enteros.
user81655
1
for(s=i=0,a=prompt(),b=prompt();se puede cambiar a:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch
1
@Stefnotch Eso es inteligente. Me gusta. Gracias por guardar 3 bytes.
insertusernamehere
1

bash (+ bc + GNU SED), 200 196 194 bytes

read x
read y
y="$(sed 's/^/((/;s/$/))/;s/ /)+(/g;s/o/*/g;s/b/1/g;s/[ej]/0/g;s/h/2/g;s/[rv]/6/g;s/w/3/g;s/t/7/g;s/B/*3/g;s/C/*25/g;s/G/*2/g;s/K/*50/g;s/S/*0.2/g'<<<"$y")"
echo "$y>$x/2"|bc -l
usuario2064000
fuente
1

Javascript, 159 bytes

function b(t){return a={B:3,C:25,G:2,K:50,S:.2,b:1,h:2,w:3,r:6,v:6,t:7},t.split(/\W/).reduceRight(function(t,n,r){return r?n[0]*a[n[1]]*a[n[3]]+t||t:t>n/2},0)}

Dado que Javascript requiere una biblioteca para acceder a STDIN, este código es solo una función que acepta la totalidad de la entrada, es decir b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")

Wasmoo
fuente
1
Como nota: prompt()se acepta generalmente como una alternativa válida a STDINen JavaScript .
insertusernamehere
1
Se podría ahorrar 30 bytes por ir ES6 y el uso de la flecha-operador: b=t=>(a={B:3,C:25,G:2,K:50,S:.2,b:1,h:2,w:3,r:6,v:6,t:7},t.split(/\W/).reduceRight((t,n,r)=>r?n[0]*a[n[1]]*a[n[3]]+t||t:t>n/2,0)).
insertusernamehere
1

Python 3, 157 bytes

n,l,d,u=int(input()),input(),"behjrtvwBCGKS",[1,0,2,0,6,7,6,3,3,25,2,50,.2]
print(sum(map(lambda x:int(x[0])*u[d.find(x[1])]*u[d.find(x[3])],l.split()))>n/2)
uno20001
fuente
1

PHP, 163 169 bytes

for($a=fgets(STDIN),$b=fgets(STDIN),$v=[b=>1,h=>2,r=>6,t=>7,v=>6,w=>3,B=>3,C=>25,G=>2,K=>50,S=>.2];$b[$i];$i+=2)$s+=$b[$i++]*$v[$b[$i++]]*$v[$b[++$i]];echo$s>$a/2;

Salidas 1o nada, funciona para todos los casos de prueba.


Todavía me pregunto qué es esta salsa picante , que tiene 2 unidades .


Ediciones

  • Guardado 6 bytes mediante la fusión de las dos matrices de bebidas y multiplicador y mediante la eliminación 0de 0.2.
insertusernamehere
fuente
1

Barril , 165 bytes (SBCS)

¿®w?(: =[_]")0®u(!4/|\0-&:B=[&3*&|:C=[&55**&|:G=[&2*&|:K=[&\2*&|&15/*&]]]]__:b=[&1*&|:e=[&0&|:h=[&2*&|:j=[&0&|:r=[&6*&|:t=[&7*&|:v=[&6*&|&3*&]]]]]]]_©u&+®u)©w2/:©u<.

Pruébalo en línea!

¡Siento como si una respuesta de Keg nunca hubiera sido más apropiada! Esto probablemente podría jugarse golf, pero no creo que pueda.

Explicado

¿®w                                                                         #Take the weight and store it in a variable
?(: =[_]")                                                                  #Take the second line and remove spaces
0®u                                                                         #Store the units in a variable
(!4/|                                                                       #For every part in the input
\0-&                                                                        #Store the amount of drink in the register
:B=[&3*&|:C=[&55**&|:G=[&2*&|:K=[&\2*&|&15/*&]]]]__                         #Determine the beverage multiplier
:b=[&1*&|:e=[&0&|:h=[&2*&|:j=[&0&|:r=[&6*&|:t=[&7*&|:v=[&6*&|&3*&]]]]]]]_   #Determine the drink
©u&+®u)                                                                     #Add the amount to units
©w2/:©u<.                                                                   #Check the condition and print
Jono 2906
fuente