几个月前,我把这个问题作为面试的预选谜题。最近,当我想到博客的材料时,它突然出现在我的脑海中,作为一个很好的例子,可以用来解决问题的功能。当我写完我的博客文章后,我会立即发布我的解决方案。
注:这个问题是一年前在StackOverflow上提出的,并在一些(不正确的)答案后被否决。我想它被否决了,因为它是一个明显的面试或家庭作业问题。我们在这里的答案应该是足够深的代码,让人不考虑使用他们!
在比赛中,你可以用下面的策略下注。每次你输掉一次赌注,你就会把下一轮的赌注的价值翻一番。无论你何时获胜,下一轮的赌注都是一美元。你一开始就赌一美元。
例如,如果你从20美元开始,你在第一轮中赢了,在接下来的两轮中输掉了,然后在第四轮中赢了,你将得到20+1-1-2+4 = 22美元。
您需要完成函数g,它包含两个参数:
a,它是我们开始下注时的初始金额。r。结果的第一个特征是“W”(赢)或“L”(输),代表第一轮的结果。您的功能应该返回的金额,你将拥有的所有回合后,发挥。
如果在某一时刻,你的账户中没有足够的钱来支付赌注的价值,你必须停下来,把你在这一点上的钱还回来。
1st round - Loss: 15-1 = 14
2nd round - Loss: 14-2 = 12 (Bet doubles)
3rd round - Loss: 12-4 = 8
4th round - Win: 8 + 8 = 16
5th round - Loss:16-1 = 15 (Since the previous bet was a win, this bet has a value of 1 dollar)
6th round - Loss: 15-2 = 13
7th round - Loss: 13-4 = 9
8th round - Loss: 9-8 = 1函数在本例中返回1
胜利者由隐含函数定义中的最少字符数决定。如有需要,请用语言配合。我知道我的可以改进!
发布于 2014-04-24 09:03:49
g=function(a,r){n=1;for(i in 1:nchar(r)){s=substr(r,i,i);if(s=='L'){a=a-n;n=n*2}else{a=a+n;n=1};if(n>a)break};a}缩进:
g=function(a,r){
n=1
for(i in 1:nchar(r)){
s=substr(r,i,i)
if(s=='L'){
a=a-n
n=n*2
}else{
a=a+n
n=1
}
if(n>a)break
}
a
}用法:
> g(15,'LLWLLLL')
[1] 1
> g(20,'WLLW')
[1] 22
> g(13,'LLWLLLLWWLWWWLWLWW')
[1] 7发布于 2014-04-24 06:10:29
return q.Aggregate(new{b=1,c=w,x=1},(l,o)=>l.x<0?l:o=='W'?new{b=1,c=l.c+l.b,x=1}:new{b=l.b*2,c=l.c-l.b,x=l.c-l.b-l.b*2}).c;一篇解释
发布于 2014-04-24 06:55:50
def g(a,r,b=1):
for l in r:
if l>"L":a+=b;b=1
else:a-=b;b*=2
return a我定义了函数g,它取一个(开始时你有多少钱)和r(这是下注的结果),它将第一次下注的金额初始化为1。然后对于每一次下注的结果,如果它是一场胜利(r中的“W”),你就会得到钱并赌回1。否则你会输掉赌注的数量,下一次赌的金额会加倍。最后,它还你的钱。你可以这样使用它:
print g(20,"WLLW") # 22
print g(15,"LLLWLLLL") # 1我觉得这还可以再打一杯。
https://codegolf.stackexchange.com/questions/26236
复制相似问题