你的任务是总结和输出一个球员的得分在一个游戏的10脚保龄球后,最多21卷。
这些卷表示为优选输入法中的整数序列。每个整数对应于在该卷中被击倒的引脚数。
每一轮之后,击倒在这一轮中的引脚数被计算到最后的分数中。如果一名球员在一轮的第一轮中击倒了所有的十个引脚,这就是一次打击,这一轮就结束了。否则,这一轮还会持续一轮。如果一轮的第二轮击倒了所有剩余的引脚,这是备用的。
对于每一次打击,都有一个加值,等于下两次击倒的销的总和。对于每一个备件,有一个奖金等于在下一卷中击倒的引脚数。
在第十轮,也就是最后一轮,球员可能会得到额外的奖励:如果有一次进攻,球员会得到两次额外的奖励。如果有备用的话,玩家会再得到一个滚球。
Input: 4 3 8 2 7 1 10 7 3 0 10 2 2 10 10 5 4
Output: 131
Input: 10 10 9 1 7 3 2 7 10 1 9 10 7 1 10 10 10
Output: 183
发布于 2017-08-24 19:46:12
我不知道为什么这个挑战会被撞到,但我喜欢它,所以无论如何我都会迟到回答。
f=function(x,s=0,c=10)`if`(c&length(x),f(x[-(0:(x[1]!=10)+1)],sum(x[1:(2+(sum(x[1:2])>9))])+s,c-1),s)
未高尔夫球:
f <- function(throws, score = 0, count = 10){
if(count != 0 & length(throws) != 0){
IsStrike <- throws[1] == 10
IsStrikeOrSpare <- sum(throws[1:2]) >= 10
f(throws[-c(1, 2 * !IsStrike)],
score + sum(throws[c(1:(2 + IsStrikeOrSpare))]),
count - 1)
} else {
return(score)
}
}
递归函数以x
作为输入,它保存分数。初始化s
核,c
计算抛出的子弹数量。
if语句检查是否抛出10轮,或者x
是否为空。如果是这样的话,则返回分数。否则,该函数将按如下方式调用自己:
它从x
中删除抛出,方法是检查它是否是一次罢工。如果是这样,则删除第一个条目,否则删除前两个条目。(S=x[1]!=10)
检查罢工情况。我们删除(-
)索引0:S
,其中如果是罢工,S
是1,如果不是,则为0。然后我们添加一个:-(0:(x[1]!=10)+1)
。我们将缩短的x
传递到下一次呼叫。
至于得分,这是通过采取x[1:2]
,如果这是一个定期转弯,而x[1:3]
,如果它是一个打击或备战。我们检查sum(x[1:2])
是否大于或等于10。如果是罢工,显然是这样。如果是备用的,那么这个也能用。如果这是真的,我们将x[3]
加到和中。然后将其添加到s
中。
发布于 2012-10-17 14:00:22
接受数组中的输入,首先添加所有元素,然后搜索备用和罢工奖金。
s,p,t,r=0,0,1,1
o=ARGV
o.each_with_index do |m,n|
y=m.to_i
s+=y
if r<10
p+=y
if p==10&&t==1
r,p=(r+1),0
s+=o[n+1].to_i+o[n+2].to_i
elsif p<10&&t==1
t=2
elsif p<10&&t==2
t,p,r=1,0,(r+1)
elsif p==10&&t==2
t,p,r=1,0,(r+1)
s+=o[n+1].to_i
end end end
puts s
https://codegolf.stackexchange.com/questions/8634
复制相似问题