Kotlin Advent Calendar 2012 (全部俺)

JavaプログラマのためのKotlin入門

8日目:ここまでのまとめと練習問題

f:id:ngsw_taro:20121208105508j:plain

8日目の今日は、これまでの内容の簡単な振り返りと、ちょっとした練習問題を通してKotlinともっと仲良くなりましょう。

前回までの総集編

1日目:アドベントカレンダーはっじまっるよー!

Kotlinの概要、学ぶモチベーションについてお話ししました。Kotlinを常套句の羅列で説明するなら次のようになります。

静的型付けはコンパイルタイムで型安全性を保証してくれ、また動的言語(インタプリタ言語)よりも実行速度が早い傾向があります。

オブジェクト指向関数型プログラミング、それぞれの思想が共存することにより、データと操作のカプセル化という馴染み深い方法をとりながら、関数をより抽象化しやすく、記述も簡潔になります。

Java仮想マシン上で動作するため、JVM言語の長所をそのまま引き継ぎます。つまりJavaで記述されたライブラリなどの既存の資産を活用できることや、プラットフォームに依存しない(と言われているw)、安全、高速などが挙げられます。

2日目:Kotlin名所見学ツアー

Kotlinの特徴的な機能を巡るツアーに出かけました。ここで説明するよりも実際に足を運んだ方がわかりやすいかも知れません。

3日目:Kotlinの開発環境

Kotlinの開発環境を2つ紹介しました。Webブラウザ越しに使用できるWeb Demoとマシンにインストールして使うIDEのIntelliJ IDEAです。Kotlinの学習をしたり、ちょっと試したいコードがある場合、たいていはWeb Demoで事足ります。この後取りかかる練習問題もWeb Demoで実行可能な問題です。

4日目:Kotlinで世界に挨拶をしよう

HelloWorldプログラムを通して、Kotlinプログラミングの基本的な部分をざっと眺めました。

5日目:変数と型

変数宣言の方法を学びました。Kotlinには変更可能な変数と変更不可の変数があります。それぞれキーワード var、val を付けて宣言します。変数の型は変数名の後に記述します。が、型推論に頼ることで型を明示的に記述する必要がない場合もあります。

数値型、文字型、真偽値型、文字列、Unit型と、それぞれのリテラルを学びました。Kotlinには暗黙の型変換がないこともここで紹介しました。

6日目:人生は選択の連続

if式とwhen式による条件分岐、when式の簡単なパターンマッチを取り扱いました。式の名の通り、if式とwhen式は値を返します。将来的には、より複雑なパターンマッチもできるようになりそうです。

7日目:コードは繰り返す

for と while によるループ構文を学びました。forループで繰り返しが可能なオブジェクトの特徴を説明しました(ある種のダックタイピングであることは2日目に少し触れました)。

練習問題

昨日も言ったとおり、条件分岐と繰り返しを勉強しましたし、Kotlinは手続き的に処理を記述できるので、これまで紹介した内容であらゆるアルゴリズムを記述できるはずです。関数やクラスの定義方法はまだ紹介してしないので、関数 main がひとつあるだけのコードになると思いますが、そんなことは気にしないでKotlinで遊んでみましょう!美しい方法はクリスマスまでに紹介します。

その1:九九

1 x 1 = 1, 1 x 2 = 2, 1 x 3 = 3, ..., 9 x 7 = 63, 9 x 8 = 72, 9 x 9 = 81という感じの等式を標準出力に書いていきます。フォーマットは自由ですが、等式ひとつ書くたびに改行した方が見やすいかも。

その2:FizzBuzz

1から100までの範囲でFizzBuzzをやりましょう。FizzBuzzをご存じない方はhttp://ja.wikipedia.org/wiki/Fizz_Buzzをご覧ください。

その3:最大公約数

2つの整数値をコマンドライン引数として受け取ります。その2つの整数値の最大公約数を求めて表示してください。

コマンドライン引数はStringの配列として関数 main の引数に渡されます。文字列から整数値に変換するには関数 toInt() を使用します。

ここでは入力チェック等はしなくてもかまいません。

どうしてもわからない方は「ユークリッドの互除法」でぐぐってみてくださいw

解答例

その1:九九

fun main(args : Array<String>) {
  for(a in 1..9) {
    for(b in 1..9) {
      println("$a x $b = ${a * b}")
    }
  }
}

その2:FizzBuzz

fun main(args : Array<String>) {
  for(n in 1..100) {
    val fizz = n % 3 == 0
    val buzz = n % 5 == 0
    
    val result = if(fizz && buzz) {
      "fizzbuzz"
    } else if(fizz) {
      "fizz"
    } else if(buzz) {
      "buzz"
    } else {
      "$n"
    }
    
    println(result)
  }
}

これが簡単なら発展問題として、剰余演算子 % を使用しないで解いてみましょう。類似問題として世界のナベアツ問題も面白いです。

その3:最大公約数

fun main(args : Array<String>) {
  var a = args[0].toInt()
  var b = args[1].toInt()
  
  while(true) {
    a %= b
    if(a == 0) break
      
    val w = a
    a = b
    b = w
  }
  
  println(b)
}

うーん、あまり良いコードではないですね。キーワード var による変更可能な変数があり、破壊的代入を行っているのが気になるところです。あと、whileループの条件式が常に true なのもイマイチ...。

まとめと次回予告

今日はKotlin Advent Calendar 2012(全部俺)を振り返りました。それから、簡単な練習問題を解いてKotlinへの理解を深めました。練習問題で書いたコードはあくまで基本的な文法のみを使用しており、Kotlinらしさが非常に少ないです。明日からはKotlinをより便利にする豊富な機能の説明をしていきます。まず手始めに明日は関数のお話です。

日記

コーヒー飲みながらアドベントカレンダー書く土曜の午後...。こういう時間、好きです。