Sai gestire il pub?


23

sfondo

È venerdì pomeriggio tardi e tu e i tuoi amici decidete di andare al pub più tardi quella sera, ma prima di andare al pub pensate che dovreste bere qualche bevanda. Tuttavia, le cose si intensificano rapidamente; il tuo amico Shaddock Pamplemousse ha vinto alla lotteria all'inizio di questa settimana e ha deciso di portare casse su casse con bevande diverse. La sicurezza al pub è molto severa e se si consuma troppo prima di provare ad entrare nei locali, non è consentito entrare. Tuttavia, siete tutti programmatori, quindi immaginate che le cose andranno comunque bene.

Sfida

È necessario programmare un misuratore di alcol che emette verità / falsità se si è al di sopra / al di sotto del limite ragionevole del pub. Prima di scendere al pub inserisci la quantità e il tipo di bevanda che hai consumato durante la sera in stdincui il tuo programma di misurazione legge. Se risulta vero, sei sopra il limite del pub e rimani a casa. Se genera falsi, sei a posto.

Ingresso

Un numero intero maggiore di quello 0che rappresenta il tuo peso corporeo in chilogrammi seguito da una nuova riga. Questo input è seguito da una serie di importi e bevande a una cifra nel seguente modulo:

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

Per una bottiglia di birra sarà simile a:

1Bob

Ogni input è separato da uno spazio.

Specifica di input

Ogni bevanda ha un'unità che corrisponde all'impatto causato da essa. Se consumi più unità del tuo peso diviso per due, il pub non è più un'opzione.

(Questo può o meno riflettere la realtà)

Di seguito sono riportate le bevande valide e le corrispondenti unità alcoliche della bevanda:

  • Birra: b, 1unità

  • Energy drink: e, 0unità

  • Salsa piccante: h, 2unità (roba forte)

  • Juice (fatta di frutta biologica, ecc): j, 0unità

  • Rum: r, 6unità

  • Tequila: t, 7unità

  • Vodka: v, 6unità

  • Vino: w, 3unità

Esistono diversi tipi di quantità:

  • Bottiglia: B

  • Crate: C

  • Bicchiere: G

  • Keg: K

  • Sorso: S

Ogni tipo di quantità ha un moltiplicatore che moltiplica le unità alcoliche della bevanda in essa contenuta:

  • Bottiglia: 3

  • Crate: 25

  • Bicchiere: 2

  • Keg: 50

  • Sorso: 0.2

Produzione

Il vostro programma è uscita truthy / falsy a stdoutse la quantità consumata è superiore / inferiore il vostro peso corporeo diviso per 2. Se la quantità consumata è pari al proprio peso diviso per 2, si dovrebbe uscita falsy.

Esempi di possibili input e output

Ingresso

70
1Bob 3Soj

Produzione

False

Ingresso

2
1Cov

Produzione

1

Ingresso

50
1Cob

Produzione

0

Ingresso

100
4Gow 1Koe 1Bov 1Gow 2Sot

Produzione

True

Vince il programma più breve in byte!


1
1. Sembra che osia un personaggio formato, anche se non l'hai detto in modo specifico. Dovresti chiarire questo (come osi riferisce anche all'olio d'oliva.) 2. Cosa produciamo se siamo esattamente al limite? o non importa?
Level River St,

1
Buona chiamata; L'ho perso del tutto. Sto rimuovendo l'olio d'oliva (chi lo beve comunque?) Al di sotto o uguale al limite dovrebbe produrre falsi. Lo aggiungerò io.
sweerpotato,

1
Ci sarà mai più di una cifra di bevanda? Ad esempio 43Gow?
Morgan Thrapp,

6
+1 bella domanda, ma è venerdì pomeriggio e devo uscire per una birra. Forse lunedì :)
MickyT

1
Intendevo che fosse davvero un qualsiasi importo, ad eccezione di importi negativi. Non pensavo che sarebbe risultato ambiguo. Mi rendo conto che se cambio questo invaliderà la tua risposta e non è così che facciamo le cose. L'importo sarà chiarito come una cifra.
sweerpotato,

Risposte:


4

CJam, 53 byte

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

Provalo online nell'interprete CJam .

Come funziona

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

Ora giochiamo a golf con i serpenti!

Salvati 18 byte grazie a Shebang.
Salvato 4 byte in più grazie a DSM.
Salvati molti byte grazie a Tzaman.

Mille grazie a Tzaman per il suo geniale trucco di abusare del .find()ritorno -1se non trova valore.

Attualmente questo presuppone che questo formato di bevanda sia esattamente come indicato nella sfida, ad es. Solo un valore di 1 cifra per ogni bevanda.

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

Penso che potrebbe essere buono se hai lasciato cadere i dadi e hai fatto tutto nella dichiarazione di stampa. Quindi, rimuovere me sostituire il m[p[-1]]bit con [3,25,2,50,.2]['BCGKS'.find(p[-1])]e lo stesso con d. Sono arrivato al 168 con quelle modifiche al tuo codice.
Kade,

4

Minkolang 0,11 , 59 byte

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

Provalo qui.

Spiegazione

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.

Immagino che CJam stia diventando obsoleto ... Devo finire la mia lingua allora
anOKsquirrel

@anOKsquirrel: O meglio, non l'hai mai giocato abbastanza. :)
El'endia Starman,

O meglio, entrambi. : P
anOKsquirrel,

No, in realtà, sto solo male: p
anOKsquirrel

3

CJam, 54 byte

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

Un po 'complicato e probabilmente non ottimale, ma penso che funzioni bene. Provalo online .

Spiegazione

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

Si noti che la matrice numerica ha 2 alla fine, il che significa che Gho, che mancano dalla prima stringa, vengono mappati su 2.


2

CJam, 77

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

2

VBA, 251 byte

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

Usare :piuttosto che Newline non lo rende più corto, ma sembra più da golf!

Formato leggibile

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

Abbastanza sicuro, questo può essere giocato a golf. la mia manipolazione delle stringhe Mid(Right())sembra eccessivamente prolissa, ma l'esecuzione dell'array StrReverselo rende più lungo. Se assumiamo che tu beva solo 0-9 di una bevanda particolare alla volta, possiamo salvare una manciata di byte

Prenda l'input come una stringa con il peso separato da uno spazio poiché la VBAdose non supporta l'input a più righe


2

Rubino, 153 byte

Devo sbarazzarmi degli gsub in qualche modo

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 byte

Questo è un programma completo e sostanzialmente un adattamento del mio risposta 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)

Legge due valori usando prompt e alerts il risultato come [true|false].


Le modifiche

  • Hai salvato 5 byte usando un'espressione logica ||0invece di dichiarare le bevande con0 unità. Grazie a user81655 .
  • Salvato 3 byte memorizzando promptin una variabile e accorciando l'inizializzazione. Grazie a Stefnotch .

1
È possibile salvare 6 byte cambiando ,e:0,j:0}[b[++i]]in }[b[++i]]|0.
user81655

@ user81655 Ieri stavo pensando, come sbarazzarmi di quei 0valori. Beh, non ci ho pensato. Ho dovuto usare al ||posto dell'operatore bit per bit. Ancora 5 byte in meno. Grazie.
inserisci nomeutentequi

Nessun problema. Ho dimenticato i possibili valori non interi.
user81655

1
for(s=i=0,a=prompt(),b=prompt();può essere modificato in:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch,

1
@Stefnotch È intelligente. Mi piace. Grazie per aver salvato 3 byte.
inserire nomeutentequi

1

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

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 byte

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

Poiché Javascript richiede una libreria per accedere a STDIN, questo codice è solo una funzione che accetta l'input completo, ovvero b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Come nota: prompt()è generalmente accettato come valida alternativa a STDINin JavaScript .
insertusernamehere

1
Si potrebbe risparmiare 30 byte andando ES6 e utilizzando la freccia-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 byte

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 byte

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;

Output 1o niente, funziona per tutti i casi di test.


Mi chiedo ancora cosa sia questa salsa piccante , con 2 unità .


Le modifiche

  • 6 byte salvati unendo i due array per bevande e moltiplicatore e rimuovendoli 0da 0.2.

1

Keg , 165 byte (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<.

Provalo online!

Mi sento come se una risposta in Keg non fosse mai stata più appropriata! Probabilmente questo potrebbe essere giocato a golf, ma non penso che possa.

spiegato

¿®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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.