Czy poradzisz sobie z pubem?

23

tło

Jest późne piątkowe popołudnie, a ty i twoi przyjaciele decydujecie się pójść do pubu później tego wieczoru, ale przed pójściem do pubu uważasz, że powinieneś wypić kilka napojów. Jednak sprawy szybko się nasilają; twój przyjaciel Shaddock Pamplemousse wygrał na loterii na początku tego tygodnia i postanowił przynieść skrzynki na skrzynki z różnymi napojami. Bezpieczeństwo w pubie jest bardzo surowe, a jeśli nadmiernie się zużyjesz przed próbą wejścia do lokalu, nie możesz wejść do środka. Wszyscy jesteście programistami - więc myślicie, że i tak wszystko się ułoży.

Wyzwanie

Musisz zaprogramować licznik alkoholu, który wyświetla prawda / fałsz, jeśli przekroczysz / osiągniesz rozsądny limit w pubie. Przed zejściem do pubu podajesz ilość i rodzaj napoju, które zjadłeś wieczorem, o stdinktórym czyta Twój program pomiarowy. Jeśli to prawda, jesteś powyżej limitu pubu i zostajesz w domu. Jeśli spowoduje to fałsz, możesz iść.

Wkład

Jedna liczba całkowita większa niż 0reprezentuje masę ciała w kilogramach, po której następuje nowa linia. Po tym wprowadzeniu następuje seria jednocyfrowych kwot i napojów w następującej formie:

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

W przypadku jednej butelki piwa będzie to wyglądać następująco:

1Bob

Każde wejście jest oddzielone spacją.

Specyfikacja wejściowa

Każdy napój ma jednostkę odpowiadającą powodowanemu przez niego uderzeniu. Jeśli spożyjesz więcej jednostek niż twoja waga podzielona przez dwa, pub nie jest już opcją.

(Może to odzwierciedlać rzeczywistość)

Poniżej przedstawiono ważne napoje i odpowiadające im jednostki alkoholowe napoju:

  • Piwo: b, 1jednostka

  • Napój energetyczny: e, 0jednostki

  • Gorący sos: h, 2jednostki (silny rzeczy)

  • Sok (z owoców organicznych itp) j, 0zespoły

  • Pokoi: r, 6jednostki

  • Tequila: t, 7jednostki

  • Wódka: v, 6jednostki

  • Wino: w, 3jednostki

Istnieją różne rodzaje kwot:

  • Butelka: B

  • Skrzynia: C

  • Szkło: G

  • Beczka: K

  • Łyk: S

Każdy rodzaj ilości ma mnożnik, który zwielokrotnia zawarte w nim jednostki alkoholowe napoju:

  • Butelka: 3

  • Skrzynia: 25

  • Szkło: 2

  • Beczka: 50

  • Łyk: 0.2

Wydajność

Twój program powinien wyjście truthy / falsy się stdout, jeżeli kwota spożywana jest powyżej / poniżej masy ciała podzielona przez 2. Jeżeli kwota spożywana jest równe wagi podzielone przez 2, należy falsy wyjściowego.

Próbki możliwych danych wejściowych i wyjściowych

Wkład

70
1Bob 3Soj

Wydajność

False

Wkład

2
1Cov

Wydajność

1

Wkład

50
1Cob

Wydajność

0

Wkład

100
4Gow 1Koe 1Bov 1Gow 2Sot

Wydajność

True

Najkrótszy program w bajtach wygrywa!

sweerpotato
źródło
1
1. Wygląda na to, że ojest to znak formatu, chociaż nie zostało to dokładnie powiedziane. Powinieneś to wyjaśnić (jak orównież odnosi się do oliwy z oliwek). 2. Co produkujemy, jeśli jesteśmy dokładnie na granicy? czy to nie ma znaczenia?
Level River St
1
Dobra decyzja; Całkowicie za tym tęskniłem. Usuwam oliwę z oliwek (kto i tak to pije?) Poniżej lub w pobliżu limitu powinno pojawić się fałsz. Dodam to.
sweerpotato,
1
Czy kiedykolwiek będzie więcej niż jedna cyfra napoju? Na przykład 43Gow?
Morgan Thrapp,
6
+1 dobre pytanie, ale jest piątek po południu i muszę wyjść na piwo. Może poniedziałek :)
MickyT,
1
Chciałem, aby była to naprawdę dowolna kwota - z wyjątkiem kwot ujemnych. Nie sądziłem, że byłoby to tak niejednoznaczne. Zdaję sobie sprawę, że jeśli to zmienię, unieważni to twoją odpowiedź i nie tak robimy. Kwota zostanie wyjaśniona jako jedna cyfra.
sweerpotato,

Odpowiedzi:

4

CJam, 53 bajty

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

Wypróbuj online w interpretatorze CJam .

Jak to działa

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
źródło
8

Python 3, 131

Teraz gramy w węże!

Oszczędność 18 bajtów dzięki shebang.
Zaoszczędź 4 dodatkowe bajty dzięki DSM.
Zaoszczędzono wiele bajtów dzięki tzaman.

Ogromne podziękowania dla tzamana za jego genialną sztuczkę nadużywania .find()powrotu, -1jeśli nie znajdzie on wartości.

Obecnie zakłada się, że ten format napoju jest dokładnie taki, jak podano w wyzwaniu, np. Tylko 1 cyfra każdego napoju.

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
źródło
Myślę, że dobrze by było, gdybyś porzucił dyktanda i zrobił wszystko w wyciągu. Więc usuń mi zamień m[p[-1]]bit na [3,25,2,50,.2]['BCGKS'.find(p[-1])], i to samo na d. Doszedłem do 168 z tymi zmianami w twoim kodzie.
Kade
4

Minkolang 0.11 , 59 bajtów

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

Wypróbuj tutaj.

Wyjaśnienie

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
źródło
Wydaje mi się, że CJam staje się przestarzały ... Muszę więc dokończyć swój język
anOKsquirrel
@anOKsquirrel: A raczej po prostu nie grałeś wystarczająco w golfa. :)
El'endia Starman
A raczej jedno i drugie. : P
anOKsquirrel
Nie, właściwie jestem po prostu zły: p
anOKsquirrel
3

CJam, 54 bajty

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

Trochę dziwnie i prawdopodobnie nieoptymalnie, ale myślę, że to działa dobrze. Wypróbuj online .

Wyjaśnienie

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

Zauważ, że tablica liczbowa ma na końcu 2, co oznacza, że Ghobrakujące w pierwszym ciągu znaków zostaną zamapowane na 2.

Sp3000
źródło
2

CJam, 77

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

VBA, 251 bajtów

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

Używanie :raczej niż Newline nie czyni go krótszym, ale wygląda bardziej golfowo!

Format czytelny

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

Całkiem pewnie, że można grać w golfa. moja manipulacja Mid(Right())ciągiem wydaje się zbyt męcząca, ale uruchomienie tablicy StrReversepowoduje, że jest ona dłuższa. Jeśli założymy, że wypijasz tylko 0–9 danego napoju na raz, możemy zaoszczędzić garść bajtów

Weź dane jako jeden ciąg z wagą oddzieloną spacją, ponieważ VBAdawka nie obsługuje wprowadzania wielu linii

JimmyJazzx
źródło
2

Rubin, 153 bajty

Muszę jakoś pozbyć się gsubów

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
źródło
2

JavaScript, 131 134 139 bajtów

Jest to pełny program i zasadniczo adaptacja mojej odpowiedzi 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)

Odczytuje dwie wartości za pomocą prompti alerts wynikiem jako [true|false].


Edycje

  • Zaoszczędzono 5 bajtów , stosując wyrażenie logiczne ||0zamiast deklarować napoje w 0jednostkach. Dzięki user81655 .
  • Zaoszczędzono 3 bajty , przechowując promptw zmiennej i skracając inicjalizację. Dzięki Stefnotch .
wstawić nazwę tutaj
źródło
1
Możesz zapisać 6 bajtów, zmieniając ,e:0,j:0}[b[++i]]na }[b[++i]]|0.
user81655
@ user81655 Wczoraj myślałem, jak pozbyć się tych 0wartości. Cóż, nie myślałem o tym. Musiałem użyć ||zamiast operatora bitowego. Nadal 5 bajtów mniej. Dzięki.
inserttusernamehere
Nie ma problemu. Zapomniałem o możliwych wartościach niecałkowitych.
user81655,
1
for(s=i=0,a=prompt(),b=prompt();można zmienić na:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch
1
@Stefnotch To sprytne. Lubię to. Dzięki za zapisanie 3 bajtów.
inserttusernamehere
1

bash (+ bc + GNU sed), 200 196 194 bajtów

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
źródło
1

JavaScript, 159 bajtów

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

Ponieważ Javascript wymaga biblioteki, aby uzyskać dostęp do STDIN, ten kod jest tylko funkcją, która akceptuje całość danych wejściowych, tj b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")

Wasmoo
źródło
1
Na marginesie: prompt()jest powszechnie akceptowane jako alternatywa dla ważnego STDINw JavaScripcie .
inserttusernamehere
1
Można zapisać 30 bajtów przechodząc ES6 i za pomocą strzałek-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)).
inserttusernamehere
1

Python 3, 157 bajtów

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
źródło
1

PHP, 163 169 bajtów

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;

Dane wyjściowe 1lub nic, działa dla wszystkich przypadków testowych.


Nadal zastanawiam się, co to za gorący sos , mając 2 jednostki .


Edycje

  • Zaoszczędzono 6 bajtów , łącząc dwie tablice napojów i mnożnika oraz usuwając 0z 0.2.
wstawić nazwę tutaj
źródło
1

Keg , 165 bajtów (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<.

Wypróbuj online!

Wydaje mi się, że odpowiedź Keg nigdy nie była bardziej odpowiednia! To może być gra w golfa, ale nie sądzę, że może.

Wyjaśnił

¿®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
źródło