Breaking News
Home / プログラミング / 2010sPL / 【あなたの実力は?】FizzBuzz問題をRuby、Python、Elixirで解く

【あなたの実力は?】FizzBuzz問題をRuby、Python、Elixirで解く


あなたはFizzBuzz問題をご存知ですか?

FizzBuzz問題が解けなきゃエンジニアじゃない!とまで言われる超有名な問題です。

FizzBuzz問題は調べてみると非常に奥が深く、様々な解法があるため、その一部をご紹介します。

FizzBuzz問題とは

英語圏にあるFizzBuzzという遊びをプログラミングで実装するのがFizzBuzz問題です。基本的なコードを書けるかどうかを判別するためによく利用されます。

ルール(下記)自体はシンプルですが様々な実装方法があります。最速で動作するコードを書いたり、できるだけコードを短く書いたり、縛りをつけて書いたり、と色々な楽しみ方ができます。

これができなきゃエンジニアは名乗れない、というくらいに基本的な問題ですので、ぜひ解いてみてください。

FizzBuzz問題の内容

1から100の数字について以下の条件で出力しなさい。

もし数字が15の倍数の時はFizzBuzzを
3の倍数かつ5の倍数でないときはFizzを
5の倍数かつ3の倍数でないときはBuzzを
3の倍数でも5の倍数でもないときはその数字を出力する。

OutPutのイメージはこちら

これを1から100まで実装します。改行はしてもしなくても構いませんが、した方が見やすいので今回は改行します。

シンプルなFizzBuzz問題の解法(Ruby,Python)

こんな感じでしょうか。

だいたいどの言語でも同じような感じになるかと思います。

Case節を使ったFizzBuzz問題の解法(Ruby)

Case節を使うとこのように記述できます。

if節、剰余を使わず配列を利用したFizzBuzz問題の解法(Python)

これは解説が必要でしょうか。print文においてorを使うと、
このような挙動をします。orは、左側が真ならそこで評価をやめ、その値を返します。左側が偽やNoneの時には右の値を返します。

集合を利用したFizzBuzz問題の解法(Python)

なぜ集合を利用したのかと問われれば、集合という機能があったからです。

始めに100までの数字を用意して3の倍数、5の倍数をremoveすると言う手法でときましたが、3の倍数、5の倍数をaddして集合を作ったほうが自然でした。

Elixirらしい?FizzBuzz問題の解法

最後はマイブームのElixirで解いてみます。縛り条件は

  • ifを使わない
  • 剰余を使わない
  • ガード節を使わない
  • 3進数、5進数を使わない

です。

Fizzの方は「ある数の各桁の和が3の倍数であれば、その数は3の倍数である」という性質を利用しています。

Buzzの方は最後の一桁を参照して、5か0であればBuzzを返すようにしています。

まとめ

FizzBuzz問題には実に多様な解法が存在しています。新しい解法を考えるのは楽しいことなのでぜひチャレンジしてみてください。


About aimof

Twitter: @aimof_ github: aimof プログラミング歴半年くらいの学生エンジニアです。

Check Also

elixir

【今Phoenixが熱い】Elixirのおすすめ書籍4選!

ElixirとPhoenixが …