2007年5月27日日曜日

プログラムの考え方 その1

http://blog.livedoor.jp/clausemitz/archives/50656033.htmlより引用

FizzBuzz問題
というのが流行っているらしい。

Wikipedia - Fizz Buzz

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


このゲームをコンピュータ画面に表示させるプログラムとして作成させることで、コードがかけないプログラマ志願者を見分ける手法を Jeff Atwood 氏が FizzBuzz問題 (FizzBuzz Question)として提唱した。

どうしてプログラマに・・・プログラムが書けないのか?

ちゃんとしたプログラマであれば、これを実行するプログラムを2分とかからずに紙に書き出せるはずだ。怖い事実を聞きたい? コンピュータサイエンス学科卒業生の過半数にはそれができないのだ。 自称上級プログラマが答えを書くのに10-15分もかかっているのを見たこともある。

えええっ!!! なんでー??? \(◎o◎;)/

こんなの剰余演算とループの組み合わせで簡単にできるじゃん。

2分は大げさとしても10分もかかるかあ?! (´゚д゚`)

ちなみに、この問題を解くのに「剰余演算は一切使うな」という縛りをつけると
とたんに多くのプログラマーが頭をかかえるらしいけど、嘘だろー??

そんときゃ配列使えばいいじゃん。ちなみに私の解答(C言語)は以下の通り。

#include
#include

#define MAX_FIZZ_BUZZ 100
#define FIZZ      3
#define BUZZ      5

int main(int argc,const char *argv[])
{
  static int aFizzBuzz[MAX_FIZZ_BUZZ + 1];
  int aIdx;

  for(aIdx = FIZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += FIZZ){
    aFizzBuzz[aIdx] += 1;
  }
  for(aIdx = BUZZ; aIdx <= MAX_FIZZ_BUZZ; aIdx += BUZZ){
    aFizzBuzz[aIdx] += 2;
  }
  for(aIdx = 1; aIdx <= MAX_FIZZ_BUZZ; aIdx++){
    if(aIdx > 1){
      printf(", ");
    }
    switch(aFizzBuzz[aIdx]){
    case 0:
      printf("%d",aIdx);
      break;
    case 1:
      printf("Fizz");
      break;
    case 2:
      printf("Buzz");
      break;
    case 3:
      printf("Fizz Buzz");
      break;
    default:
      abort();
      break;
    }
  }
  printf("\n");

  return 0;
}

言っとくが私は高卒のDQNだし、別に天才プログラマーでもなんでもない。

とすると、このFizzBuzz問題って、実は根の深い深刻な問題かもしれない…。

0 件のコメント: