Você pode lidar com o pub?

23

fundo

É fim de tarde de sexta-feira e você e seus amigos decidem ir ao pub mais tarde naquela noite, mas antes de ir ao pub, você deve tomar algumas bebidas. No entanto, as coisas aumentam rapidamente; seu amigo Shaddock Pamplemousse ganhou na loteria no início desta semana e decidiu trazer caixas e caixas com diferentes bebidas. A segurança no pub é muito rigorosa e, se você consumir demais antes de tentar entrar nas instalações, não poderá entrar. Vocês são todos programadores - portanto, você acha que as coisas vão ficar ótimas de qualquer maneira.

Desafio

Você precisa programar um medidor de álcool que produza verdade / falsidade se você estiver acima / abaixo do limite razoável de publicação. Antes de ir ao pub, insira a quantidade e o tipo de bebida que consumiu durante a noite em stdinque o seu programa de medição lê. Se o resultado for verdadeiro, você estará acima do limite do pub e ficará em casa. Se isso der falso, você estará pronto.

Entrada

Um número inteiro maior que o 0que representa o seu peso corporal em quilogramas seguido por uma nova linha. Essa entrada é seguida por uma série de quantidades e bebidas de um dígito no seguinte formulário:

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

Para uma garrafa de cerveja, será semelhante a:

1Bob

Cada entrada é separada por um espaço.

Especificação de entrada

Cada bebida possui uma unidade que corresponde ao impacto causado por ela. Se você consumir mais unidades do que seu peso dividido por dois, o pub não será mais uma opção.

(Isso pode ou não refletir a realidade)

A seguir, bebidas válidas e as unidades alcoólicas correspondentes da bebida:

  • Cerveja: b, 1unidade

  • Bebida energética: e, 0unidades

  • Molho quente: h, 2unidades (material forte)

  • De sumo (feita das frutas orgânicos etc): j, 0unidades

  • Rum: r, 6unidades

  • Tequila: t, 7unidades

  • Vodka: v, 6unidades

  • Vinho: w, 3unidades

Existem diferentes tipos de quantia:

  • Garrafa: B

  • Caixa: C

  • Vidro: G

  • Barril: K

  • Trago: S

Cada tipo de quantidade possui um multiplicador que multiplica as unidades alcoólicas da bebida nele contida:

  • Garrafa: 3

  • Caixa: 25

  • Vidro: 2

  • Barril: 50

  • Trago: 0.2

Saída

Seu programa produzirá verdade / falsidade para stdoutse a quantidade consumida for acima / abaixo do seu peso corporal dividido por 2. Se a quantidade consumida for igual ao seu peso dividido por 2, você deverá gerar falsidade.

Amostras de entrada e saída possíveis

Entrada

70
1Bob 3Soj

Saída

False

Entrada

2
1Cov

Saída

1

Entrada

50
1Cob

Saída

0

Entrada

100
4Gow 1Koe 1Bov 1Gow 2Sot

Saída

True

O programa mais curto em bytes vence!

sweerpotato
fonte
1
1. Parece que oé um caractere de formato, embora você não tenha dito isso especificamente. Você deve esclarecer isso (como otambém se refere ao azeite.) 2. O que produzimos se estivermos exatamente no limite? ou isso não importa?
Level River St
1
Boa decisão; Eu senti muita falta disso. Estou removendo o azeite (quem bebe assim?) Abaixo ou igual ao limite deve resultar falso. Vou acrescentar isso.
Sweerpotato 12/11/2015
1
Haverá mais de um dígito de bebida? Por exemplo 43Gow?
Morgan Thrapp
6
+1 em uma boa pergunta, mas é sexta-feira à tarde e preciso tomar uma cerveja. Talvez segunda-feira :)
MickyT
1
Eu pretendia que fosse realmente qualquer quantia - exceto quantias negativas. Não achei que isso fosse ambíguo. Sei que, se eu mudar isso, a resposta será invalidada, e não é assim que fazemos as coisas. O valor será esclarecido como um dígito.
Sweerpotato

Respostas:

4

CJam, 53 bytes

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

Experimente online no intérprete CJam .

Como 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
fonte
8

Python 3, 131

Agora estamos jogando golfe com cobras!

Economizou 18 bytes graças a shebang.
Economizou mais 4 bytes graças ao DSM.
Economizou muitos bytes graças a tzaman.

Muito obrigado a tzaman por seu brilhante truque de abusar do .find()retorno, -1se não encontrar um valor.

Atualmente, isso pressupõe que esse formato de bebida seja exatamente da maneira que foi declarado no desafio, por exemplo, apenas 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
fonte
Eu acho que pode ser bom se você soltar os ditados e fizer tudo na declaração impressa. Portanto, remova me substitua o m[p[-1]]bit por [3,25,2,50,.2]['BCGKS'.find(p[-1])]e o mesmo por d. Desci para 168 com essas alterações no seu código.
Kade
4

Minkolang 0.11 , 59 bytes

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

Experimente aqui.

Explicação

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
fonte
Eu acho que CJam está ficando ultrapassada ... Eu preciso terminar minha língua, então
anOKsquirrel
@anOKsquirrel: Ou melhor, você simplesmente não jogou o suficiente. :)
El'endia Starman
Ou melhor, ambos. : P
anOKsquirrel
Não, na verdade, eu sou apenas ruim: p
anOKsquirrel 12/11/2015
3

CJam, 54 bytes

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

Um pouco complicado e provavelmente abaixo do ideal, mas acho que isso funciona bem. Experimente online .

Explicação

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

Observe que a matriz numérica possui 2 no final, o que significa que Gho, que está faltando na primeira cadeia, é mapeado para 2.

Sp3000
fonte
2

CJam, 77

qN%~S%{:BW="behjrtvw"\#10206773s:~\=[3 25 2 50 .2]"BCGKS"B-3=#=*1mO}%:+\~2/\>
anOKsquirrel
fonte
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 um :pouco do que o Newline não o torna mais curto, mas parece mais divertido!

Formato legível

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

Claro que isso pode ser jogado. minha String Manipulation with Mid(Right())parece excessivamente prolixo, mas a execução do array o StrReversetorna mais longo. Se assumirmos que você bebe apenas de 0 a 9 de qualquer bebida em particular por vez, podemos salvar um punhado de bytes

Aceite a entrada como uma sequência com o peso separado por um espaço, pois a VBAdose não suporta entrada de várias linhas

JimmyJazzx
fonte
2

Ruby, 153 bytes

Eu preciso me livrar dos gsubs de alguma forma

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
fonte
2

JavaScript, 131 134 139 bytes

Este é um programa completo e basicamente uma adaptação da minha resposta 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)

Ele lê dois valores usando prompte alerté o resultado como [true|false].


Edições

  • Economizou 5 bytes usando uma expressão lógica em ||0vez de declarar as bebidas com 0unidades. Graças ao user81655 .
  • Economizou 3 bytes armazenando promptem uma variável e diminuindo a inicialização. Graças a Stefnotch .
insertusernamehere
fonte
1
Você pode salvar 6 bytes mudando ,e:0,j:0}[b[++i]]para }[b[++i]]|0.
user81655
Ontem eu estava pensando em como me livrar desses 0valores. Bem, eu não pensei nisso. Teve que usar em ||vez do operador bit a bit. Ainda 5 bytes a menos. Obrigado.
insertusernamehere
Sem problemas. Esqueci os possíveis valores não inteiros.
user81655
1
for(s=i=0,a=prompt(),b=prompt();pode ser alterado para:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch
1
@ Stefnotch Isso é inteligente. Eu gosto disso. Obrigado por salvar 3 bytes.
insertusernamehere
1

festa (+ 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
user2064000
fonte
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)}

Como o Javascript requer que uma biblioteca acesse STDIN, esse código é apenas uma função que aceita a totalidade da entrada, ou seja, b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")

Wasmoo
fonte
1
Como uma nota: prompt()é geralmente aceita como uma alternativa válida para STDINem JavaScript .
insertusernamehere
1
Você poderia salvar 30 bytes , indo ES6 e usar a seta-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
fonte
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;

Saídas 1ou nada, funciona para todos os casos de teste.


Ainda me pergunto o que é esse molho picante , com 2 unidades .


Edições

  • Economizou 6 bytes mesclando as duas matrizes para bebidas e multiplicador e removendo 0de 0.2.
insertusernamehere
fonte
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<.

Experimente online!

Sinto como se uma resposta em barril nunca tivesse sido mais apropriada! Provavelmente isso poderia ser jogado, mas acho que não.

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
fonte