Fizz Buzz

提供: MonoBook
ナビゲーションに移動 検索に移動

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

遊び方[編集 | ソースを編集]

プレイヤーは円状に座る。最初のプレイヤーは「1」と数字を発言する。次のプレイヤーは直前のプレイヤーの次の数字を発言していく。ただし、3で割り切れる場合は 「Fizz」(Bizz Buzz の場合は 「Bizz」)、5で割り切れる場合は 「Buzz」、両者で割り切れる場合は 「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, ...

コンピューターでの実装[編集 | ソースを編集]

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

また、実際に「制限時間2分以内」「剰余(%記号等)を用いない」「1行でできる限り短く(ワンライナー)」などの縛りでゲーム性を持たせコード記述の腕試しをする者が続出した。

C言語[編集 | ソースを編集]

C言語での実装例。

#include <stdio.h>

int main(void)
{
    int i;
    for (i = 1; i <= 100; i++) {
        if (i % 3 == 0 && i % 5 == 0) {
            printf("FizzBuzz\n");
        } else if (i % 3 == 0) {
            printf("Fizz\n");
        } else if (i % 5 == 0) {
            printf("Buzz\n");
        } else {
            printf("%d\n", i);
        }
    }
    return 0;
}

C#[編集 | ソースを編集]

C#での実装例。

using System;
using System.Collections.Generic;
using System.Linq;

namespace FizzBuzz
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            Enumerable.Range(1, int.MaxValue).Select(
                n => 
                (n % 15 == 0) ? "FizzBuzz" : 
                (n %  3 == 0) ? "Fizz" : 
                (n %  5 == 0) ? "Buzz" : 
                n.ToString())
                .ForEach(Console.WriteLine);
        }
    }

    static class IEnumerableExtensions
    {
        public static void ForEach<TSource>(this IEnumerable<TSource> source, Action<TSource> action)
        {
            foreach (var item in source)
            {
                action(item);
            }
        }
    }
}

Haskell[編集 | ソースを編集]

Haskellでの実装例。

let f n
  |m 15 = "fizzbuzz"
  |m 5  = "buzz"
  |m 3  = "fizz"
  |True = show n where m x = mod n x == 0 in map f [1..100]

F#[編集 | ソースを編集]

F#による実装。

[1..100] 
|> Seq.map (function
    | x when x%5=0 && x%3=0 -> "FizzBuzz"
    | x when x%3=0 -> "Fizz"
    | x when x%5=0 -> "Buzz"
    | x -> string x)
|> Seq.iter (printfn "%s")

関連項目[編集 | ソースを編集]

外部リンク[編集 | ソースを編集]