完成一樣的功能,儘可能少寫代碼
今天跟你們分享幾個有趣的kata
,剛開始作這幾個kata
的時候,我也寫了很長的代碼才完成,隨着後來對python
的深刻接觸,發現python
一些簡單卻十分強大的特性,幫助我更好的完成這些練習,在這裏總結分享給你們。python
你是一名體育老師,在某次課距離下課還有五分鐘時,你決定作一個遊戲。此時有100名學生在上課。遊戲的規則是:app
- 你首先說出三個不一樣的特殊數,要求必須是個位數,好比三、五、7。
- 讓全部學生拍成一隊,而後按順序報數。
- 學生報數時,若是所報數字是第一個特殊數(3)的倍數,那麼不能說該數字,而要說Fizz;若是所報數字是第二個特殊數(5)的倍數,那麼要說Buzz;若是所報數字是第三個特殊數(7)的倍數,那麼要說Whizz。
- 學生報數時,若是所報數字同時是兩個特殊數的倍數狀況下,也要特殊處理,好比第一個特殊數和第二個特殊數的倍數,那麼不能說該數字,而是要說FizzBuzz, 以此類推。若是同時是三個特殊數的倍數,那麼要說FizzBuzzWhizz。
- 學生報數時,若是所報數字包含了第一個特殊數,那麼也不能說該數字,而是要說相應的單詞,好比本例中第一個特殊數是3,那麼要報13的同窗應該說Fizz。若是數字中包含了第一個特殊數,那麼忽略規則3和規則4,好比要報35的同窗只報Fizz,不報BuzzWhizz。
- 不然,直接說出要報的數字。
def answer(n): return 'Fizz' if '3' in str(n) else 'Fizz'*(n%3==0) + 'Buzz'*(n%5==0) + 'Whizz'*(n%7==0) or str(n)
這裏利用python
字符串和數字0
相乘爲空字符串和or
的特性code
Write a function called sum_intervals()
that accepts an array of intervals, and returns the sum of all the interval lengths. Overlapping intervals should only be counted once.遊戲
Input | Output |
---|---|
[ [1, 2], [6, 10], [11, 15] ] | 9 |
[ [1, 4], [7, 10], [3, 5] ] | 7 |
[ [1, 5], [10, 20], [1, 6], [16, 19], [5, 11] ] | 19 |
def sum_of_intervals(intervals): return len(set(n for (x, y) in intervals for n in range(x, y)))
這裏巧妙的利用集合set
惟一性的原理字符串
What is an anagram? Well, two words are anagrams of each other if they both contain the same letters. For example:it
'abba' & 'baab' == true 'abba' & 'bbaa' == true 'abba' & 'abbba' == false 'abba' & 'abca' == false
從給定單詞列表中找出指定單詞的變位詞,例如:io
anagrams('abba', ['aabb', 'abcd', 'bbaa', 'dada']) => ['aabb', 'bbaa'] anagrams('racer', ['crazer', 'carer', 'racar', 'caers', 'racer']) => ['carer', 'racer'] anagrams('laser', ['lazing', 'lazy', 'lacer']) => []
def anagrams(word, words): return filter(lambda x: sorted(word) == sorted(x), words)
或者使用列表生成式更加清晰table
def anagrams(word, words): return [item for item in words if sorted(item)==sorted(word)]
學無止境,前路漫漫。。。function