ワンライナー

RubyでFizzBuzzかけたよ!+いろいろ考えてみた - ミームの死骸を待ちながら経由でちょっとやってみた。
FizzBuzz問題FizzBuzzとは - はてなキーワード


普通に書く

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

これでおk。

次は一行で書く。ん?一行で!?Pythonてそんなことできるんか??


できるらしい。
http://www.nishiohirokazu.org/blog/2006/08/python_12.html
へぇ〜、そんなことできるんや。知らなかった…


で、上のページを参考に書いてみる。使うのはfor文とif文。
これらを式に直す。
リスト内包と3項演算か。


第一弾

>>[i%15==0and"FizzBuzz"or(i%3==0and"Fizz"or(i%5==0and"Buzz"or i)) for i in range(1,101)]


リストにFizzBuzz問題の答えが格納され、表示される。
が、これでは通常の書き方のように改行されながら表示されるわけではない。
そこで、
第二弾

import sys;[i%15==0and sys.stdout.write("FizzBuzz\n")or(i%3==0and sys.stdout.write("Fizz\n")or(i%5==0and sys.stdout.write("Buzz\n")or((i%3!=0and i%5!=0)and sys.stdout.write(str(i)+"\n")))) for i in range(1,101)]

これでおk。
改行が必要な構文、式と文の違い、評価のタイミングetc...普段の書き方では得られない知識が手に入った。


メモ:3項演算の評価の流れとタイミングには注意せよ。


他人が書いたコードが読みやすいというPythonの売りとは全く逆の方向だが、あえてワンライナーに挑戦することで見えてくるものあるようだ。
これはこれで楽しいし。
西尾さんのワンライナーは現在の力では解読不能。
笑うしかねぇ。
そして76文字には及ぶべきはずもない。

追記

世の中は広いね。
なんなんだこいつらは。
anarchy golf - FizzBuzz
ちょww
どんだけなんすかww
すごすぎるよね。


ひとまず、PythonRubyに勝てないわけではないことが分かった。
しかしどうやって60バイト弱程度でFizzBuzz問題が書けるのかが分からない。