火曜日, 3月 04, 2008

せこく文字列を生成します

Taifrogです。


スキンフェア行って来ました。
あんまり色々ありすぎて目が痛くなってきたり・・・。
http://slurl.com/secondlife/VANITY%20UNIVERSE/111/9/628/

多くの日本のスキン屋さんも出展されてるようで、日本人らしいかわいい系のスキンも並んでますね。
まだやってるっぽいので、のんびり見に行きます。


さて、珍しくスクリプト書いてますが(いや、ちょこちょこ書いてはいるんです、一応)、
思いつきで作ってみたものがあります。

サンプルスクリプトとして公開されているstring2list/list2stringですが、
もっと文字列の長さをせこく少なく出来ないかと考えてみたものです。

以前ブログに書いた改良(区切り文字を減らしたやつ)に加えて、Floatの不要な(?)小数点3桁未満を切って文字列にしてみました。

例)
  362.020000 --> "362.02"
<1.000000, -34.010000, 400.000000> --> "<1.00, -34.01, 400.00>"


ただねー、変数とか関数分のメモリ使うことになるから・・・。
まあ、その辺は処理をするスクリプトと、文字列を記憶するスクリプトを分けて作るということで。

string sep = "#!$";

string list2string(list lst)
{
integer i;
integer t;
string a;
string tlst = "";
string ret = "";
integer len = llGetListLength(lst);

float gf;
vector gv;
rotation gr;

for(i = 0; i < t =" llGetListEntryType(lst," t ="=" a =" (string)llList2Integer(lst," t ="=" a =" ShortFloat(llList2Float(lst," t ="=" a =" (string)llList2Key(lst," t ="=" gv =" llList2Vector(lst," a = "<">";
} else if (t == TYPE_ROTATION) {
gr = llList2Rot(lst, i);
a = "<" + ShortFloat(gr.x) + ", " + ShortFloat(gr.y) + ", " + ShortFloat(gr.z) + ", " + ShortFloat(gr.s) + ">";
} else a = llList2String(lst, i);

tlst = tlst + (string)t;
ret = ret + sep + a;
}

return tlst + ret;
}

list string2list(string str)
{
list lst = llParseStringKeepNulls(str, [sep], []);
list ret = [];
integer len = llGetListLength(lst) - 1;
integer i;
integer t;
string tlst = llList2String(lst, 0);
if(tlst == "" llStringLength(tlst) != len) return [];

  for (i = 0; i < len; i++ ) {
t = (integer)llGetSubString(tlst, i, i);
if (t == TYPE_INTEGER) ret += (integer)llList2String(lst, i+1);
else if (t == TYPE_FLOAT) ret += (float)llList2String(lst, i+1);
else if (t == TYPE_KEY) ret += (key)llList2String(lst, i+1);
else if (t == TYPE_VECTOR) ret += (vector)llList2String(lst, i+1);
else if (t == TYPE_ROTATION) ret += (rotation)llList2String(lst, i+1);
else ret += llList2String(lst, i+1);
}

return ret;
}

string ShortFloat(float f)
{
string ret;

ret = (string)f;
ret = llGetSubString(ret, 0, llSubStringIndex(ret, ".") + 2);

return ret;
}

0 件のコメント: