Contents
- 構文
- 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行目
「root」という名前の連想配列を宣言する。HASHTBL root
- 3行目
素因数分解してルートの外に出す値を指定。DIM num = 450000
- 4行目
primeFactorization関数で450000を素因数分解をしてその結果をarr配列に格納します。例の場合「2,2,2,2,3,3,5,5,5,5,5」が格納されます。DIM arr = primeFactorization(num)
- 6-8行目
arr配列に格納されている数値毎に個数をカウント。例の場合{キー, 値} = {2:4, 3:2, 5:5}となります。2が4個、3が2個、5が5個という意味です。FOR item IN arr root[item] = root[item] + 1 NEXT
- 10行目
\(a\sqrt{b}\)DIM a = 1, b = 1
- 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%以内
記述例
-
LENGTHを使って文字数を数える簡単なプログラム。
PRINT LENGTH("文字数を数える文字列を指定")
- 結果
- 13