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)
- コミッターの方々が作成している日本語ページ