FizzBuzzを1ライナーしてみよう
以前Python札幌勉強会の時に、
for i in ( 'fizzbuzz' if x % 15 == 0 else 'buzz' if x % 5 == 0 else 'fizz' if x % 3 == 0 else x for x in range(1, 101) ) : print i
とあったのをふとしたきっかけで短くしてみた。
まず、利用したのが短絡評価による「文字("fizz","buzz","fizzbuzz")」と「数字」を分ける
>> a = '' or 2 >> a 2 >> a = 'fizz' or 2 >> a 'fizz' >> x = 3 >> a = ['','fizz'][not x%3] or x 'fizz' >> x = 4 >> a = ['','fizz'][not x%3] or x 4
これにより、以下のソースが組み上がる
>> [['','fizz'][not x%3]+['','buzz'][not x%5]or x for x in range(1,31)] [1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz']
更に「not 」>「>0」のほうが短いので
>> [['fizz',''][x%3>0]+['buzz',''][x%5>0]or x for x in range(1,31)] [1, 2, 'fizz', 4, 'buzz', 'fizz', 7, 8, 'fizz', 'buzz', 11, 'fizz', 13, 14, 'fizzbuzz', 16, 17, 'fizz', 19, 'buzz', 'fizz', 22, 23, 'fizz', 'buzz', 26, 'fizz', 28, 29, 'fizzbuzz']