Scala:学習:FizzBuzzしてみよう


参考) javaでのFizzBuzz
void fizzBuzz(int n) {
  for (int i = 1; i <= n; i++) {
    if (i % 15 == 0) {
      System.out.println("FizzBuzz");
    } else if (i % 3 == 0) {
      System.out.println("Fizz");
    } else if (i % 5 == 0) {
      System.out.println("Buzz");
    } else {
      System.out.println(i);
    }
  }
}
for文はジェネレータという構文を使う 例えば 1からn (n=3)までループする場合をREPLで実行してみる。 PowerShell(コマンドプロンプトでも動きました)で "sbt" → "console" でコンソールを立ち上げたら :pasteでREPLモードにしてソースを入力。 入力したら Ctrl+D で実行。
C:\work>sbt
Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m;
port was removed in 8.0
[info] Updated file C:\work\project\build.properties: set sbt.version to 1.2.
[info] Loading project definition from C:\work\project
[info] Updating ProjectRef(uri("file:/C:/work/project/"), "work-build")...
[info] Done updating.
[info] Set current project to work (in build file:/C:/work/)
[info] sbt server started at local:sbt-server-840c8505c776f9e640b8
sbt:work> console
[info] Starting scala interpreter...
Welcome to Scala 2.12.7 (Java HotSpot(TM) 64-Bit Server VM, Java 1.8.0_201).
Type in expressions for evaluation. Or try :help.

scala> :paste
// Entering paste mode (ctrl-D to finish)

val n = 3
for { i <- (1 to n) } {
  println(i)
}

// Exiting paste mode, now interpreting.

1
2
3
n: Int = 3

scala>
javaのこんなソースは…
for (int i = 0; i <= 12; i += 3) {
  if (i % 2 == 0) {
    for (int j = 1; j <= 3; j++) {
      System.out.println(i * j);
    }
  }
}
scalaでは…
for {
  i <- (0 to 12 by 3) if i % 2 == 0
  j <- (1 to 3)
} {
  println(i * j)
}
forの {} は文であるが値は返らない (Unit型) iの値が欲しい場合は yield (いーるどぅ と呼べば良い?) を使う
val result = for {
  i <- (1 to 3)
} yield {
  i
}

if式

FizzBuzzをscalaで作ると…
def fizzBuzz(n: Int): Unit = for { i <- 1 to n } {
  if (i % 15 == 0) {
    println("FizzBuzz")
  } else if (i % 3 == 0) {
    println("Fizz")
  } else if (i % 5 == 0) {
    println("Buzz")
  } else {
    println(i)
  }
}
今回はVSCodeで作ってみる。 C:\work2フォルダを作り、そこにsample.scalaの名前で上記ソースを作成。 ただ、これだとmainが無いから動かないのかな? ということで前回のHelloWorldのソースと合体させる。 (object Hello と mainメソッドを追加)
object Hello {
    def main(args: Array[String]) = {
        fizzBuzz(15)
    }

    def fizzBuzz(n: Int): Unit = for { i <- 1 to n } {
        if (i % 15 == 0) {
            println("FizzBuzz")
        } else if (i % 3 == 0) {
            println("Fizz")
        } else if (i % 5 == 0) {
            println("Buzz")
        } else {
            println(i)
        }
    }
}

PowerShell(コマンドプロンプト)でC:\work2へ移動し "sbt"コマンドと"run"コマンドを実行

→ OK

0 件のコメント:

その他の記事