Hatena::ブログ(Diary)

ockeghem(徳丸浩)の日記 このページをアンテナに追加 RSSフィード

[PR]WAFの導入はHASHコンサルティング
 | 

2007-05-24 プログラム書法

FizzBuzzプログラム書法 13:00 FizzBuzzのプログラム書法を含むブックマーク

今話題のどうしてプログラマに・・・プログラムが書けないのか?に関して、FizzBuzz問題がネットを賑やかしてますね。

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

ワンライナーとかはゲームなのでそれにクレームをつけるのはヤボだというのは分かっているのですが、元ネタの趣旨から言うと、トリッキーなプログラムが書けることよりは、ごくフツーのプログラムを正確に素早く書けることが求められているわけです。

では、ごくフツーに書いたらどうなるかということですが、たとえばPerlで書いてみると、

#!perl
use strict;

for (my $i = 1; $i <= 100; $i++) {
    if ($i % 3 == 0 && $i % 5 == 0) {
        print "FizzBuzz\n";
    } elsif ($i % 3 == 0) {
        print "Fizz\n";
    } elsif ($i % 5 == 0) {
        print "Buzz\n";
    } else {
        print "$i\n";
    }
}

こんな感じでしょうか?

実は、FizzBuzz問題を見たときには、数秒間ためらいがありました。

  • 「3と5両方の倍数」を15の倍数と置き換えるのは妥当か?
  • 「3と5両方の倍数」を3の倍数の場合の特別なケースとするか?
  • 3、5、100の「マジックナンバー」はリテラルのまま書き下してよいのか?

それと、ワンライナーたちは、「i <= 100」ではなくて「i<101」とする例がほとんどですが、こうする理由は1文字減るからでしょうね。ですが、書法としてはまずい書き方ですよね。

FizzBuzz問題を想定どおり「入社試験」として出す場合であれば、私であれば「i < 101」を減点すると思います。

私はセキュリティを生業にしていますが、その立場からもプログラム書法は大事だなぁと思っています。セキュリティホールは一種のバグであって、バグを根絶するためにはプログラムの正しい書き方に従うことが重要だと思うからです。

 | 
Google
Connection: close