Pouvez-vous gérer le pub?

23

Contexte

Il est tard vendredi après-midi et vous et vos amis décidez d'aller au pub plus tard dans la soirée, mais avant de vous rendre au pub, vous devriez prendre quelques boissons. Cependant, les choses dégénèrent rapidement; votre ami Shaddock Pamplemousse a remporté la loterie plus tôt cette semaine et a décidé d'apporter des caisses sur des caisses avec différentes boissons. La sécurité au pub est très stricte et si vous consommez trop avant d'essayer d'entrer dans les locaux, vous n'êtes pas autorisé à l'intérieur. Vous êtes tous des programmeurs, alors vous pensez que les choses vont bien se passer de toute façon.

Défi

Vous devez programmer un compteur d'alcool qui délivre la vérité / fausse si vous êtes au-dessus / en dessous de la limite de pub raisonnable. Avant de descendre au pub, vous entrez la quantité et le type de boisson que vous avez consommés au cours de la soirée à stdinlaquelle votre programme de mesure se lit. S'il sort vrai, vous êtes au-dessus de la limite de pub et restez à la maison. Si cela produit de la fausse, vous êtes prêt à partir.

Contribution

Un entier supérieur à celui 0qui représente votre poids corporel en kilogrammes suivi d'une nouvelle ligne. Cette entrée est suivie d'une série de montants et de boissons à un chiffre sur le formulaire suivant:

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

Pour une bouteille de bière, cela ressemblera à:

1Bob

Chaque entrée est séparée par un espace.

Spécification d'entrée

Chaque boisson a une unité qui correspond à l'impact causé par elle. Si vous consommez plus d'unités que votre poids divisé par deux, le pub n'est plus une option.

(Cela peut refléter ou non la réalité)

Les boissons suivantes sont valides et les unités alcooliques correspondantes de la boisson:

  • Bière: b, 1unité

  • Boisson énergisante: e, 0unités

  • Sauce chaude: h, 2unités (fortes choses)

  • Juice (en fruits organiques , etc.): j, 0unités

  • Chambres: r, 6unités

  • Tequila: t, 7unités

  • Vodka: v, 6unités

  • Vin: w, 3unités

Il existe différents types de montants:

  • Bouteille: B

  • Caisse: C

  • Verre: G

  • Tonnelet: K

  • Siroter: S

Chaque type de quantité a un multiplicateur qui multiplie les unités alcooliques de la boisson qu'il contient:

  • Bouteille: 3

  • Caisse: 25

  • Verre: 2

  • Tonnelet: 50

  • Siroter: 0.2

Sortie

Votre programme doit sortie truthy / falsy à stdoutsi la quantité consommée est au- dessus / en dessous de votre poids corporel divisé par 2. Si la quantité consommée est égale à votre poids divisé par 2, vous devriez falsy de sortie.

Échantillons d'entrée et de sortie possibles

Contribution

70
1Bob 3Soj

Sortie

False

Contribution

2
1Cov

Sortie

1

Contribution

50
1Cob

Sortie

0

Contribution

100
4Gow 1Koe 1Bov 1Gow 2Sot

Sortie

True

Le programme le plus court en octets gagne!

patate douce
la source
1
1. Il semble que le osoit un caractère de format, bien que vous ne l'ayez pas dit spécifiquement. Vous devriez clarifier cela (comme cela ose réfère également à l'huile d'olive.) 2. Que produisons-nous si nous sommes exactement à la limite? ou ça n'a pas d'importance?
Level River St
1
Bon appel; J'ai totalement raté ça. J'enlève l'huile d'olive (qui boit ça de toute façon?) En dessous ou égale à la limite devrait produire une fausse. Je vais ajouter ça.
sweerpotato
1
Y aura-t-il jamais plus d'un chiffre de boisson? Par exemple, 43Gow?
Morgan Thrapp du
6
+1 bonne question, mais c'est vendredi après-midi et je dois sortir prendre une bière. Peut-être lundi :)
MickyT
1
Je voulais que ce soit vraiment n'importe quel montant - à l'exception des montants négatifs. Je ne pensais pas que cela serait ambigu. Je réalise que si je change cela, cela invalidera votre réponse, et ce n'est pas ainsi que nous faisons les choses. Le montant sera précisé à un chiffre.
sweerpotato

Réponses:

4

CJam, 53 octets

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

Essayez-le en ligne dans l' interpréteur CJam .

Comment ça marche

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
la source
8

Python 3, 131

Nous jouons maintenant avec des serpents!

Enregistré 18 octets grâce à shebang.
Enregistré 4 octets supplémentaires grâce à DSM.
Beaucoup d'octets enregistrés grâce à tzaman.

Un grand merci à tzaman pour son astuce géniale d'abuser du .find()retour -1s'il ne trouve pas de valeur.

Actuellement, cela suppose que ce format de boisson est exactement la façon dont il est indiqué dans le défi, par exemple, seulement 1 chiffre de chaque boisson.

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
la source
Je pense que ce serait bien si vous laissiez tomber les pronostics et faisiez tout dans la déclaration imprimée. Donc, retirez met remplacez le m[p[-1]]bit avec [3,25,2,50,.2]['BCGKS'.find(p[-1])], et la même chose avec d. Je suis descendu à 168 avec ces modifications de votre code.
Kade
4

Minkolang 0,11 , 59 octets

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

Essayez-le ici.

Explication

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
la source
Je suppose que CJam devient obsolète ... Je dois finir ma langue alors
anOKsquirrel
@anOKsquirrel: Ou plutôt, vous ne l'avez pas assez joué au golf. :)
El'endia Starman
Ou plutôt les deux. : P
anOKsquirrel
Non, en fait, je suis juste mauvais: p
anOKsquirrel
3

CJam, 54 octets

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

Peu compliqué et probablement sous-optimal, mais je pense que cela fonctionne bien. Essayez-le en ligne .

Explication

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

Notez que le tableau numérique a 2 à la fin, ce qui signifie que Gho, qui manquent dans la première chaîne, sont mappés à 2.

Sp3000
la source
2

CJam, 77

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

VBA, 251 octets

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

Utiliser :plutôt que Newline ne le raccourcit pas, mais il semble plus golfique!

Format lisible

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

Bien sûr, cela peut être joué au golf. ma manipulation de chaînes Mid(Right())semble excessivement verbeuse, mais l'exécution du tableau la StrReverserend plus longue. Si nous supposons que vous ne buvez que 0 à 9 boissons à la fois, nous pouvons économiser une poignée d'octets

Prendre l'entrée comme une chaîne avec un poids séparé par un espace car la VBAdose ne prend pas en charge l'entrée multi-lignes

JimmyJazzx
la source
2

Rubis, 153 octets

Je dois me débarrasser des gsubs en quelque sorte

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
la source
2

JavaScript, 131 134 139 octets

Ceci est un programme complet et essentiellement une adaptation de ma réponse 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)

Il lit deux valeurs en utilisant promptet alerts le résultat comme [true|false].


Modifications

  • Enregistré 5 octets en utilisant une expression logique ||0au lieu de déclarer les boissons avec des 0unités. Merci à user81655 .
  • Sauvegardé 3 octets en stockant promptdans une variable et en raccourcissant l'initialisation. Merci à Stefnotch .
insertusernamehere
la source
1
Vous pouvez économiser 6 octets en changeant ,e:0,j:0}[b[++i]]pour }[b[++i]]|0.
user81655
@ user81655 Hier, je me demandais comment me débarrasser de ces 0valeurs. Eh bien, je n'y ai pas pensé. J'ai dû utiliser à la ||place de l'opérateur au niveau du bit. Encore 5 octets de moins. Merci.
insertusernamehere
Aucun problème. J'ai oublié les valeurs non entières possibles.
user81655
1
for(s=i=0,a=prompt(),b=prompt();peut être changé en:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch
1
@Stefnotch C'est intelligent. Je l'aime. Merci d'avoir économisé 3 octets.
insertusernamehere
1

bash (+ bc + GNU sed), 200 196 194 octets

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
la source
1

Javascript, 159 octets

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)}

Étant donné que Javascript nécessite une bibliothèque pour accéder à STDIN, ce code n'est qu'une fonction qui accepte l'intégralité de l'entrée, c'est-à-dire b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")

Wasmoo
la source
1
Comme une note: prompt()est généralement acceptée comme une alternative valable à STDINen JavaScript .
insertusernamehere
1
Vous pouvez économiser 30 octets en allant ES6 et en utilisant la flèche-opérateur: 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 octets

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
la source
1

PHP, 163 169 octets

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;

Sorties 1ou rien, fonctionne pour tous les cas de test.


Je me demande encore ce qu'est cette sauce piquante , ayant 2 unités .


Modifications

  • Économisé 6 octets en fusionnant les deux tableaux pour les boissons et le multiplicateur et en supprimant 0de 0.2.
insertusernamehere
la source
1

Tonnelet , 165 octets (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<.

Essayez-le en ligne!

J'ai l'impression qu'une réponse Keg n'a jamais été aussi appropriée! Cela pourrait probablement être joué au golf, mais je ne pense pas que ce soit possible.

Expliqué

¿®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
la source