Kotlinは静的型付けのJVM上で動作するスクリプト( statically-typed JVM-targeted programming language)です。
公式サイトによると、以下の項目を開発のゴールとしている。
- Java互換の言語であること
- Javaと同等の実行速度であること
- NullPointerError Exceptionの静的にチェックによりJavaより安全であること
- 動的型推論、高階関数、extension functionなど様々な機能による豊か、かつ簡潔な表現力をもつこと
ふーむ。ということでとりあえず書いてみる。Hello World。
package demo fun main(args : Array<string>) { println("Hello, world!") }
しかし、さすがにHello Worldしただけじゃ面白くないので、15 puzzle書いてみた。
ただの反復深化です。枝狩りなし。githubはこっち
package demo fun main(args : Array<string>) { val data = array(1,2,3,0,5,6,7,4,9,10,11,8,13,14,15,12); var limit:Int = 0; var LIMIT_MAX:Int = 20; while(limit <= LIMIT_MAX){ print(limit); if(run(data,0,-1,limit)){ break; } limit += 1; } } fun search_white_space_pos(data : Array<int>):Int{ for(i in data.indices){ if(data[i] == 0){ return i; } } return -1; } fun finish(data : Array<int>):Boolean{ for(i:Int in data.indices){ if(i == 15){ if(data[i] == 0){ return true; }else{ return false; } }else{ if(data[i] == i + 1){ continue; } return false; } } return true; } fun is_move_down(white_space_pos:Int):Boolean{ if(white_space_pos >= 12 && white_space_pos <= 15){ return false; } return true; } fun is_move_up(white_space_pos:Int):Boolean{ if(white_space_pos >= 0 && white_space_pos <= 3){ return false; } return true; } fun is_move_left(white_space_pos:Int):Boolean{ if(white_space_pos == 0 || white_space_pos == 4 || white_space_pos == 8 || white_space_pos == 12){ return false; } return true; } fun is_move_right(white_space_pos:Int):Boolean{ if(white_space_pos == 3 || white_space_pos == 7 || white_space_pos == 9 || white_space_pos == 15){ return false; } return true; } fun swap(data:Array<int>,pos1:Int,pos2:Int){ var temp:Int = data[pos2]; data[pos2] = data[pos1]; data[pos1] = temp; } fun show(data:Array<int>){ for(d in data){ print(d); print(" "); } println(); } fun run(data : Array<int>,depth:Int,previous:Int,limit:Int):Boolean{ var white_space_pos:Int = search_white_space_pos(data); if(depth > limit){ return false; } if(finish(data)){ println("found"); show(data); return true; } if(previous != 1 && is_move_down(white_space_pos)){ swap(data,white_space_pos,white_space_pos + 4); if(run(data,depth + 1,0,limit)){ return true; } swap(data,white_space_pos + 4,white_space_pos); } if(previous != 0 && is_move_up(white_space_pos)){ swap(data,white_space_pos,white_space_pos - 4); if(run(data,depth + 1,1,limit)){ return false; } swap(data,white_space_pos - 4,white_space_pos); } if(previous != 3 && is_move_left(white_space_pos)){ swap(data,white_space_pos,white_space_pos - 1); if(run(data,depth + 1,2,limit)){ return false; } swap(data,white_space_pos - 1,white_space_pos); } if(previous != 2 && is_move_right(white_space_pos)){ swap(data,white_space_pos,white_space_pos + 1); if(run(data,depth + 1,3,limit)){ return false; } swap(data,white_space_pos + 1,white_space_pos); } return false; }Kotlinっぽい機能全く使ってないけど、普通のjavascriptでも書いてる気分でかけました。とりあえずとっつきやすそう。
参考文献
- 公式ページ(English)
- コミッターの方々が作成している日本語ページ