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

私が歌川です

@utgwkk が書いている

if文のないFizzbuzz

メモリーさんマジ勘弁

for i in range(1,101): print [0,'Fizz','Buzz','FizzBuzz'][(i%3<1)+2*(i%5<1)] or i

条件分岐ありません。三項演算子もありません。あるのはfor文と配列とビット演算だけです。
仕組みは察してください。A or Bは、Aが偽だったらBを評価します。

仕組み

for i in range(1,101):

1から100までカウントアップします。

print [0,'Fizz','Buzz','FizzBuzz'][(i%3<1)+2*(i%5<1)] or i

邪悪なコードですがちゃんと通ります。
[0,'Fizz','Buzz','FizzBuzz']は配列です。
[(i%3<1)+2*(i%5<1)]はその添字です。i%3<1や、i%5<1は、真なら1、偽なら0を返します。
つまり、この添字は、

  • iが3でも5でも割り切れない → 0
  • iが3で割り切れる → 1
  • iが5で割り切れる → 2
  • iが15で割り切れる → 3

となります。
配列の添字が1、2、3のとき、対応する英字が出力されます。
配列の添字が0のとき、

print 0 or i

というふうに評価されます。A or B は、Aが偽ならBを評価します。
0は偽扱いなので、このとき変数i(カウント)が出力されます。
ね、簡単でしょ?

2013/11/29 パワーアップして再登場

for i in range(1,101): print "FizzBuzz"[((i%3<1 or i%15<1) or 5)-1 : 4*(i%5<1)*2 or 4] or i

なんだこのコード!!!!!邪悪すぎる!!!!!