エンジニアがすなる'Fizz-Buzz'といふもの

[perl]

エンジニア以外はあまり気にならないはずの、
'Fizz-Buzz問題'という言葉があります。
最近良く目にしますよね。ね。ね。

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

これはイギリスの学校の子供たちがよくやっている遊び(というかやらさ
れている遊び)にちなんで名付けた。Fizz-Buzz問題の例はこんな感じだ。
1から100までの数をプリントするプログラムを書け。ただし3の倍数のと
きは数の代わりに「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");
}

普段から無駄なコードを省く努力をしなくては。
まずは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");
}

次に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");
}

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;
}

最初より断然分かりやすくなりました。

これ以上、コード量を少なくすると何をやっているのか、
混乱する気がするので、僕はこのくらいで良いかな。
Fizz-Buzz問題にとりくんだ感想

Fizz-Buzz問題の解法は無数に考えられます。
僕のコードよりも洗練されたコードを書いている人は多いです。
僕は彼らを尊敬します。
すごく簡単なコードを、さらに洗練しようと努力することが、
自分の実力を大きく引き上げることにつながることを体感できて
うれしかったです。
良くしよう、短くしようとすることが楽しくて仕方がない!
Fizz-Buzz問題に取り組まれた方の資料

- TAKESAKO @ Yet another Cybozu Labs: FizzBuzz - Golf Challenge
takesakoさんの記事が大変にまとまっているので、
この記事だけ読めば、大体のことが分かると思いました。




この手の問題は、今後もチャレンジしよっと。
最初に書いたショボいコードも隠さずに見せたいと思います。
それで、数年後に自分で見てウヒーとなる予定です。www

投稿者:としのり  日時:23:59:59 | コメント | トラックバック() |