PythonでFizzBuzz問題をやってみた

PythonでFizzBuzz問題のプログラムを何通りか作ってみました。

目次

  1. FizzBuzz問題とは
  2. ループと条件分岐で解く方法
  3. ループと条件分岐を使うが分岐を減らした方法
  4. リストに正解を入れておいて呼び出す方法
  5. 辞書を使うことでデータを減らす方法

FizzBuzz問題とは

ツイッターをみていたらFizzBuzz問題というのが流れてきましたので、試しに自分でもプログラムを作ってみました。

FizzBuzz問題 というのは、下記の課題をコンピュータで解くというものです。(こちらのサイト からの引用です。)

1から100までの数をプリントするプログラムを書け。ただし3の倍数のときは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5両方の倍数の場合には「FizzBuzz」とプリントすること。

ループと条件分岐で解く方法

ぱっと見た感じ、ループと条件分岐の組み合わせで作れそうです。

おそらくこういう感じにするのがオーソドックスなのかと思います。

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

上記のコードでは、15と3と5とそれ以外の4つに場合分けして出力をします。分かり易いですね。

ループと条件分岐を使うが分岐を減らした方法

では、場合分けを1つ減らしてみます。

for i in range(1,101):
    res = ''
    if i % 3 == 0:
        res += 'Fizz'
    if i % 5 == 0:
        res += 'Buzz'
    if len(res) < 1:
        res = str(i)
    print(res)

空の文字列を作っておいて、3だったらFizzを5だったらBuzzを追加していって、文字列の長さが0だったらそのときの数字を文字として追加するわけです。 これも分かり易いですね。

リストに正解を入れておいて呼び出す方法

こんな力業はどうでしょうか。

fb_map = [
    1,
    2,
    'Fizz',
    4,
    'Buzz',
    'Fizz',
    7,
    8,
    'Fizz',
    'Buzz',
    11,
    'Fizz',
    13,
    14,
    'FizzBuzz',
    16,
    17,
    'Fizz',
    19,
    'Buzz',
    'Fizz',
    22,
    23,
    'Fizz',
    'Buzz',
    26,
    'Fizz',
    28,
    29,
    'FizzBuzz',
    31,
    32,
    'Fizz',
    34,
    'Buzz',
    'Fizz',
    37,
    38,
    'Fizz',
    'Buzz',
    41,
    'Fizz',
    43,
    44,
    'FizzBuzz',
    46,
    47,
    'Fizz',
    49,
    'Buzz',
    'Fizz',
    52,
    53,
    'Fizz',
    'Buzz',
    56,
    'Fizz',
    58,
    59,
    'FizzBuzz',
    61,
    62,
    'Fizz',
    64,
    'Buzz',
    'Fizz',
    67,
    68,
    'Fizz',
    'Buzz',
    71,
    'Fizz',
    73,
    74,
    'FizzBuzz',
    76,
    77,
    'Fizz',
    79,
    'Buzz',
    'Fizz',
    82,
    83,
    'Fizz',
    'Buzz',
    86,
    'Fizz',
    88,
    89,
    'FizzBuzz',
    91,
    92,
    'Fizz',
    94,
    'Buzz',
    'Fizz',
    97,
    98,
    'Fizz',
    'Buzz'
    ]

for i in range(1,101):
    print(fb_map[i-1])

リストに順番に結果を記入してしまって、インデックスを使って呼び出すだけです。これは速そう。

でも、FizzでもBuzzでもないデータをリストに入れるってのはどうでしょう。

辞書を使うことでデータを減らす方法

というわけで、辞書を使ってみます。

fb_map = [
    {'id':3, 'text':'Fizz'},
    {'id':5, 'text':'Buzz'},
    {'id':6, 'text':'Fizz'},
    {'id':9, 'text':'Fizz'},
    {'id':10, 'text':'Buzz'},
    {'id':12, 'text':'Fizz'},
    {'id':15, 'text':'FizzBuzz'},
    {'id':18, 'text':'Fizz'},
    {'id':20, 'text':'Buzz'},
    {'id':21, 'text':'Fizz'},
    {'id':24, 'text':'Fizz'},
    {'id':25, 'text':'Buzz'},
    {'id':27, 'text':'Fizz'},
    {'id':30, 'text':'FizzBuzz'},
    {'id':33, 'text':'Fizz'},
    {'id':35, 'text':'Buzz'},
    {'id':36, 'text':'Fizz'},
    {'id':39, 'text':'Fizz'},
    {'id':40, 'text':'Buzz'},
    {'id':42, 'text':'Fizz'},
    {'id':45, 'text':'FizzBuzz'},
    {'id':48, 'text':'Fizz'},
    {'id':50, 'text':'Buzz'},
    {'id':51, 'text':'Fizz'},
    {'id':54, 'text':'Fizz'},
    {'id':55, 'text':'Buzz'},
    {'id':57, 'text':'Fizz'},
    {'id':60, 'text':'FizzBuzz'},
    {'id':63, 'text':'Fizz'},
    {'id':65, 'text':'Buzz'},
    {'id':66, 'text':'Fizz'},
    {'id':69, 'text':'Fizz'},
    {'id':70, 'text':'Buzz'},
    {'id':72, 'text':'Fizz'},
    {'id':75, 'text':'FizzBuzz'},
    {'id':78, 'text':'Fizz'},
    {'id':80, 'text':'Buzz'},
    {'id':81, 'text':'Fizz'},
    {'id':84, 'text':'Fizz'},
    {'id':85, 'text':'Buzz'},
    {'id':87, 'text':'Fizz'},
    {'id':90, 'text':'FizzBuzz'},
    {'id':93, 'text':'Fizz'},
    {'id':95, 'text':'Buzz'},
    {'id':96, 'text':'Fizz'},
    {'id':99, 'text':'Fizz'},
    {'id':100, 'text':'Buzz'}
    ]

for i in range(1,101):
    c = [d.get('text') for d in fb_map if d['id']==i]
    if len(c) < 1:
        c = [i]
    print(c[0])

リスト内包表記がPythonぽいですね。

他にもいろいろなやり方がありそうです。

ツイッターで見た中には、関数名だけ定義して中身は外注するという人もいたらしいという話がありましたが。。。そういう場合は検収するまで課題達成とは言えないのではないかと。

広告

作ってみたカテゴリの投稿