コンテンツにスキップ

英文维基 | 中文维基 | 日文维基 | 草榴社区

Fizz Buzz

出典: フリー百科事典『ウィキペディア(Wikipedia)』
Fizz-Buzz問題から転送)

Fizz Buzz(フィズ・バズ、Bizz BuzzBuzzとも呼ばれる)は英語圏で長距離ドライブ中や飲み会の時に行われる言葉遊びである。

遊び方

[編集]

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの発言した数字に1を足した数字を発言していく。ただし、3の倍数の場合は「Fizz」(Bizz Buzzの場合は「Bizz」)、5の倍数の場合は「Buzz」、3の倍数かつ5の倍数の場合(すなわち15の倍数の場合)は「Fizz Buzz」(Bizz Buzzの場合は「Bizz Buzz」)を数の代わりに発言しなければならない。発言を間違えた者や、ためらった者は脱落となる。

ゲーム例

[編集]

ゲームは、以下のとおりに発言が進行する。

  • 1, 2, Fizz, 4, Buzz, Fizz, 7, 8, Fizz, Buzz, 11, Fizz, 13, 14, Fizz Buzz, 16, 17, Fizz, 19, Buzz, Fizz, 22, 23, Fizz, Buzz, 26, Fizz, 28, 29, Fizz Buzz, 31, 32, Fizz, 34, Buzz, Fizz, ...

FizzBuzz問題

[編集]

このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードが書けないプログラマ志願者を見分ける手法をジェフ・アトウッド英語版がFizzBuzz問題 (FizzBuzz Question) として提唱した。その提唱はインターネットの様々な場所で議論の対象になっている。

また、実際に「制限時間2分以内」「剰余演算(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」等の縛りでゲーム条件を満たすコード記述の腕試しをする者が続出した。以下はPythonによる標準的な解答例である。なお、下記解答例のi % 15 == 0i % 3 == 0 and i % 5 == 0と書いても良い。

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)

もう一つの標準的な解答例として、文字列の連結を利用することで、3の倍数かつ5の倍数(すなわち15の倍数)か否かの判定を無くしたものがある。

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

剰余演算を用いない方法としては、例えば15との最大公約数を用いた方法が考えられる。

  • 「ある自然数が3の倍数であるが、5の倍数ではない」ことは、「ある自然数と15の最大公約数が3である」ことと同義である。
  • 「ある自然数が5の倍数であるが、3の倍数ではない」ことは、「ある自然数と15の最大公約数が5である」ことと同義である。
  • 「ある自然数が15の倍数である」ことは、「ある自然数と15の最大公約数が15である」ことと同義である。
  • 「ある自然数が3の倍数でも5の倍数でもない」ことは、「ある自然数と15が互いに素である」ことと同義である。

これらを用いると、以下のように実装出来る。

import math
d = {3: "Fizz", 5: "Buzz", 15: "FizzBuzz"}
for i in range(1, 101):
    print(d.get(math.gcd(i, 15), i))

出力結果が既知であるため、最初から結果を記述しておく実装も出来る。

print("1\n2\nFizz\n4\nBuzz\nFizz\n7……(以下省略)")

Microsoft Excelの場合、1~100行目のセルに以下のように書くことで実現出来る。

  • =IF(MOD(ROW(),15)=0,"FizzBuzz",IF(MOD(ROW(),3)=0,"Fizz",IF(MOD(ROW(),5)=0,"Buzz",ROW())))
  • =IF(MOD(ROW(),3)*MOD(ROW(),5)=0,IF(MOD(ROW(),3)=0,"Fizz","")&IF(MOD(ROW(),5)=0,"Buzz",""),ROW())[1]
  • =IFERROR(LOOKUP(GCD(ROW(),15),{3,"Fizz";5,"Buzz";15,"FizzBuzz"}),ROW())[2]

また、LET、SWITCH関数が使用可能なバージョンであれば、以下のように書いても良い。

  • =LET(i,ROW(),SWITCH(0,MOD(i,15),"FizzBuzz",MOD(i,3),"Fizz",MOD(i,5),"Buzz",i))
  • =LET(i,ROW(),s,IF(MOD(i,3)=0,"Fizz","")&IF(MOD(i,5)=0,"Buzz",""),IF(s="",i,s))
  • =LET(i,ROW(),SWITCH(GCD(i,15),3,"Fizz",5,"Buzz",15,"FizzBuzz",i))

関連項目

[編集]
「3の倍数と3のつく数のときだけアホになる」という、Fizz Buzzと同様の考えのギャグを行っている。
「パチパチ7」というコーナーで、Fizz Buzzを応用したゲームを行った。こちらは7の倍数と7のつく数のときだけ手を叩くルールであった。

外部リンク

[編集]

脚注

[編集]
  1. ^ MOD(ROW(),3)*MOD(ROW(),5)=0OR(MOD(ROW(),3)=0,MOD(ROW(),5)=0)と書いても良い。
  2. ^ IFNA関数が使用可能なバージョンであれば、IFERRORの代わりにIFNAを用いても良い。