読者です 読者をやめる 読者になる 読者になる

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']