こもろぐ @tenkoma

What We Find Changes Who We Become -- Peter Morville著『アンビエント・ファインダビリティ 』

広告:本ブログで紹介している書籍等商品の紹介でAmazonアソシエイトを利用していることがあります。

FizzBuzz問題

まぁ、結構短くできたかもー?(甘い)
普通に解いたらこんな感じか…しかし条件分岐が多すぎてだめだなぁ。これは。(range関数の引数を訂正しました「range(100)」→「range(1,101)」)

for i in range(1,101):
    if not(i%15):
        print "fizzbuzz"
    elif not(i%5):
        print "buzz"
    elif not(i%3):
        print "fizz"
    else:
        print i

短く。(三項演算子使用につきpython2.5以上ですいません)

for i in range(1,101):FizzBuzz = (""if(i%3)else"Fizz")+(""if(i%5)else"Buzz");print FizzBuzz if FizzBuzz else i

あ、一旦代入するなんて必要はないか。

for i in range(1,101):print(""if(i%3)else"Fizz")+(""if(i%5)else"Buzz")or i

似非ワンライナーでした。(74バイト)
すみません。ここギコみてからやる気がでたので、解き方が脳裏に焼き付いていたかもしれません。

で、他の人の回答もみてみた。

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

なんじゃこの回答はー。
調べてみると、iが自然数かつ奇数の時
例えばi%3==0のときもちろんi*i%3==0だが、i%3!=0のときはi*i%3==1と必ず1になる
例えばi%5==0のときもちろん-i**4%5==0だが、i%5!=0のときは-i**4%5==4と必ず4になる
(割られる数-1)乗すると、元の数の剰余0の時以外は剰余が必ず一定の数値になるのである。
すごい。

本当のワンライナー

ディクショナリとgetメソッドの使い方が見事です!

まだいけた。

tasukuchanさんのコメント

for i in range(1,101):print"Fizz"*(not i%3)+"Buzz"*(not i%5)or i

64バイト
なんか脳が回転してきましたよw
"not cond"より"cond==0"の方が1バイト稼げる!

for i in range(1,101):print"Fizz"*(i%3==0)+"Buzz"*(i%5==0)or i

62バイト

for i in range(1,101):print"Fizz"*(i%3<1)+"Buzz"*(i%5<1)or i

60バイト。やった、自然数トリックに追いついたw