LENGTH

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

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

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

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

プログラム実行例

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

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]

Tempフォルダのフォルダをデスクトップに移動

CONST ssfDesktop = 0 CONST TemporaryFolder = 2 DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject") DIM Folder = FSO.GetSpecialFolder(TemporaryFolder) DIM source = FSO.BuildPath(Folder.Path, "NewFolder") DIM Shell = CREATEOLEOBJ("Shell.Application") Folder = Shell.NameSpace(ssfDesktop) DIM path = Folder.Self.Path DIM destination = path + IIF(COPY(path, LENGTH(path)) = "\", "", "\") FSO.MoveFolder(source, destination) ////////////////////////////////////////////////// // 【引数】 // 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

Tempフォルダのフォルダをデスクトップにコピー

CONST ssfDesktop = 0 CONST TemporaryFolder = 2 DIM FSO = CREATEOLEOBJ("Scripting.FileSystemObject") DIM Folder = FSO.GetSpecialFolder(TemporaryFolder) DIM source = FSO.BuildPath(Folder.Path, "NewFolder") DIM Shell = CREATEOLEOBJ("Shell.Application") Folder = Shell.NameSpace(ssfDesktop) DIM path = Folder.Self.Path DIM destination = path + IIF(COPY(path, LENGTH(path)) = "\", "", "\") FSO.CopyFolder(source, destination) ////////////////////////////////////////////////// // 【引数】 // 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

今年の恵方を求める

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
結果
西南西微西

ソウルナンバーを求める

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

生年月日を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
結果
8

重み付きで数値を取得

5/10で「1」、3/10で「2」、2/10の確率で「3」を出現させます。

DIM str = "1111122233" FOR n = 1 TO 10 PRINT VAL(COPY(str, RANDOM(LENGTH(str)) + 1, 1)) NEXT
結果
2
2
1
1
3
1
1
3
3
1

ルートの中を簡単にする

\(\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
結果
√(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に乗算代入する。

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

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)] + "%以内"
結果
INPUT:15 > 黄紫橙金
47000Ω±5%以内

記述例

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

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