你可以去酒吧吗?


23

背景

现在是星期五下午晚些时候,您和您的朋友决定在当晚晚些时候去酒吧,但是在去酒吧之前,您应该先喝点饮料。但是,事情迅速升级。您的朋友Shaddock Pamplemousse在本周初赢得了彩票,并决定将带不同饮料的板条箱带到板条箱上。酒馆的安全性非常严格,如果您在进屋之前过度消费,则不允许进入。你们都是程序员-所以您认为一切都会变得很好。

挑战

如果您超出/低于合理的发布限制,则需要对酒精度计进行编程,以输出真/假。在下酒馆之前,您需要输入您在晚上stdin阅读测量程序所消费的数量和饮料类型。如果输出不正确,则说明您超出了发布限制,请留在家里。如果输出错误,那您就很好了。

输入项

大于1的整数0表示您的体重(以千克为单位),后跟换行符。此输入之后是一系列的一位数的数字和饮料,格式如下:

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

对于一瓶啤酒,外观如下:

1Bob

每个输入用空格分隔。

输入规格

每种饮料都有一个与之对应的单位。如果您消耗的单位数多于体重除以2的重量,则不再可以选择酒吧。

(这可能反映也可能不反映现实)

以下是有效的饮料以及饮料中相应的酒精单位:

  • 啤酒:b1单位

  • 能量饮料:e0单位

  • 辣酱:h2单位(浓汤)

  • 汁(由有机水果等): j0单位

  • 朗姆酒:r6单位

  • 龙舌兰酒:t7单位

  • 伏特加:v6单位

  • 葡萄酒:w3单位

有不同的金额类型:

  • 瓶子: B

  • 箱: C

  • 玻璃: G

  • 桶: K

  • 啜: S

每种数量类型都有一个乘数,用于乘以其中所含饮料的酒精含量:

  • 瓶子: 3

  • 箱: 25

  • 玻璃: 2

  • 桶: 50

  • 啜: 0.2

输出量

如果消耗的量高于/低于体重除以2 ,则程序将输出“ 真/虚假”stdout。如果消耗的量等于体重除以2,则应输出“虚假/虚假”。

可能的输入和输出样本

输入项

70
1Bob 3Soj

输出量

False

输入项

2
1Cov

输出量

1

输入项

50
1Cob

输出量

0

输入项

100
4Gow 1Koe 1Bov 1Gow 2Sot

输出量

True

以字节为单位的最短程序胜出!


1
1.似乎o是格式字符,尽管您没有特别说明。您应该澄清这一点(o也指橄榄油)。2.如果我们正处于极限状态,我们将输出什么?还是没关系?
水平河圣

1
好决定; 我完全错过了。我要去掉橄榄油(无论是谁喝的?),低于或等于限制值时,会输出虚假信息。我将添加。
sweerpotato

1
会不会有超过一位数的饮料?例如43Gow
Morgan Thrapp 2015年

6
+1好问题,但今天是星期五下午,我需要出去喝啤酒。也许星期一:)
MickyT 2015年

1
我打算将其实际设置为任何金额-负数除外。我不认为这会变得模棱两可。我知道,如果我更改此设置,将会使您的答案无效,这不是我们的工作方式。金额将澄清为一位数字。
sweerpotato

Answers:


4

CJam,53个字节

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

CJam解释器中在线尝试。

怎么运行的

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

现在我们在打蛇!

感谢shebang,节省了18个字节。
多亏了DSM,节省了4个字节。
多亏了tzaman,节省了很多字节。

非常感谢tzaman出色的技巧,即在找不到价值的情况下滥用.find()回报-1

当前,这是假设这种饮料形式完全符合挑战中的说明,例如,每种饮料仅价值1位数。

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

我认为,如果您放弃这些要求并在印刷声明中进行所有操作,那可能会很好。因此,用删除m和替换该m[p[-1]][3,25,2,50,.2]['BCGKS'.find(p[-1])],并用替换相同d。我对您的代码所做的更改降至168。
卡德2015年

4

Minkolang 0.11,59个字节

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

在这里尝试。

说明

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.

我猜CJam已经过时了...然后我需要完成我的语言
anOKsquirrel

@anOKsquirrel:或者说,您只是打高尔夫球不够。:)
El'endia Starman 2015年

或两者兼而有之。:P
anOKsquirrel

不,实际上,我很糟糕:p
ansquisrel 2015年

3

CJam,54个字节

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

有点儿怪异,可能不是最理想的,但是我认为这行得通。在线尝试

说明

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

请注意,数字数组的末尾有2,这意味着Gho第一个字符串中缺少的映射到2。


2

果酱,77

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

2

VBA,251个字节

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

:宁可使用Newline也不会使它变短,但是看起来确实更像高尔夫球!

可读格式

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

当然可以打高尔夫球。我的String Manipulation Mid(Right())似乎过于罗word,但运行数组虽然StrReverse会使它更长。如果我们假设您一次只喝任何特定饮料的0-9,我们可以节省一些字节

输入为一个字符串,其权重由空格分隔,因为VBA剂量不支持多行输入


2

Ruby,153个字节

我需要以某种方式摆脱gsubs

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字节

这是一个完整的程序,基本上是我的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)

它使用prompt和读取两个值alert,结果为[true|false]


编辑

  • 通过使用逻辑表达式而不是用单位声明饮料来节省5个字节。感谢user81655||00
  • 通过存储在变量中并缩短初始化来节省3个字节prompt。感谢Stefnotch

1
通过更改,e:0,j:0}[b[++i]]为,您可以节省6个字节}[b[++i]]|0
user81655 2015年

@ user81655昨天我在想,如何摆脱那些-值0。好吧,我没有想到这一点。必须使用||代替按位运算符。仍然少5个字节。谢谢。
insertusername此处,2015年

没问题。我忘记了可能的非整数值。
user81655 2015年

1
for(s=i=0,a=prompt(),b=prompt();可以更改为:for(c=prompt,b=c(a=c(s=i=0));
Stefnotch

1
@Stefnotch这很聪明。我喜欢。感谢您节省3个字节。
2015年

1

bash的(+ BC + GNU SED),200个 196 194字节

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个字节

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,因此此代码只是一个接受整个输入的函数,即 b("100\n4Gow 1Koe 1Bov 1Gow 2Sot")


1
作为一个说明:prompt()通常被认为是一个有效的替代方案STDIN的JavaScript
insertusername此处,2015年

1
通过使用ES6并使用arrow-运算符,您可以节省 30个字节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))
insertusername此处为2015年

1

Python 3,157个字节

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,163169字节

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;

输出1或什么都不输出,适用于所有测试用例。


我仍然想知道这个有2个单位的辣酱是什么。


编辑

  • 通过合并饮料和乘数的两个数组并从中删除,节省了6个字节00.2

1

,165字节(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<.

在线尝试!

我觉得好像Keg的答案从未像现在这样合适!这可能是打高尔夫球的,但我认为不能。

讲解

¿®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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.