2013年1月26日土曜日

PythonでFizzBuzzとかしてみた

前回のエントリーでFizzBuzzをやる宣言したので帰りの電車の中で書いてみました。

まずは思うがままに書いてみた
int = int(raw_input("Please enter an integer: "))

def do_fizz(int):
    if (int % 3) == 0:
        return 1
    return 0

def do_buzz(int):
    if (int % 5) == 0:
        return 2
    return 0

def do_answer(fizz, buzz):
    flag = fizz + buzz
    if flag == 0:
        print int #引数に居なくても外のintを参照出来る
    elif flag == 1:
        print "Fizz"
    elif flag == 2:
        print "Buzz"
    elif flag == 3:
        print "FizzBuzz"

do_answer(do_fizz(int), do_buzz(int))
ちょっと変わったことしたいなーとか思ってるうちに何も出来ずに完成するという例w
後から文言変えやすいようにしてみたつもり。
Pythonは変数のスコープは内から外が参照できるのでintを引数にしてなくてもprintの際は参照出来ます。
でコレ書いた後、「Pythonって三項演算子どうやるんだろ?」って思ったんで調べて使ってみた。

int = int(raw_input("Please enter an integer: "))
flag = range(2) #Listのデータを入れ替えるのに宣言しないと出来なかった…
flag[0] = ((int % 3 == 0 and 1) or 0)
flag[1] = ((int % 5 == 0 and 2) or 0)

def do_answer(fizz, buzz):
    flag = fizz + buzz
    if flag == 0:
        print int
    elif flag == 1:
        print "Fizz"
    elif flag == 
        print "Buzz"
    elif flag == 3:
        print "FizzBuzz"

do_answer(*flag) #[fizz, buzz]のListが渡ってる
ついでに関数の引数をListで与える方法も試してみた。
ただこの場面での使い方があまりにもダサくてこれだったら普通に
fizz = ((int % 3 == 0 and 1) or 0)
buzz = ((int % 5 == 0 and 2) or 0)
って書いて渡した方がキレイですね。
phpの
$flag[] = (int % 3 == 0) ? 1 : 0;
$flag[] = (int % 5 == 0) ? 2 : 0;

$flag['fizz'] = (int % 3 == 0) ? 1 :0;
$flag['buzz'] = (int % 5 == 0) ? 2 :0;
みたいにいきなりList(配列)を作る書き方がPythonでも出来ると思うんだけど知識不足。
公式チュートリアルやったらどっかで出てくるかな?w

で最後はみんな大好き再帰。
折角なのでループ文を使わずに与えられたintまでの1からの和を出してみました。
num = int(raw_input("Please enter an integer: "))

def sum(num, answer = 0):
    answer = answer + num
    num -= 1
    if num == 0: return answer
    return sum(num, answer)

print sum(num)
等差等級の和は方程式出るのでループ回さなくても解けるのでそっちも試してみた。
start = int(raw_input("Please enter an integer: "))
end = int(raw_input("Please enter an integer: "))
print (start+end)*(end-start+1)/2
関数の定義すら要らなかったw
やっぱアルゴリズムの最適化が一番大事ってことですね!!

ということで帰りの電車の中で出来るPythonでした。
気軽に楽しめるのでみなさんもお好きな言語でどうぞ。

2 件のコメント:

  1. PEP8という、Pythonのコードを書く時のコーディング規約をご覧になると
    もう少しだけハッピーになるかもしれません。
    http://oldriver.org/python/pep-0008j.html
    (原文の英語=最新のものを読むのがオススメですが。)

    あと、3項演算子は
    fizz = 1 if x % 3 == 0 else 0
    と書くことができます。

    また、listを一気に作るには
    flags = [1 if x % 3 == 0 else 0, 1 if x % 5 == 0 else 0]
    とすればできます。

    ご参考になれば幸いです!

    返信削除
    返信
    1. 丁寧な解説ありがとうございます!
      三項演算子やListの書き方はそんな書き方も出来るのですね。

      とても参考になりました。
      次回の岡山Python勉強会でみんなに伝えようと思います。

      http://atnd.org/events/36438

      削除