TJSで遊ぶ #01

何だか知らないけど、このブログは報告とかしかなくてツマラナイなーって思ったので、少しずつ技術よりなことも書いていきます…


吉里吉里ではTJSというスクリプト言語が動きます

TJSはJavaScriptっぽい感じの言語で、JSとかを書いたことがある人ならさほど苦にならない感じで組むことが出来ます

文法的な話はググれば沢山出てくるし、書籍などもあり、僕が下手に書くのはヨロシクないような気がするので、ここでは実際にコードを書いて僕が悩んでることとかを書いておこうと思います…


文法をひと通り勉強した直後に書いたエラトステネスの篩

var MAX_NUM = 100;
var arr = [];
for(var i = 2; i<MAX_NUM; i++){
	arr[i] = 0;
}
for(var i = 2; i<MAX_NUM; i++){
	if(arr[i] == 0){
		for(var j = 2; i*j < MAX_NUM; j++){
			arr[i*j] = 1;
		}
		Debug.message(i);
	}
}

ガーッと書いて、特に躓くところは無かったんですが、ビミョーに配列の辺りで「う~ん」って感じはしました

僕的には

var arr = new Array(100);

って書きたいんですが、こうやるとSyntax Errorを吐かれる…

仕方がないので

var arr = [];
for(var i=0; i<100; i++){
    arr[i] = 0;
}

と書いているのですが…

もっと良い書き方はないのか…?


次にKAGとTJSでクイックソートを書いてみました

クイックソート書いてみた[l][r]
元の配列データ[r]
6, 3, 1, 7, 0, 4, 8, 5, 2, 9[l][r]

@eval exp="f.num = [6, 3, 1, 7, 0, 4, 8, 5, 2, 9]"

@iscript
function q_sort(numbers, left, right){
	var pivot, l_hold, r_hold;

	l_hold = left;
	r_hold = right;
	pivot = numbers[left];
	while(left < right){
		while((numbers[right] >= pivot) && (left < right)){
			right--;
		}
		if(left != right){
			numbers[left] = numbers[right];
			left++;
		}
		while((numbers[left] <= pivot) && (left < right)){
			left++;
		}
		if(left != right){
			numbers[right] = numbers[left];
			right--;
		}
	}

	numbers[left] = pivot;
	pivot = left;
	left = l_hold;
	right = r_hold;
	if(left < pivot){
		q_sort(numbers, left, pivot-1);
	}
	if(right > pivot){
		q_sort(numbers, pivot+1, right);
	}
}

function quickSort(_numbers, arraySize){
	q_sort(_numbers, 0, arraySize-1);
}

quickSort(f.num, f.num.length);
for(var i = 0; i<f.num.length; i++){
	Debug.message(f.num[i]);
}

@endscript


@r
ソート後の配列データ[l][r]
[emb exp="f.num[0]"], [emb exp="f.num[1]"], [emb exp="f.num[2]"], [emb exp="f.num[3]"], [emb exp="f.num[4]"], [emb exp="f.num[5]"], [emb exp="f.num[6]"], [emb exp="f.num[7]"], [emb exp="f.num[8]"], [emb exp="f.num[9]"]


クイックソートに関しては特に悩むことはありませんでしたが、最後に配列データをKAGで表示する際に、一々書いてるのがアホらしい…

何かforとかでぶん回して書きたいんですけど、どうやってやれば良いんだろう…?

探してみます…



最後にNクイーン問題

var n = 8;
var pos = [], row = [], up = [], dw = [], count = 0;

for(var _i=0; _i<n; _i++){
	row[_i] = 0;
}

for(var _i=0; _i<2*n-1; _i++){
	up[_i] = dw[_i] = 0;
}

function nqueen(c){
    if(c == n){
        count++;
        return;
    }
    for(var r = 0; r < n; r++){
        if( row[r] == 0 && up[c + r] == 0 && dw[ (c - r) + (n - 1) ] == 0 ){
            pos['col' + c] = r;
            row[r] = up[c + r] = dw[ (c - r) + (n - 1) ] = true;
            nqueen(c + 1);
            pos['col' + c] = row[r] = up[c + r] = dw[ (c - r) + (n - 1) ] = 0;
        }
    }
}

nqueen(0);
Debug.message('解は' + count + '個');

何度か書き直したんですが、最初のほうに書いてたコードだと4×4でさえ処理が帰ってこないくらい重くて…

これでも14×14くらいから「う~ん」って感じなんですが、仕方ないのかなー…?


今のところ書いたのはこれくらいです
今週中くらいにはKAG+TJSでオセロくらいは作りたいなーって思います…