您的位置:首页 > 其它

插播题解一则: FizzBuzzWhizz

2014-05-05 15:14 585 查看
今天演示一道题及用python的一种解答,算是对前面内容的总结性应用:

FizzBuzzWhizz

你是一名体育老师,在某次课距离下课还有五分钟时,你决定搞一个游戏。此时有100名学生在上课。游戏的规则是:

1. 你首先说出三个不同的特殊数,要求必须是个位数,比如3、5、7。

2. 让所有学生拍成一队,然后按顺序报数。

3. 学生报数时,如果所报数字是第一个特殊数(3)的倍数,那么不能说该数字,而要说Fizz;如果所报数字是第二个特殊数(5)的倍数,那么要说Buzz;如果所报数字是第三个特殊数(7)的倍数,那么要说Whizz。

4. 学生报数时,如果所报数字同时是两个特殊数的倍数情况下,也要特殊处理,比如第一个特殊数和第二个特殊数的倍数,那么不能说该数字,而是要说FizzBuzz, 以此类推。如果同时是三个特殊数的倍数,那么要说FizzBuzzWhizz。

5. 学生报数时,如果所报数字包含了第一个特殊数,那么也不能说该数字,而是要说相应的单词,比如本例中第一个特殊数是3,那么要报13的同学应该说Fizz。如果数字中包含了第一个特殊数,那么忽略规则3和规则4,比如要报35的同学只报Fizz,不报BuzzWhizz。

解法:一般的写法是:

def main(seq,filt,tran):
for itemNum in seq:
if(str(filt[0]) in str(itemNum)):
print(tran[0])
else:
s=''.join([tran[i] for i in range(3) if itemNum%filt[i]==0 ])
if len(s)==0:
print(itemNum)
else:
print(s)

main(range(1,101),[3,5,7],['Fizz','Buzz','Whizz'])

我们不是一般的,我们是二班、三班、兴趣班的,所以写成这样:

(lambda seq,filt,tran:[(lambda d: (d.__setitem__('s',''.join([tran[i] for i in range(3) if itemNum%filt[i]==0 ])),(d['s'],itemNum)[len(d['s'])==0])[1],lambda d: tran[0])[str(filt[0]) in str(itemNum)]({}) for itemNum in seq])(xrange(1,101),[3,5,7],['Fizz','Buzz','Whizz'])
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: