LENGTH

構文
LENGTH( 文字列 )
引数
文字列
数える文字列 (もしくは配列変数)
戻値

文字数 (配列変数時は配列サイズを返す)

ANSI(バイト)処理の場合は LENGTHB

サロゲートペア1文字を 2でカウント LENGTHS

プログラム実行例

ソウルナンバーを求める

桁が一桁になるか、ゾロ目になるまで各桁を足し続ける。

生年月日をyyyymmddの形式で指定する。

DIM n = 20000501

REPEAT
	n = digitSum(n)
UNTIL LENGTH(n) = 1 OR COPY(n, 1, 1) = COPY(n, 2, 1)

PRINT n

//////////////////////////////////////////////////
// 【引数】
//   num : 数値(正の整数) 
// 【戻値】
//   各桁の数値の和 
//////////////////////////////////////////////////
FUNCTION digitSum(num)
	DIM res = 0
	IFB VARTYPE(ABS(num, VAR_DWORD)) = num THEN		// 正の整数ならば
		FOR n = 1 TO LENGTH(num)
			res = res + VAL(COPY(num, n, 1))
		NEXT
	ELSE
		res = ERR_VALUE
	ENDIF
	RESULT = res
FEND
  1. udf.digitSum(4)
  2. script.function.LENGTH(5)
  3. script.function.COPY(5)
結果
8

ルートの中を簡単にする

\(\sqrt{450000}\)の450000を素因数分解してルートの外に出せる値を外に出す。
HASHTBL root

DIM num = 450000
DIM arr = primeFactorization(num)

FOR item IN arr
	root[item] = root[item] + 1
NEXT

DIM a = 1, b = 1

FOR n = 0 TO LENGTH(root) - 1
	IF INT(root[n, HASH_VAL] /  2) <> 0 THEN a = a * POWER(root[n, HASH_KEY], INT(root[n, HASH_VAL] /  2))
	IF (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2)) <> 0 THEN b = b * (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2))
NEXT

PRINT "√(" + num + ")=" + IIF(a <> 1, a, "") + IIF(b <> 1, "√(" + b + ")", "")

//////////////////////////////////////////////////
// 【引数】
//   array : 要素を追加する配列(参照引数) 
//   str : 追加する要素 
// 【戻値】
//   処理後の配列の中の要素の数 
//////////////////////////////////////////////////
FUNCTION arrayPush(var arr[], str)
	DIM res = RESIZE(arr, UBound(arr) + 1)
	arr[res] = str
	RESULT = res + 1
FEND

//////////////////////////////////////////////////
// 【引数】
//   expr : 評価する式 
//   truepart : 評価した式がTrueのときに返す値 
//   falsepart : 評価した式がFalseのときに返す値 
// 【戻値】
//   truepart : 評価した式がTrueのとき、falsepart : 評価した式がFalseのとき 
//////////////////////////////////////////////////
FUNCTION IIF(expr, truepart, falsepart)
	IFB EVAL(expr) THEN
		RESULT = truepart
	ELSE
		RESULT = falsepart
	ENDIF
FEND

//////////////////////////////////////////////////
// 【引数】
//   num : 素因数分解する数値 
// 【戻値】
//   素因数分解した数値を格納した配列 
//////////////////////////////////////////////////
FUNCTION primeFactorization(num)
	DIM arr[-1]
	// 偶数なら2で割り続ける
	WHILE num MOD 2 = 0
		arrayPush(arr, 2)
		num = num / 2
	WEND
	FOR n = 3 TO num
		WHILE num MOD n = 0
			arrayPush(arr, n)
			num = num / n
		WEND
	NEXT
	RESULT = SLICE(arr)
FEND

//////////////////////////////////////////////////
// 【引数】
//   配列 : 上限値を求める配列 
// 【戻値】
//   配列の上限値 
//////////////////////////////////////////////////
FUNCTION UBound(array[])
	RESULT = RESIZE(array)
FEND
  1. udf.primeFactorization(4)
  2. script.function.LENGTH(12)
  3. script.function.INT(13)
  4. script.function.POWER(13)
  5. udf.IIF(17)
結果
√(450000)=300√(5)
解説
  1. 1行目
    HASHTBL root
    
    「root」という名前の連想配列を宣言する。
  2. 3行目
    DIM num = 450000
    
    素因数分解してルートの外に出す値を指定。
  3. 4行目
    DIM arr = primeFactorization(num)
    
    primeFactorization関数で450000を素因数分解をしてその結果をarr配列に格納します。例の場合「2,2,2,2,3,3,5,5,5,5,5」が格納されます。
  4. 6-8行目
    FOR item IN arr
    	root[item] = root[item] + 1
    NEXT
    
    arr配列に格納されている数値毎に個数をカウント。例の場合{キー, 値} = {2:4, 3:2, 5:5}となります。2が4個、3が2個、5が5個という意味です。
  5. 10行目
    DIM a = 1, b = 1
    
    \(a\sqrt{b}\)
  6. 12-15行目
    FOR n = 0 TO LENGTH(root) - 1
    	IF INT(root[n, HASH_VAL] /  2) <> 0 THEN a = a * POWER(root[n, HASH_KEY], INT(root[n, HASH_VAL] /  2))
    	IF (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2)) <> 0 THEN b = b * (root[n, HASH_KEY] * (root[n, HASH_VAL] MOD 2))
    NEXT
    
    要素の数だけ配列をループ。
    [値]が2で割り切れなければ
    [キー]の[値を2で割った余り]乗をaに乗算代入する。
-PR-

カラーコードから抵抗値を計算

HASHTBL color

color["黒"] = 0;	color["茶"] = 1;	color["赤"] = 2
color["橙"] = 3;	color["黄"] = 4;	color["緑"] = 5
color["青"] = 6;	color["紫"] = 7;	color["灰"] = 8
color["白"] = 9;	color["金"] = "";	color["銀"] = ""

HASHTBL tolerance

tolerance["黒"] = "";		tolerance["茶"] = 1;		tolerance["赤"] = 2
tolerance["橙"] = 0.05;		tolerance["黄"] = "";		tolerance["緑"] = 0.5
tolerance["青"] = 0.25;		tolerance["紫"] = 0.1;		tolerance["灰"] = ""
tolerance["白"] = "";		tolerance["金"] = 5;		tolerance["銀"] = 10

DIM str = INPUT("カラーコードを入力してください。")

DIM num = LENGTH(str)

FOR i = 1 TO num - 2
	DIM res = res * 10 + color[COPY(str, i, 1)]
NEXT

res = res * POWER(10, color[COPY(str, num - 1, 1)])

PRINT res + "Ω±" + tolerance[COPY(str, num, 1)] + "%以内"
  1. script.function.INPUT(15)
  2. script.function.LENGTH(17)
  3. script.function.COPY(20,23,25)
  4. script.function.POWER(23)
結果
INPUT:15 > 黄紫橙金
47000Ω±5%以内

ポップアップメニューで選択した項目を出力(サブメニューあり)

DIM menu[] = "項目1", "項目2", "{項目2-1", "項目2-2}", "項目3", "{項目3-1", "項目3-2", "項目3-3}", "項目4", "項目5"
DIM res = POPUPMENU(menu)

// サブメニューとして指定する際に必要な「{ }」を削除
IF COPY(menu[res], 1, 1) = "{" THEN menu[res] = COPY(menu[res], 2)
IF COPY(menu[res], LENGTH(menu[res], 1)) = "}" THEN menu[res] = COPY(menu[res], 1, LENGTH(menu[res] - 1))

PRINT menu[res]
  1. script.function.popupmenu(2 script.function.copy)

今年の恵方を求める

DIM year = getYear(today())

// 西暦の下1桁
DIM y = COPY(year, LENGTH(year), 1)

SELECT y
	CASE 0;		PRINT "西南西微西"
	CASE 1;		PRINT "南南東微南"
	CASE 2;		PRINT "北北西微北"
	CASE 3;		PRINT "南南東微南"
	CASE 4;		PRINT "東北東微東"
	CASE 5;		PRINT "西南西微西"
	CASE 6;		PRINT "南南東微南"
	CASE 7;		PRINT "北北西微北"
	CASE 8;		PRINT "南南東微南"
	CASE 9;		PRINT "東北東微東"
SELEND

//////////////////////////////////////////////////
// 【引数】
//   date : 日付(”YYYYMMDD” or “YYYY/MM/DD” or “YYYY-MM-DD” or “YYYYMMDDHHNNSS” or “YYYY/MM/DD HH:NN:SS”) 
// 【戻値】
//   指定した日付の「年」 
//////////////////////////////////////////////////
FUNCTION getYear(date)
	GETTIME(0, date)
	RESULT = G_TIME_YY4
FEND

//////////////////////////////////////////////////
// 【引数】
// 
// 【戻値】
//   今日の日付 
//////////////////////////////////////////////////
FUNCTION today()
	GETTIME()
	RESULT = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
FEND
  1. udf.getYear(1)
  2. script.function.COPY(4)
  3. script.function.LENGTH(4)
結果
西南西微西

記述例

  1. LENGTHを使って文字数を数える簡単なプログラム。

    		PRINT LENGTH("文字数を数える文字列を指定")
    結果
    13