Schaffst du es mit der Kneipe?


23

Hintergrund

Es ist später Freitagnachmittag, und Sie und Ihre Freunde beschließen, später am Abend in die Kneipe zu gehen, aber bevor Sie in die Kneipe gehen, sollten Sie ein paar Getränke zu sich nehmen. Die Dinge eskalieren jedoch schnell; Ihr Freund Shaddock Pamplemousse gewann Anfang dieser Woche die Lotterie und beschloss, Kisten mit verschiedenen Getränken über Kisten zu bringen. Die Sicherheit in der Kneipe ist sehr streng, und wenn Sie vor dem Betreten der Räumlichkeiten zu viel konsumieren, ist der Zutritt nicht gestattet. Sie sind aber alle Programmierer - Sie glauben also, dass die Dinge sich trotzdem als großartig herausstellen werden.

Herausforderung

Sie müssen einen Alkoholmesser programmieren, der Wahres / Falsches ausgibt, wenn Sie über / unter dem angemessenen Pub-Limit sind. Bevor Sie in die Kneipe gehen, geben Sie die Menge und die Getränkesorte ein, die Sie am Abend konsumiert haben und auf stdindie Ihr Messprogramm verweist. Wenn es wahrheitsgemäß ausgibt, sind Sie über der Kneipengrenze und bleiben zu Hause. Wenn es falsch ausgibt, können Sie loslegen.

Eingang

Eine ganze Zahl, die größer ist als 0Ihr Körpergewicht in Kilogramm, gefolgt von einem Zeilenumbruch. Dieser Eingabe folgt eine Reihe von einstelligen Mengen und Getränken in der folgenden Form:

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

Für eine Flasche Bier sieht das so aus:

1Bob

Jede Eingabe ist durch ein Leerzeichen getrennt.

Eingangsspezifikation

Jedes Getränk hat eine Einheit, die der von ihm verursachten Wirkung entspricht. Wenn Sie mehr Einheiten als Ihr durch zwei geteiltes Gewicht verbrauchen, ist die Kneipe keine Option mehr.

(Dies kann oder kann nicht die Realität widerspiegeln)

Folgendes sind gültige Getränke und die entsprechenden alkoholischen Einheiten des Getränks:

  • Bier: b, 1Einheit

  • Energy - Drink: e, 0Einheiten

  • Hot Sauce: h, 2Einheiten (starker Tobak)

  • Saft (aus Bio - Früchte usw.): j, 0Einheiten

  • Rum: r, 6Einheiten

  • Tequila: t, 7Einheiten

  • Wodka: v, 6Einheiten

  • Wein: w, 3Einheiten

Es gibt verschiedene Betragsarten:

  • Flasche: B

  • Kiste: C

  • Glas: G

  • Fass: K

  • Schluck: S

Jede Mengenart hat einen Multiplikator, der die alkoholischen Einheiten des darin enthaltenen Getränks multipliziert:

  • Flasche: 3

  • Kiste: 25

  • Glas: 2

  • Fass: 50

  • Schluck: 0.2

Ausgabe

Ihr Programm gibt " wahr" / "falsch" aus , stdoutwenn die konsumierte Menge über / unter Ihrem Körpergewicht geteilt durch 2 liegt. Wenn die konsumierte Menge gleich Ihrem Gewicht geteilt durch 2 ist, sollten Sie "falsch" ausgeben.

Beispiele für mögliche Ein- und Ausgaben

Eingang

70
1Bob 3Soj

Ausgabe

False

Eingang

2
1Cov

Ausgabe

1

Eingang

50
1Cob

Ausgabe

0

Eingang

100
4Gow 1Koe 1Bov 1Gow 2Sot

Ausgabe

True

Das kürzeste Programm in Bytes gewinnt!


1
1. Es scheint, dass dies oein Format-Zeichen ist, obwohl Sie es nicht ausdrücklich gesagt haben. Sie sollten dies klarstellen (dies gilt oauch für Olivenöl). 2. Was geben wir aus, wenn wir genau am Limit sind? oder spielt es keine rolle
Level River St

1
Guter Anruf; Das habe ich total vermisst. Ich entferne Olivenöl (wer trinkt das schon?) Unterhalb oder gleich dem Grenzwert sollte falsch ausgegeben werden. Ich werde das hinzufügen.
Sweerpotato

1
Wird es jemals mehr als eine Ziffer des Getränks geben? ZB 43Gow?
Morgan Thrapp

6
+1 gute Frage, aber es ist Freitagnachmittag und ich muss ein Bier trinken gehen. Vielleicht Montag :)
MickyT

1
Ich wollte, dass es wirklich eine beliebige Menge ist - mit Ausnahme negativer Mengen. Ich hätte nicht gedacht, dass das so vieldeutig ausfallen würde. Wenn ich das ändere, wird Ihre Antwort ungültig, und so machen wir es nicht. Der Betrag wird als eine Ziffer angegeben.
Sweerpotato

Antworten:


4

CJam, 53 Bytes

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

Probieren Sie es online im CJam-Interpreter aus .

Wie es funktioniert

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.

8

Python 3, 131

Jetzt golfen wir mit Schlangen!

Dank shebang 18 Bytes gespart.
4 weitere Bytes dank DSM gespart.
Dank tzaman konnten viele Bytes gespart werden.

Vielen Dank an tzaman für seinen brillanten Trick, die .find()Rückkehr zu missbrauchen , -1wenn sie keinen Wert findet.

Derzeit wird davon ausgegangen, dass dieses Getränkeformat genau so ist, wie es in der Herausforderung angegeben ist, z. B. nur eine Ziffer pro Getränk.

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

Ich denke, es kann gut sein, wenn Sie die Anweisungen fallen lassen und alles in der Druckanweisung tun. Entfernen Sie mdas m[p[-1]]Bit und ersetzen Sie es [3,25,2,50,.2]['BCGKS'.find(p[-1])]durch d. Mit diesen Änderungen an Ihrem Code bin ich auf 168 gekommen.
Kade

4

Minkolang 0,11 , 59 Bytes

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

Probieren Sie es hier aus.

Erläuterung

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.

Ich denke, CJam ist veraltet ... Ich muss meine Sprache dann beenden
anOKsquirrel

@anOKsquirrel: Oder besser gesagt, Sie haben einfach nicht genug Golf gespielt. :)
El'endia Starman

Oder vielmehr beides. : P
anOKsquirrel

Nein, eigentlich bin ich nur schlecht: p
anOKsquirrel

3

CJam, 54 Bytes

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

Etwas umständlich und wahrscheinlich suboptimal, aber ich denke, das funktioniert in Ordnung. Probieren Sie es online aus .

Erläuterung

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

Beachten Sie, dass das numerische Array am Ende 2 enthält, was bedeutet, dass Ghodie in der ersten Zeichenfolge fehlenden Zeichen 2 zugeordnet werden.


2

CJam, 77

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

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

Wenn Sie :stattdessen Newline verwenden, wird es nicht kürzer, aber es sieht golferischer aus!

Lesbares Format

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

Ziemlich sicher, das kann man Golf spielen. meine String Manipulation mitMid(Right()) scheint übermäßig wortreich zu sein, aber das Ausführen des Arrays StrReversemacht es länger. Wenn wir davon ausgehen, dass Sie jeweils nur 0-9 eines bestimmten Getränks trinken, können wir eine Handvoll Bytes sparen

Nehmen Sie die Eingabe als eine Zeichenfolge mit einem durch ein Leerzeichen getrennten Gewicht, da VBAMehrzeileneingaben nicht unterstützt werden


2

Rubin, 153 Bytes

Ich muss die gsubs irgendwie loswerden

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)

2

JavaScript, 131 134 139 Bytes

Dies ist ein vollständiges Programm und im Grunde eine Anpassung meiner PHP-Antwort :

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)

Es liest zwei Werte mit promptund alerts das Ergebnis als [true|false].


Bearbeitungen

  • 5 Byte durch Verwendung eines logischen Ausdrucks gespart,||0 anstatt die Getränke in 0Einheiten anzugeben. Vielen Dank an user81655 .
  • Gespeichert 3 Bytes durch Speicher promptin einer Variablen und die Initialisierung zu verkürzen. Danke an Stefnotch .

1
Sie könnten durch Änderung 6 Bytes speichern ,e:0,j:0}[b[++i]]zu }[b[++i]]|0.
user81655

@ user81655 Gestern habe ich mir überlegt, wie ich diese -Werte loswerden kann 0. Daran habe ich nicht gedacht. Musste ||anstelle des bitweisen Operators verwenden. Noch 5 Bytes weniger. Vielen Dank.
Insertusernamehere

Kein Problem. Ich habe die möglichen nicht ganzzahligen Werte vergessen.
User81655

1
for(s=i=0,a=prompt(),b=prompt();kann geändert werden zu:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch Das ist schlau. Ich mag das. Danke, dass du 3 Bytes gespart hast.
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

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

Da Javascript eine Bibliothek benötigt, um auf STDIN zuzugreifen, ist dieser Code nur eine Funktion, die die gesamte Eingabe akzeptiert, d. H b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Als Anmerkung: prompt()wird in der Regel als eine gültige Alternative zu akzeptiert STDINin JavaScript .
insertusernamehere

1
Sie könnten sparen 30 Byte , indem Sie ES6 und mit Hilfe der Pfeil-Operator: 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)

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;

Ausgänge 1oder nichts, funktioniert für alle Testfälle.


Ich frage mich immer noch, was diese scharfe Sauce mit 2 Einheiten ist .


Bearbeitungen

  • Gespeicherte 6 Bytes , indem die beiden Arrays für Getränke und verschmelzenden Multiplikators und durch Entfernen 0aus 0.2.

1

Fass , 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<.

Probieren Sie es online!

Ich habe das Gefühl, als wäre eine Keg-Antwort nie passender gewesen! Dies könnte wahrscheinlich Golf sein, aber ich denke nicht, dass es kann.

Erklärt

¿®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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.