Barı idare edebilir misin?


23

Arka fon

Cuma öğleden sonra geç saatlerde ve siz ve arkadaşlarınız o akşam sonra pub'a gitmeye karar veriyorsunuz, ancak bara gitmeden önce birkaç içeceğinizin olduğunu düşünüyorsunuz. Ancak, işler hızla yükseliyor; Arkadaşınız Shaddock Pamplemousse bu haftanın başlarında piyangoyu kazandı ve farklı içeceklere sahip kasalara kasa getirmeye karar verdi. Barda güvenlik çok katı ve binaya girmeye çalışmadan önce fazla tüketirseniz içeriye girmenize izin verilmez. Hepiniz programcılarsınız - bu durumda işlerin yine de mükemmel olacağını düşünün.

Meydan okuma

Makul pub limitinin üstünde / altındaysanız, haksız / sahte çıktı veren bir alkol ölçüm cihazı programlamanız gerekir. Pub'a gitmeden önce stdin, ölçüm programınızın okuduğu akşamları tükettiğiniz miktar ve içecek türünü girersiniz . Gerçeği çıkarsa, pub limitinin üzerindesiniz ve evde kalın. Eğer sahte çıktılarsa, gitmeniz iyi olur.

Giriş

Ondan daha büyük bir tamsayı 0, vücut ağırlığınızı kilogram cinsinden ifade eder, ardından yeni satır. Bu girişi aşağıdaki formda bir rakam rakam ve içecek dizisi izler:

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

Bir şişe bira için bu şöyle görünecektir:

1Bob

Her giriş bir boşlukla ayrılır.

Giriş özellikleri

Her meşrubat, neden olduğu etkiye karşılık gelen bir üniteye sahiptir. Kilonuzdan iki birime böldüğünüzden daha fazla birim tüketirseniz, bar artık bir seçenek değildir.

(Bu gerçeği yansıtabilir veya yansıtmayabilir)

Aşağıdakiler geçerli içecekler ve içeceğin ilgili alkollü birimleridir:

  • Bira: b, 1birim

  • Enerji içeceği: e, 0birimler

  • Acı sos: h, 2birimler (güçlü şeyler)

  • (Organik meyve vb yapılmış) Suyu: j, 0birimler

  • Rum: r, 6birimler

  • Tekila: t, 7birimler

  • Votka: v, 6birimler

  • Şarap: w, 3birimler

Farklı miktar türleri vardır:

  • Şişe: B

  • Sandık: C

  • Bardak: G

  • Fıçı: K

  • Yudum: S

Her miktar tipinde, içerdiği içeceğin alkollü birimlerini çarpan bir çarpan vardır:

  • Şişe: 3

  • Sandık: 25

  • Bardak: 2

  • Fıçı: 50

  • Yudum: 0.2

Çıktı

Programınız, tüketilen miktarın, vücut ağırlığınızın 2'nin üzerinde / altında olup olmadığına göre gerçek / yanlış verir. stdoutTüketilen miktar, 2'ye bölünerek ağırlığınıza eşitse, sahte çıktı vermelisiniz.

Olası giriş ve çıkış örnekleri

Giriş

70
1Bob 3Soj

Çıktı

False

Giriş

2
1Cov

Çıktı

1

Giriş

50
1Cob

Çıktı

0

Giriş

100
4Gow 1Koe 1Bov 1Gow 2Sot

Çıktı

True

Bayt cinsinden en kısa program kazanır!


1
1. Görünen o ki, oözellikle de söylememiş olsanız da , bir biçim karakteri. Bunu netleştirmelisiniz ( ozeytinyağı için de geçerlidir.) 2. Tam olarak sınırda olursak ne üretiyoruz? ya da önemli değil mi?
Seviye Nehri St

1
İyi arama; Bunu tamamen özledim. Zeytinyağını çıkartıyorum (kim içiyor?) Sınırın altında mı yoksa eşit mi sahte çıktı. Onu ekleyeceğim.
tatlı patates

1
Birden fazla içki içilecek mi? Örneğin, 43Gow?
Morgan Thrapp

6
+1 iyi soru, ama bugün Cuma öğleden sonra ve bir bira içmek için dışarı çıkmam gerekiyor. Belki Pazartesi :)
MickyT 13:15

1
Olumsuz miktarlar hariç, gerçekten herhangi bir miktar olmasını istedim. Bunun belirsiz olacağını düşünmedim. Bunu değiştirirsem cevabınızı geçersiz kılacağının farkındayım, ve böyle yapmıyoruz. Tutar bir basamak olarak netleştirilecektir.
sweerpotato,

Yanıtlar:


4

CJam, 53 bayt

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

CJam tercümanında çevrimiçi olarak deneyin .

Nasıl çalışır

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

Şimdi yılanlarla golf oynuyoruz!

Shebang sayesinde 18 byte kurtarıldı.
DSM sayesinde 4 bayt daha kaydedildi.
Tzaman sayesinde çok fazla bayt kurtarıldı.

Tzaman'a, eğer bir değer bulamazsa, .find()geri dönmeyi küfür eden aldatma hilesi için teşekkür ederiz -1.

Şu anda bu, bu içecek formatının tam olarak mücadelede belirtildiği gibi olduğunu varsaymaktadır, örneğin, her içeceğin yalnızca 1 hanesi.

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

Bence baskıyı bırakıp her şeyi print deyiminde yapsan iyi olur. Bu nedenle, bit ve aynı ile ile bit mve değiştirin . Kodunda bu değişikliklerle 168'e düştüm. m[p[-1]][3,25,2,50,.2]['BCGKS'.find(p[-1])]d
Kade

4

Minkolang 0.11 , 59 bayt

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

Burada dene.

açıklama

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.

Sanırım CJam modası geçiyor ... Dilimi bitirmem gerekiyor
anOKsquirrel 12:15

@ anOKsquirrel: Aksine, yeteri kadar golf oynamadın. :)
El'endia Starman 12:15

Ya da daha doğrusu, ikisi de. : P
anOKsquirrel 12:15

Hayır, aslında, sadece kötüyüm: p
anOKsquirrel 12:15

3

CJam, 54 bayt

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

Fiddly biraz ve muhtemelen suboptimal, ama bence bu iyi çalışıyor. Çevrimiçi deneyin .

açıklama

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

Sayısal dizinin sonunda 2 olduğuna dikkat edin Gho; bunun anlamı , ilk dizgeden eksik olan, 2 ile eşlenir.


2

CJam, 77

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

2

VBA, 251 bayt

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

:Aksine o zaman kullanmak Newline kısalmaz, Ama daha golf gibi görünüyor!

Okunabilir 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

Oldukça eminim bu golf olabilir. benim String Manipulation ile Mid(Right())aşırı derecede endişe görünüyor, ama dizi çalıştıran olsa StrReversedaha uzun yapar. Bir seferde yalnızca 0-9 arası herhangi bir içeceğinizi varsayarsak, bir avuç bayt kurtarabiliriz.

VBADozu çok satırlı girişi desteklemediğinden , ağırlığı boşlukla ayrılmış bir dize olarak girdi alın


2

Ruby, 153 bayt

Bir şekilde gsublardan kurtulmam lazım

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 bayt

Bu tam bir program ve temelde PHP cevabımın bir uyarlaması :

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)

Bu kullanılarak iki değer okur promptve alertolduğu gibi sonuç s [true|false].


Düzenlemeler

  • Kaydedilen 5 byte mantıksal ifade kullanarak ||0yerine içeceklerin ilan 0birimi. User81655 sayesinde .
  • Kaydedilen 3 bayt depolayarak promptbir değişkende ve başlatma azaltmıştır. Stefnotch'a teşekkürler .

1
Sen değiştirerek 6 bayt kurtarabilecek ,e:0,j:0}[b[++i]]için }[b[++i]]|0.
user81655 14:15

@ user81655 Dün, bu 0değerlerden nasıl kurtulacağımı düşünüyordum . Ben bunu düşünmedim. ||Bitsel operatör yerine kullanmak zorunda kaldım . Hala 5 bayt daha az. Teşekkürler.
insertusernamehere

Sorun değil. Olası tamsayı olmayan değerleri unuttum.
user81655 14:15

1
for(s=i=0,a=prompt(),b=prompt();şu şekilde değiştirilebilir:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch 14:15

1
@Stefnotch Bu akıllıca. Bunu sevdim. 3 bayt kaydettiğiniz için teşekkür ederiz.
insertusernamehere

1

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

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 bayt

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

Javascript, STDIN'e erişmek için bir kütüphane gerektirdiğinden, bu kod yalnızca girişin tamamını kabul eden bir fonksiyondur, yani b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Bir not olarak: prompt()genellikle geçerli bir alternatif olarak kabul edilmektedir STDINiçinde JavaScript .
insertusernamehere

1
ES6'ya gidip ok operatörünü kullanarak 30 bayt tasarruf edebilirsiniz . 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 bayt

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 bayt

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;

Çıktılar 1ya da hiçbir şey, tüm test durumları için çalışır.


Acılı sosun ne olduğunu hala merak ediyorum , 2 tane var .


Düzenlemeler

  • Kaydedilen 6 bayt içecekler ve çarpan için iki dizi birleştirilerek çıkararak 0gelen 0.2.

1

Fıçı , 165 bayt (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<.

Çevrimiçi deneyin!

Bir Keg cevabı hiç bu kadar uygun olmamıştı gibi hissediyorum! Bu muhtemelen golf olabilir, ama yapabileceğini sanmıyorum.

Açıklaması

¿®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
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.