似非プログラマのうんちく

「似非プログラマの覚え書き」出張版

Scala でとことん FizzBuzz する(その 1)

プログラミングをこよなく愛する皆さん、今日も元気に FizzBuzz してますか !

FizzBuzz って何 ?」という人から「FizzBuzz が何の役に立つんだよ」という人まで、今回は存分に FizzBuzz を楽しめる(?)連載を始めますよ !

FizzBuzz」とは何か

FizzBuzz。それはもっぱら英語圏で行われるちょっとしたレクリエーションのようなものである。数人が輪になって、最初の人から順々に数字を 1 から順に 100 まで言っていくのであるが、

  • 数字が 3 の倍数(3, 6, ...)のときは数字を言う代わりに「Fizz」と言う
  • 数字が 5 の倍数(5, 10, ..)のときは数字を言う代わりに「Buzz」と言う
  • 上記の両方に当てはまるとき、つまり数字が 15 の倍数(15, 30, ...)のときは数字を言ったり「Fizz」や「Buzz」と言う代わりに「FizzBuzz」と言う
  • それ以外のときは普通に数字を言う

という遊びである。これをプログラミングでやるときは、1 から 100 まで出力させ、その際に数字が 3 の倍数だったり 5 の倍数だったりするときにその出力を上記の文字列で置き換えて表示させるプログラムを組むことを FizzBuzz と言っている。

何故 FizzBuzz なのか

何故 FizzBuzz をプログラミングすることがそんなに大事なのかというと

  • 入出力
  • 反復
  • 条件分岐

の要素に習熟することに大変優れているから、というのが通説のようである。とりわけ反復と条件分岐が強調されることが多い。入出力は、いわゆる標準入出力はもちろんだが、広く「関数の in と out の関係」についても学ぶことが出来る。

参考 : 最終鬼畜FizzBuzz大全 - Qiita

原始 FizzBuzz

今回は Scala による FizzBuzz の様々な実装を考えてみることにする。まず最も素朴な FizzBuzz はこうなるだろう。

package jp.mydns.akanekodou.scala

object Main {
  def main(args : Array[String]) : Unit = {
    for (n <- 1 to 100) {
      if (n % 3 == 0) {
        if (n % 5 == 0)
          println("FizzBuzz")
        else
          println("Fizz")
      } else if (n % 5 == 0) {
        println("Buzz")
      } else {
        println(n)
      }
    }
  }
}

我々はこのソースコードからスタートして、さまざまな改造をしていくことになる。

SBT(Simple Build Tool)の導入

Scala プログラミングにおけるビルドツールの定番とされているのが SBT である。今回はこいつを使ってプロジェクトを作り、管理していく。Windows であれば MSI 形式のインストーラが配布されているのでインストールは難しくない。

プロジェクトの作成

まずプロジェクトのルートとなるディレクトリを作る。その中に build.sbt というファイル名で SBT 用の設定ファイルを作る。中身はこんな感じ。

name := "FizzBuzz"

version := "1.0"

scalaVersion := "2.11.6"

空行は省略できない。次にソースファイルを配置するフォルダの作成。プロジェクトルートで

> mkdir src\main\scala\jp\mydns\akanekodou\scala

作ったフォルダに先ほどのソースコードMain.scala というファイル名で保存し配置する。

プロジェクトのビルドと実行

プロジェクトルートで

> sbt

を実行する。初回起動時は必要なライブラリをダウンロードしてくるため時間が掛かる。気長に待とう。プロンプトが帰ってきたら

> compile
> run

コンパイル→実行できる。さて、意図した通りにプログラムは動いたかな ?