エンジニアがすなる'Fizz-Buzz'といふもの
エンジニア以外はあまり気にならないはずの、
'Fizz-Buzz問題'という言葉があります。
最近良く目にしますよね。ね。ね。
どうしてプログラマに・・・プログラムが書けないのか?
これはイギリスの学校の子供たちがよくやっている遊び(というかやらさ
れている遊び)にちなんで名付けた。Fizz-Buzz問題の例はこんな感じだ。
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とか
からずに紙に書き出せるはずだ。
れている遊び)にちなんで名付けた。Fizz-Buzz問題の例はこんな感じだ。
1から100までの数をプリントするプログラムを書け。ただし3の倍数のと
きは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5
両方の倍数の場合には「FizzBuzz」とプリントすること。
きは数の代わりに「Fizz」と、5の倍数のときは「Buzz」とプリントし、3と5
両方の倍数の場合には「FizzBuzz」とプリントすること。
ちゃんとしたプログラマであれば、これを実行するプログラムを2分とか
からずに紙に書き出せるはずだ。
この問題が気になったので自分でFizz-Buzzを書いてみることにしました。
結果として、Fizz-Buzzからは、やってみることの価値を感じました。
何事も、やってみた後は他の人の技術から吸収できる量が増えます。
まだFizz-Buzzしてない人は軽くやってみると良いのでは。
Fizz-Buzz問題にPerlでとりくんでみた
最初の2分以内に書いたコード
正直ションボリ。かなり長いです。書けたけど如何なものか的な。
しかも時間に追われて、このコードが出てくるあたりが微妙です。
for (my $i = 1; $i<=100; $i++1){
my $str = ;
if(0 == $i%3){
$str .= 'Fizz';
}
if(0 == $i%5){
$str .= 'Buzz';
}
unless($str){$str = $i;}
print("$str\n");
}
my $str = ;
if(0 == $i%3){
$str .= 'Fizz';
}
if(0 == $i%5){
$str .= 'Buzz';
}
unless($str){$str = $i;}
print("$str\n");
}
普段から無駄なコードを省く努力をしなくては。
まずはforを簡略化
forはPerlなら、以下のように短く書けるので書きます。
for my $i (1..100){
my $str = ;
if(0 eq $i%3){
$str .= 'Fizz';
}
if(0 eq $i%5){
$str .= 'Buzz';
}
unless($str){$str = $i;}
print("$str\n");
}
my $str = ;
if(0 eq $i%3){
$str .= 'Fizz';
}
if(0 eq $i%5){
$str .= 'Buzz';
}
unless($str){$str = $i;}
print("$str\n");
}
次にifを短くする。
次に、if文の括弧が目に付くので取ります。
ifの条件を囲む括弧も取れますが、
条件には括弧が付く方が好みなので、そのままにします。
for my $i (1..100){
my $str = ;
$str .= 'Fizz' if(0 == $i%3);
$str .= 'Buzz' if(0 == $i%5);
unless($str){$str = $i;}
print("$str\n");
}
my $str = ;
$str .= 'Fizz' if(0 == $i%3);
$str .= 'Buzz' if(0 == $i%5);
unless($str){$str = $i;}
print("$str\n");
}
unlessを取る。
単に$strが空のときに対応するだけなので、
unlessとprintの行は1行にできます。
for my $i (1..100){
my $str = ;
$str .= 'Fizz' if(0 eq $i%3);
$str .= 'Buzz' if(0 eq $i%5);
print $str || $i;
}
my $str = ;
$str .= 'Fizz' if(0 eq $i%3);
$str .= 'Buzz' if(0 eq $i%5);
print $str || $i;
}
最初より断然分かりやすくなりました。
これ以上、コード量を少なくすると何をやっているのか、
混乱する気がするので、僕はこのくらいで良いかな。
Fizz-Buzz問題にとりくんだ感想
Fizz-Buzz問題の解法は無数に考えられます。
僕のコードよりも洗練されたコードを書いている人は多いです。
僕は彼らを尊敬します。
すごく簡単なコードを、さらに洗練しようと努力することが、
自分の実力を大きく引き上げることにつながることを体感できて
うれしかったです。
良くしよう、短くしようとすることが楽しくて仕方がない!
Fizz-Buzz問題に取り組まれた方の資料
- TAKESAKO @ Yet another Cybozu Labs: FizzBuzz - Golf Challenge
takesakoさんの記事が大変にまとまっているので、
この記事だけ読めば、大体のことが分かると思いました。
この手の問題は、今後もチャレンジしよっと。
最初に書いたショボいコードも隠さずに見せたいと思います。
それで、数年後に自分で見てウヒーとなる予定です。www
投稿者:としのり 日時:23:59:59 | コメント | トラックバック() |
