Bạn có thể xử lý các quán rượu?


23

Lý lịch

Đó là vào chiều thứ sáu và bạn và bạn bè của bạn quyết định đến quán rượu vào tối hôm đó, nhưng trước khi đến quán rượu, bạn nghĩ rằng bạn nên có một vài đồ uống. Tuy nhiên, mọi thứ leo thang nhanh chóng; bạn của bạn Shaddock Pamplemousse đã trúng xổ số vào đầu tuần này và quyết định mang thùng lên các thùng với các loại đồ uống khác nhau. An ninh tại quán rượu rất nghiêm ngặt, và nếu bạn quá cố gắng trước khi cố gắng vào cơ sở, bạn không được phép vào bên trong. Mặc dù vậy, bạn là tất cả các lập trình viên - vì vậy bạn cho rằng mọi thứ sẽ trở nên tuyệt vời.

Thử thách

Bạn cần lập trình một máy đo độ cồn tạo ra sự thật / giả nếu bạn ở trên / dưới giới hạn quán rượu hợp lý. Trước khi bạn xuống quán rượu, bạn nhập số lượng và loại đồ uống bạn đã tiêu thụ vào buổi tối stdinmà chương trình đo lường của bạn đọc. Nếu nó xuất ra sự thật, bạn ở trên giới hạn quán rượu và ở nhà. Nếu nó xuất ra sai lệch, bạn tốt để đi.

Đầu vào

Một số nguyên lớn hơn 0đại diện cho trọng lượng cơ thể của bạn tính bằng kilogam theo sau là một dòng mới. Đầu vào này được theo sau bởi một loạt số lượng một chữ số và đồ uống theo mẫu sau:

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

Đối với một chai bia, nó sẽ trông như sau:

1Bob

Mỗi đầu vào được phân tách bằng một khoảng trắng.

Đặc điểm kỹ thuật đầu vào

Mỗi đồ uống có một đơn vị tương ứng với tác động gây ra bởi nó. Nếu bạn tiêu thụ nhiều đơn vị hơn trọng lượng của bạn chia cho hai quán rượu thì không còn là một lựa chọn nữa.

(Điều này có thể hoặc không thể phản ánh thực tế)

Sau đây là đồ uống hợp lệ và các đơn vị cồn tương ứng của đồ uống:

  • Bia : b, 1đơn vị

  • Nước tăng lực : e, 0đơn vị

  • Sốt nóng : h, 2đơn vị (thứ mạnh)

  • Juice (làm từ các loại trái cây hữu cơ vv): j, 0đơn vị

  • Rum : r, 6đơn vị

  • Tequila : t, 7đơn vị

  • Vodka : v, 6đơn vị

  • Rượu : w, 3đơn vị

Có nhiều loại số tiền khác nhau:

  • Chai: B

  • Thùng: C

  • Ly: G

  • Keg: K

  • Một hớp: S

Mỗi loại số lượng có một số nhân nhân với đơn vị cồn của đồ uống có trong đó:

  • Chai: 3

  • Thùng: 25

  • Ly: 2

  • Keg: 50

  • Một hớp: 0.2

Đầu ra

Chương trình của bạn có trách nhiệm đầu ra truthy / falsy để stdoutnếu số tiêu thụ là trên / dưới trọng lượng cơ thể của bạn chia cho 2. Nếu số lượng tiêu thụ tương đương với trọng lượng của bạn chia cho 2, bạn nên đầu ra falsy.

Các mẫu đầu vào và đầu ra có thể

Đầu vào

70
1Bob 3Soj

Đầu ra

False

Đầu vào

2
1Cov

Đầu ra

1

Đầu vào

50
1Cob

Đầu ra

0

Đầu vào

100
4Gow 1Koe 1Bov 1Gow 2Sot

Đầu ra

True

Chương trình ngắn nhất tính bằng byte chiến thắng!


1
1. Dường như đó olà một ký tự định dạng, mặc dù bạn chưa nói cụ thể như vậy. Bạn nên làm rõ điều này ( ocũng như đề cập đến dầu ô liu.) 2. Chúng ta sản xuất gì nếu chúng ta chính xác về giới hạn? hay không quan trọng?
Cấp sông St

1
Cuộc gọi tốt; Tôi hoàn toàn bỏ lỡ điều đó. Tôi đang loại bỏ dầu ô liu (ai uống loại nào?) Dưới hoặc bằng giới hạn sẽ tạo ra sai lệch. Tôi sẽ thêm nó.
sweerpotato

1
Sẽ bao giờ có nhiều hơn một chữ số của thức uống? Ví dụ 43Gow?
Morgan Thrapp

6
+1 câu hỏi hay, nhưng đó là chiều thứ sáu và tôi cần ra ngoài để uống bia. Có thể là thứ Hai :)
MickyT

1
Tôi dự định nó sẽ là bất kỳ số tiền nào thực sự - ngoại trừ số tiền âm. Tôi không nghĩ rằng điều đó sẽ trở nên mơ hồ. Tôi nhận ra nếu tôi thay đổi điều này, nó sẽ làm mất hiệu lực câu trả lời của bạn và đó không phải là cách chúng tôi làm. Số tiền sẽ được làm rõ dưới dạng một chữ số.
sweerpotato

Câu trả lời:


4

CJam, 53 byte

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

Hãy thử trực tuyến trong trình thông dịch CJam .

Làm thế nào nó hoạt động

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

Trăn 3, 131

Bây giờ chúng tôi đang chơi golf với rắn!

Đã lưu 18 byte nhờ shebang.
Đã lưu thêm 4 byte nhờ DSM.
Đã lưu rất nhiều byte nhờ tzaman.

Rất cám ơn tzaman vì mánh khóe tuyệt vời của việc lạm dụng .find()trở lại -1nếu nó không tìm thấy giá trị.

Hiện tại, điều này giả định định dạng đồ uống này chính xác theo cách nó được nêu trong thử thách, ví dụ: chỉ có 1 chữ số cho mỗi lần uống.

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

Tôi nghĩ rằng nó có thể là tốt nếu bạn bỏ dicts và làm mọi thứ trong bản in. Vì vậy, loại bỏ mvà thay thế m[p[-1]]bit bằng [3,25,2,50,.2]['BCGKS'.find(p[-1])], và tương tự với d. Tôi đã xuống tới 168 với những thay đổi về mã của bạn.
Kade

4

Chồn 0,11 , 59 byte

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

Hãy thử nó ở đây.

Giải trình

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.

Tôi đoán rằng CJam đang trở nên lỗi thời ... Tôi cần phải hoàn thành ngôn ngữ của mình sau đó
anOKsquirrel

@anOKsquirrel: Hay đúng hơn, bạn chỉ chưa chơi golf thôi. :)
El'endia Starman

Hay đúng hơn, cả hai. : P
anOKsquirrel

Không, thực ra, tôi thật tệ: p
anOKsquirrel

3

CJam, 54 byte

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

Bit khó khăn và có thể là tối ưu, nhưng tôi nghĩ rằng điều này hoạt động tốt. Hãy thử trực tuyến .

Giải trình

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

Lưu ý rằng mảng số có 2 ở cuối, có nghĩa là Gho, thiếu từ chuỗi đầu tiên, được ánh xạ thành 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

Sử dụng :thay vào đó Newline không làm cho nó ngắn hơn, nhưng nó trông có vẻ nhiều golf hơn!

Định dạng có thể đọc được

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

Khá chắc chắn điều này có thể được chơi golf. Thao tác chuỗi của tôi với Mid(Right())vẻ quá dài dòng, nhưng chạy mảng mặc dù StrReverselàm cho nó dài hơn. Nếu chúng tôi cho rằng bạn chỉ uống 0-9 bất kỳ loại đồ uống cụ thể nào tại một thời điểm, chúng tôi có thể tiết kiệm được một số byte

Lấy đầu vào là một chuỗi có trọng số cách nhau bởi một khoảng trắng vì VBAliều không hỗ trợ đầu vào nhiều dòng


2

Ruby, 153 byte

Tôi cần phải thoát khỏi gsub bằng cách nào đó

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

Đây là một chương trình đầy đủ và về cơ bản là sự thích ứng với câu trả lời PHP của tôi :

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)

Nó đọc hai giá trị sử dụng promptalerts kết quả là [true|false].


Chỉnh sửa

  • Đã lưu 5 byte bằng cách sử dụng biểu thức logic ||0thay vì khai báo đồ uống bằng 0đơn vị. Cảm ơn người dùng81655 .
  • Đã lưu 3 byte bằng cách lưu trữ prompttrong một biến và rút ngắn quá trình khởi tạo. Cảm ơn Stefnotch .

1
Bạn có thể lưu 6 byte bằng cách thay đổi ,e:0,j:0}[b[++i]]thành }[b[++i]]|0.
dùng81655

@ user81655 Hôm qua tôi đã suy nghĩ, làm thế nào để thoát khỏi những giá trị đó 0. Chà, tôi đã không nghĩ về điều đó. Phải sử dụng ||thay cho toán tử bitwise. Vẫn còn 5 byte. Cảm ơn.
insertusernamehere

Không vấn đề gì. Tôi quên mất các giá trị không nguyên có thể.
dùng81655

1
for(s=i=0,a=prompt(),b=prompt();có thể được thay đổi để:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch Thật thông minh. Tôi thích nó. Cảm ơn vì đã tiết kiệm 3 byte.
insertusernamehere

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

Vì Javascript yêu cầu thư viện truy cập STDIN, mã này chỉ là một hàm chấp nhận toàn bộ đầu vào, tức là b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
Lưu ý: prompt()thường được chấp nhận như là một thay thế hợp lệ STDINtrong JavaScript .
insertusernamehere

1
Bạn có thể lưu 30 byte bằng cách vào ES6 và sử dụng toán tử mũi tên : 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;

Đầu ra 1hoặc không có gì, hoạt động cho tất cả các trường hợp thử nghiệm.


Tôi vẫn tự hỏi nước sốt nóng này là gì, có 2 đơn vị .


Chỉnh sửa

  • Đã lưu 6 byte bằng cách hợp nhất hai mảng cho đồ uống và số nhân và bằng cách xóa 0khỏi 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<.

Hãy thử trực tuyến!

Tôi cảm thấy như thể một câu trả lời Keg chưa bao giờ thích hợp hơn! Điều này có thể có thể được đánh gôn, nhưng tôi không nghĩ rằng nó có thể.

Giải thích

¿®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
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.