メモリーさんマジ勘弁
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
なんだこのコード!!!!!邪悪すぎる!!!!!