Pythonでfizzbuzz

Contents:

for文を使った例

1
2
3
4
5
6
7
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
for i in range(0,100):
  if   i % 3  == 0: print "fizz"
  elif i % 5  == 0: print "buzz"
  elif i % 15 == 0: print "fizzbuzz"
  else:             print i

ジェネレータを使う

無限に値を生成するなら、

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

def fb():
  i = 0
  while True:
    i = i + 1
    if   i % 3  == 0: yield "fizz"
    elif i % 5  == 0: yield "buzz"
    elif i % 15 == 0: yield "fizzbuzz"
    else:             yield i

f = fb()
for i in range(0,100):
  print f.next()

上限を設けるならこう。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/usr/local/bin/python
# -*- coding: utf-8 -*-

def fb(m):
  for i in range(1, m):
    if   i % 3  == 0: yield "fizz"
    elif i % 5  == 0: yield "buzz"
    elif i % 15 == 0: yield "fizzbuzz"
    else:             yield i

for i in fb(100):
  print i

FizzBuzzだとあまり違いは見えないけれど、使い方は違う。

文字列を使う

Pythonでは文字 * 数値で文字列を生成できる

>>> "a" * 3
'aaa'

それぞれ、以下のような定義であるため True/Falseをかけると字が表示される/されない

>>> False == 0
True
>>> True == 1
True
>>> "a" * True
'a'
>>> "a" * False
''

なのでこういうのもあり。

1
2
3
4
5
6
7
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
for i in range(0,100):
  s = ""
  s = "fizz" * (i % 3 == 0) + "buzz" * (i % 5 == 0)
  if s == "": s = i
  print s

内包リスト

内包リストでできるか考える。

まず、内包リストによって、以下のように数字は列挙可能。

>>> print "\n".join(str(c) for c in range(1,3))
1
2
(rangeのmax-1までしか出ない)

ここで、文字列に対する論理演算を利用する。 (結果論から使っているだけですが、Pythonの仕様なんでしたっけ?)

>>> "a" or "b"
'a'
>>> "a" and "b"
'b'
>>> "" or "b"
'b'
>>> "" and "b"
''

となるのを利用して、以下の通りになる。

1
2
3
#!/usr/local/bin/python
# -*- coding: utf-8 -*-
print "\n".join("fizz" * (c % 3 == 0) + "buzz" * (c % 5 == 0) or str(c) for c in range(1,101))