1. 程式人生 > >一行程式碼搞定ThoughtWorks面試題

一行程式碼搞定ThoughtWorks面試題

今天在微博看到一道有趣的題目。作為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。
 
現在,我們需要你完成一個程式來模擬這個遊戲,它首先接受3個特殊數,然後輸出100名學生應該報數的數或單詞。比如,
 
輸入
3,5,7
輸出(片段)


1
2
Fizz
4
Buzz
Fizz
Whizz
8
Fizz
Buzz
11
Fizz
Fizz
Whizz
FizzBuzz
16
17
Fizz
19
Buzz 

一直到100

解答:

fiz = lambda a,b,c:['Fizz'*(str(a) in str(x)) or 'Fizz'*(x%a==0)+'Buzz'*(x%b==0)+'Whizz'*(x%c==0) or x for x in range(1,101) if 0<a<b<c<10]
print fiz(3,5,7)

下面是ipython中操作的截圖。


總結

用python來描述邏輯和演算法非常爽。當然,描述資料結構c語言更合適,因為c語言有美妙的指標。

把程式碼寫的太短常常會被領導認為幹活太少了。

人們往往傾向於覺得把程式碼寫的複雜看不懂的人很牛逼,呵呵。