本ページには広告が含まれています。
目次
文字数もしくは配列サイズを返します。配列のサイズを求めるときはLENGTHBだとエラーが発生します。
- 構文
- LongWord = LENGTH( 文字列 )
- LongWord = LENGTHB( 文字列 )
- LongWord = LENGTHS( 文字列 )
- LongWord = LENGTH( 文字列 )
- 引数
- 文字列 (String,Array)必須
- 数える文字列(もしくは配列変数)
- 戻り値
文字数 (配列変数時は配列サイズを返す)
ANSI(バイト)処理の場合は LENGTHB
サロゲートペア 1文字を2でカウント LENGTHS
使い方
文字列の文字数を取得
引数に指定した文字列の文字数を数えます。「こんにちは」は5文字なので「5」、「Hello!」は6文字なので「6」を返します。
PRINT LENGTH("こんにちは")
PRINT LENGTH("Hello!")
- 結果
5 6
文字列のバイト数を取得
文字列のバイト数を取得するにはLENGTHB関数を使います。半角1文字=1Byte、全角1文字=2Byteです。「こんにちは」は全角5文字なので「10」、「Hello!」は半角6文字なので「6」を返します。
PRINT LENGTHB("こんにちは")
PRINT LENGTHB("Hello!")
- 結果
10 6
サロゲートペア文字
LENGTH関数では文字数を数えるので「𠮷野家」で3文字なので「3(=1+1+1)」、LENGTHB関数はバイト数を数えるので全角3文字なので「6(=3×2)」、LENGTHSはサロゲートペア文字の「𠮷」を2、それ以外は1で数えるので「4(=2+1+1)」となります。
PRINT LENGTH("𠮷野家")
PRINT LENGTHB("𠮷野家")
PRINT LENGTHS("𠮷野家")
- 結果
3 6 4
プログラム実行例
入力された文字列の計算をする
HASHTBL variable
DIM array[-1]
DIM res = EMPTY
WHILE TRUE
DIM %val% = ""
FOR i = 0 TO LENGTH(variable) - 1
%val% = %val% + variable[i, HASH_KEY] + "=" + variable[i, HASH_VAL] + " "
NEXT
DIM str = INPUT("計算式を入力してください。<#CR><#CR>変数<#TAB>" + %val% + "<#CR>結果<#TAB>" + res)
IFB POS("=", str) THEN
DIM arr = SPLIT(str, "=")
TRY
variable[arr[0]] = EVAL(arr[1])
EXCEPT
FUKIDASI(TRY_ERRMSG)
CONTINUE
ENDTRY
ENDIF
FUKIDASI()
res = EVAL(REPLACE(str, "=", ":="))
IF res = EMPTY THEN BREAK
WEND
結果
INPUT:10>a=2
INPUT:10>b=3
INPUT:10>a*b
6
使用関数
ルートの中を簡単にする
\(\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 : 要素を追加する配列(参照引数)
// values : 追加する要素をvalue1から指定
// 【戻り値】
// 処理後の配列の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
DIM i = 1
WHILE EVAL("value" + i) <> EMPTY
DIM res = RESIZE(array, UBound(array) + 1)
array[res] = EVAL("value" + i)
i = i + 1
WEND
RESULT = LENGTH(array)
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]
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
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// arrayname : 上限値を求める配列の名前
// dimension : 返す次元を示す整数
// 【戻り値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
結果
√(450000)=300√(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]
使用関数
オブジェクトを作成したアプリケーションを示す数値を取得
DIM Excel = CREATEOLEOBJ("Excel.Application")
Excel.Visible = TRUE
Excel.Workbooks.Add()
DIM dec = Excel.Worksheets.Creator
DIM hex = decToHex(dec)
DIM str = ""
FOR i = 1 TO LENGTH(hex) STEP 2
str = str + CHR("$" + COPY(hex, i, 2))
NEXT
PRINT "32bit," + dec
PRINT "32bit(16進数),0x" + hex
PRINT "文字," + str
Excel.Quit
//////////////////////////////////////////////////
// 【引数】
// bin : 2進数
// 【戻り値】
// 16進数に変換した値
//////////////////////////////////////////////////
FUNCTION binToHex(bin)
HASHTBL bh
bh["0000"] = "0"; bh["0001"] = "1"; bh["0010"] = "2"; bh["0011"] = "3";
bh["0100"] = "4"; bh["0101"] = "5"; bh["0110"] = "6"; bh["0111"] = "7";
bh["1000"] = "8"; bh["1001"] = "9"; bh["1010"] = "A"; bh["1011"] = "B";
bh["1100"] = "C"; bh["1101"] = "D"; bh["1110"] = "E"; bh["1111"] = "F";
// 小数ならば
IFB POS(".", bin) <> 0 THEN
DIM num = COPY(bin, 1, POS(".", bin) - 1)
DIM frac = COPY(bin, POS(".", bin) + 1)
num = strPad(num, CEIL(LENGTH(num) / 4) * 4, "0", LEFT)
frac = strPad(frac, CEIL(LENGTH(frac) / 4) * 4, "0", RIGHT)
DIM hex = ""
FOR i = 1 TO LENGTH(num) STEP 4
hex = hex + bh[COPY(num, i, 4)]
NEXT
hex = hex + "."
FOR i = 1 TO LENGTH(frac) STEP 4
hex = hex + bh[COPY(frac, i, 4)]
NEXT
RESULT = hex
ELSE
len = CEIL(LENGTH(bin) / 4) * 4
FOR i = 1 TO len - LENGTH(bin)
bin = "0" + bin
NEXT
bin = REPLACE(FORMAT(bin, len), " ", "0")
hex = ""
FOR i = 1 TO LENGTH(bin) / 4
str = COPY(bin, i * 4 - 3, 4)
hex = hex + bh[str]
NEXT
RESULT = hex
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// num : 10進数もしくは2進数の値
// bit : ビット
// 【戻り値】
// ビットを反転した値
//////////////////////////////////////////////////
FUNCTION bitNot(num, bit = EMPTY)
IFB isString(num) THEN
DIM res = ""
FOR i = 1 TO LENGTH(num)
DIM str = COPY(num, i, 1)
IFB str = "0" OR str = "1" THEN
res = res + (1 - VAL(str))
ELSE
res = res + str
ENDIF
NEXT
RESULT = res
ELSE
DIM exponent = IIF(bit = EMPTY, CEIL(LOGN(2, num + 1)), bit)
RESULT = POWER(2, exponent) - num - 1
ENDIF
FEND
//////////////////////////////////////////////////
// 【引数】
// dec : 10進数
// signFlg : 符号付きならばTrue
// digits : 変換した16進数の桁数合わせを自動で行うかを示すブール値、もしくは桁数を表す数値(8,16,24,32,64のいずれか)を指定
// errorMsg : エラーメッセージを出力するかを示すブール値
// 【戻り値】
// 16進数に変換した値
//////////////////////////////////////////////////
FUNCTION decToHex(dec, signFlg = FALSE, digits = FALSE, errorMsg = FALSE)
DIM hex = ""
DIM msg = ""
DIM isError = FALSE
DIM dec2hex[] = "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"
DIM decimalFlg = IIF(POS(".", dec) <> 0, TRUE, FALSE)
DIM negativeFlg = IIF(dec < 0, TRUE, FALSE)
dec = ABS(dec)
// (1) 10進数を整数部と小数部に分ける
DIM integer = IIF(decimalFlg, COPY(dec, 1, POS(".", dec) - 1), dec)
DIM decimal = IIF(decimalFlg, "0." + COPY(dec, POS(".", dec) + 1), 0)
// (2) 10進数(整数部)を16進数に変換する。
REPEAT
hex = dec2hex[integer MOD 16] + hex
integer = INT(integer / 16)
UNTIL integer = 0
// (3) 10進数(小数部)を16進数に変換する。
IFB decimalFlg THEN
hex = hex + "."
DIM loop = 0
REPEAT
loop = loop + 1
decimal = decimal * 16
hex = hex + dec2hex[decimal]
offset = POWER(10, LENGTH(decimal) - POS(".", decimal))
decimal = (decimal * offset - INT(decimal) * offset) / offset
UNTIL decimal = 0 OR loop > 16
ENDIF
// digitsがFALSE以外なら
IFB digits THEN
// (4) 16進数の桁合わせを行う
DIM tmp = hex
DIM hexInteger = TOKEN(".", tmp)
DIM hexDecimal = TOKEN(".", tmp)
// 整数部、小数部を4bit単位になるまで拡張
// 整数部、4の倍数になるまで整数部の先頭に'0'を追加
// ※16進数は4bit単位なのでこの処理は不要
DIM digit = LENGTH(hexInteger + hexDecimal)
integer = INT(dec)
IF signFlg AND COPY(hexToBin(hexInteger), 1, 1) = "1" THEN hexInteger = "0" + hexInteger
IFB signFlg THEN
IFB integer >= -128 AND integer <= 127 THEN // -2^7〜2^7-1
hexInteger = strRepeat("0", 2 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer >= -32768 AND integer <= 32767 THEN // -2^15〜2^15-1
hexInteger = strRepeat("0", 4 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer >= -8388608 AND integer <= 8388607 THEN // -2^23〜2^23-1
hexInteger = strRepeat("0", 6 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer >= -2147783648 AND integer <= 2147483647 THEN // -2^31〜2^31-1
hexInteger = strRepeat("0", 8 - LENGTH(hexInteger)) + hexInteger
ELSE
hexInteger = strRepeat("0", 16 - LENGTH(hexInteger)) + hexInteger
ENDIF
ELSE
IFB integer <= 255 THEN // 2^8-1
hexInteger = strRepeat("0", 2 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer <= 65535 THEN // 2^16-1
hexInteger = strRepeat("0", 4 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer <= 16777215 THEN // 2^24-1
hexInteger = strRepeat("0", 6 - LENGTH(hexInteger)) + hexInteger
ELSEIF integer <= 4294967295 THEN // 2^32-1
hexInteger = strRepeat("0", 8 - LENGTH(hexInteger)) + hexInteger
ELSE
hexInteger = strRepeat("0", 16 - LENGTH(hexInteger)) + hexInteger
ENDIF
ENDIF
totalDigits = LENGTH(hexInteger + hexDecimal) * 4
// 64bitを超えたら
IFB totalDigits > 64 THEN
DIM del32 = totalDigits - 32
DIM del64 = totalDigits - 64
IFB del32 = LENGTH(hexDecimal) * 4 AND digits <> 64 THEN
hexDecimal = ""
msg = "32bitを超えたため、小数点以下を削除しました"
ELSEIF del32 < LENGTH(hexDecimal) * 4 AND digits <> 64 THEN
hexDecimal = COPY(hexDecimal, 1, (LENGTH(hexDecimal) * 4 - del32) / 4)
msg = "32bitを超えたため、小数点以下の一部を削除しました"
ELSEIF del64 = LENGTH(hexDecimal) * 4 AND del64 <> 0 THEN
hexDecimal = ""
msg = "64bitを超えたため、小数点以下を削除しました"
ELSEIF del64 < LENGTH(hexDecimal) * 4 THEN
hexDecimal = COPY(hexDecimal, 1, (LENGTH(hexDecimal) * 4 - del64) / 4)
msg = "64bitを超えたため、小数点以下の一部を削除しました"
ELSE
isError = TRUE
msg = "64bitを超えるため、変換できません"
ENDIF
ENDIF
// 整数部、小数部の合計桁数を8,16,24,32,64bit単位になるまで拡張
digit = LENGTH(hexInteger + hexDecimal)
DIM array[] = 8, 16, 24, 32, 64
FOR item IN array
IFB digit <= item THEN
hexInteger = strRepeat("0", VAL(item)/4 - digit) + hexInteger
BREAK
ENDIF
NEXT
totalDigits = LENGTH(hexInteger + hexDecimal) * 4
IFB digits = TRUE THEN
// 桁合わせを自動調整
IFB totalDigits > 64 THEN
digit = LENGTH(hexInteger + hexDecimal)
WHILE LENGTH(hexInteger) > 8 AND digit > digits
IFB COPY(hexInteger, 1, 1) = "0" THEN
digit = digit - 1
ELSE
BREAK
ENDIF
WEND
WHILE LENGTH(hexDecimal) * 4 > 4 AND LENGTH(hexInteger + hexDecimal) > digits
IFB COPY(hexDecimal, LENGTH(hexDecimal) - 1) = "0" THEN
hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - 1)
ELSE
BREAK
ENDIF
WEND
tmp = hexInteger + "." + hexDecimal
hexInteger = COPY(tmp, 1, POS(".", tmp) - 1)
hexDecimal = COPY(tmp, POS(".", tmp) + 1)
totalDigits = LENGTH(hexInteger + hexDecimal)
IFB totalDigits > 64 THEN
isError = TRUE
msg = "64bitを超えたため変換できません"
ENDIF
ENDIF
ELSE
// 指定ビットに調整
IFB totalDigits <= digits THEN
hexInteger = strPad(hexInteger, digits / 4 - LENGTH(hexDecimal), "0", LEFT)
ELSE
// 桁あふれ調整
totalDigits = LENGTH(hexInteger + hexDecimal)
digit = LENGTH(hexInteger + hexDecimal)
WHILE LENGTH(hexInteger) * 4 > 8 AND digit > digits
IFB COPY(hexInteger, 1, 1) = "0" THEN
hexInteger = COPY(hexInteger, 2)
digit = digit - 4 / 4
ELSE
BREAK
ENDIF
WEND
WHILE LENGTH(hexDecimal) * 4 > 4 AND LENGTH(hexInteger + hexDecimal) > digits
IFB COPY(hexDecimal, LENGTH(hexDecimal) - 1) = "0" THEN
hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - 1)
ELSE
BREAK
ENDIF
WEND
tmp = hexInteger + "." + hexDecimal
hexInteger = COPY(tmp, 1, POS(".", tmp) - 1)
hexDecimal = COPY(tmp, POS(".", tmp) + 1)
digit = LENGTH(hexInteger + hexDecimal) * 4
IFB digit > digits THEN
DIM deleteLength = digit - digits
IFB deleteLength = LENGTH(hexDecimal) * 4 THEN
hexDecimal = ""
msg = "指定ビット数にするため小数点以下を削除しました"
ELSEIF deleteLength < LENGTH(hexDecimal) * 4 THEN
hexDecimal = COPY(hexDecimal, 1, LENGTH(hexDecimal) - deleteLength / 4)
msg = "指定ビット数にするため小数点以下の一部を削除しました"
ELSE
isError = TRUE
msg = "指定ビット数では変換できません"
ENDIF
ENDIF
ENDIF
ENDIF
hex = hexInteger + IIF(hexDecimal <> "", "." + hexDecimal, "")
// (5) 入力値がマイナスのため、16進数をマイナス値に変換する
IFB negativeFlg THEN
bin = hexToBin(hex)
// 1の補数
bin = bitNot(bin)
// 2の補数
DIM res = ""
DIM carry = "1"
FOR i = LENGTH(bin) TO 1 STEP -1
IFB carry = "1" THEN
SELECT COPY(bin, i, 1)
CASE "0"
res = "1" + res
carry = 0
CASE "1"
res = "0" + res
DEFAULT
res = COPY(bin, i, 1) + res
SELEND
ELSE
res = COPY(bin, i, 1) + res
ENDIF
NEXT
hex = binToHex(res)
ENDIF
ENDIF
IF errorMsg AND msg <> "" THEN PRINT msg
RESULT = IIF(isError, ERR_VALUE, hex)
FEND
//////////////////////////////////////////////////
// 【引数】
// hex : 16進数
// 【戻り値】
// 2進数に変換した値
//////////////////////////////////////////////////
FUNCTION hexToBin(hex)
HASHTBL hb
hb["0"] = "0000"; hb["1"] = "0001"; hb["2"] = "0010"; hb["3"] = "0011";
hb["4"] = "0100"; hb["5"] = "0101"; hb["6"] = "0110"; hb["7"] = "0111";
hb["8"] = "1000"; hb["9"] = "1001"; hb["A"] = "1010"; hb["B"] = "1011";
hb["C"] = "1100"; hb["D"] = "1101"; hb["E"] = "1110"; hb["F"] = "1111";
DIM bin = ""
IFB POS(".", hex) <> 0 THEN
FOR i = 1 TO LENGTH(hex)
DIM str = COPY(hex, i, 1)
IF str = "." THEN bin = bin + "."
bin = bin + hb[str]
NEXT
ELSE
FOR i = 1 TO LENGTH(hex)
bin = bin + hb[COPY(hex, i, 1)]
NEXT
ENDIF
RESULT = bin
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
//////////////////////////////////////////////////
// 【引数】
// variable : 型を調べる変数
// 【戻り値】
// : TRUE : 与えられた変数が文字列型である、
// FALSE : 与えられた変数が文字列型でない、 :
//////////////////////////////////////////////////
FUNCTION isString(variable)
RESULT = IIF(VARTYPE(variable) = VAR_ASTR OR VARTYPE(variable) = VAR_USTR, TRUE, FALSE)
FEND
//////////////////////////////////////////////////
// 【引数】
// num : 符号を求める数値
// 【戻り値】
// 1 : 正の数、0 : ゼロ、-1 : 負の数、ERR_VALUE : それ以外
//////////////////////////////////////////////////
FUNCTION sign(num)
SELECT TRUE
CASE !CHKNUM(num)
RESULT = ERR_VALUE
CASE num > 0
RESULT = 1
CASE num = 0
RESULT = 0
CASE num < 0
RESULT = -1
SELEND
FEND
//////////////////////////////////////////////////
// 【引数】
// input : 入力文字列
// length : 埋めたあとの長さ
// str : 埋める文字
// type : 埋める方向
// 【戻り値】
// 指定文字で埋めた文字列
//////////////////////////////////////////////////
FUNCTION strPad(input, length, str = " ", type = RIGHT)
DIM s = ""
SELECT type
CASE LEFT
FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
s = s + str
NEXT
input = COPY(s, 1, length - LENGTH(input)) + input
CASE RIGHT
FOR i = 1 TO CEIL((length - LENGTH(input)) / LENGTH(str))
s = s + str
NEXT
input = input + COPY(s, 1, length - LENGTH(input))
SELEND
RESULT = input
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
結果
32bit, 1480803660
32bit(16進数), 0x5843454C
文字, XCEL
使用関数
指定期間のメールを日毎に集計(Outlook)
CONST olFolderIndex = 6
DIM Outlook = CREATEOLEOBJ("Outlook.Application")
DIM NameSpace = Outlook.GetNameSpace("MAPI")
DIM Folder = NameSpace.GetDefaultFolder(olFolderIndex)
DIM Items = Folder.Items
Items = Items.Restrict("[ReceivedTime] >= '2020/12/01' AND [ReceivedTime] < '2020/12/31'")
HASHTBL dates = HASH_SORT
FOR MailItem IN Items
DIM datetime = MailItem.ReceivedTime
GETTIME(0, datetime)
DIM date = G_TIME_YY4 + "/" + G_TIME_MM2 + "/" + G_TIME_DD2
dates[date] = dates[date] + 1
NEXT
FOR i = 0 TO LENGTH(dates) - 1
PRINT dates[i, HASH_KEY] + "<#TAB>" + dates[i, HASH_VAL]
NEXT
結果
2020/12/05 78
2020/12/06 60
2020/12/07 72
2020/12/08 82
2020/12/09 75
2020/12/10 91
2020/12/11 82
2020/12/12 77
2020/12/13 63
2020/12/14 71
2020/12/15 104
2020/12/16 84
2020/12/17 80
2020/12/18 93
2020/12/19 78
2020/12/20 66
2020/12/21 67
2020/12/22 75
2020/12/23 82
2020/12/24 73
2020/12/25 87
2020/12/26 73
2020/12/27 56
2020/12/28 65
2020/12/29 69
2020/12/30 44
2020/12/31 1
使用関数
特定の値を除くランダム値を取得
1行目の配列に取得しない値を格納した配列、5行目のRANDOMの引数が取得するランダム値の範囲、今回の場合0~19の範囲です。8行目のLENGTH関数でランダム値を格納した配列のサイズを取得し、10個になったら終了。
DIM exclude[] = 0, 5, 8, 9, 14, 15
DIM array[-1]
WHILE TRUE
DIM n = RANDOM(20)
IF inArray(n, exclude) THEN CONTINUE
arrayPush(array, n)
IF LENGTH(array) = 10 THEN BREAK
WEND
FOR item IN array
PRINT item
NEXT
//////////////////////////////////////////////////
// 【引数】
// array : 要素を追加する配列(参照引数)
// values : 追加する要素をvalue1から指定
// 【戻り値】
// 処理後の配列の要素の数
//////////////////////////////////////////////////
FUNCTION arrayPush(var array[], value1 = EMPTY, value2 = EMPTY, value3 = EMPTY, value4 = EMPTY, value5 = EMPTY, value6 = EMPTY, value7 = EMPTY, value8 = EMPTY, value9 = EMPTY, value10 = EMPTY, value11 = EMPTY, value12 = EMPTY, value13 = EMPTY, value14 = EMPTY, value15 = EMPTY, value16 = EMPTY)
DIM i = 1
WHILE EVAL("value" + i) <> EMPTY
DIM res = RESIZE(array, UBound(array) + 1)
array[res] = EVAL("value" + i)
i = i + 1
WEND
RESULT = LENGTH(array)
FEND
//////////////////////////////////////////////////
// 【引数】
// needle : 探す値
// haystack : 配列
// strict : 型も同じかチェックします
// 【戻り値】
// TRUE : 配列中に指定した値が存在する、FALSE : 配列中に指定した値が存在しない
//////////////////////////////////////////////////
FUNCTION inArray( needle, haystack[], strict = FALSE)
DIM res = FALSE
FOR item IN haystack
IFB needle = item THEN
IFB strict THEN
IFB VARTYPE(needle) = VARTYPE(item) THEN
res = TRUE
BREAK
ENDIF
ELSE
res = TRUE
BREAK
ENDIF
ENDIF
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// inputs : 繰り返す文字列
// multiplier : inputsを繰り返す回数
// 【戻り値】
// inputsをmultiplier回を繰り返した文字列を返します
//////////////////////////////////////////////////
FUNCTION strRepeat(inputs, multiplier)
DIM res = ""
FOR n = 1 TO multiplier
res = res + inputs
NEXT
RESULT = res
FEND
//////////////////////////////////////////////////
// 【引数】
// arrayname : 上限値を求める配列の名前
// dimension : 返す次元を示す整数
// 【戻り値】
// 配列の上限値
//////////////////////////////////////////////////
FUNCTION UBound(arrayname[], dimension = 1)
RESULT = EVAL("RESIZE(arrayname" + strRepeat("[0]", dimension - 1) + ")")
FEND
結果
16
17
18
11
3
17
11
10
3
12
使用関数
今年の恵方を求める
恵方は西暦の下1桁の数字で決まるので、その値で条件分けをします。
DIM year = getYear(today())
DIM y = COPY(year, LENGTH(year))
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
結果
西南西微西
使用関数
解説
関連記事
- CALCARRAY関数 (スクリプト関数)
- 配列の合計値・最小値・最大値・平均値を求めます。
- GETALLWIN関数 (スクリプト関数)
- 全ウィンドウのIDを取得します。
- GETOLEITEM関数 (スクリプト関数)
- JOIN関数 (スクリプト関数)
- 引数に指定した配列を結合し文字列を返します。
- SETCLEAR関数 (スクリプト関数)
- 配列のすべての要素を任意の値で埋めます。
- SHIFTARRAY関数 (スクリプト関数)
- 配列を指定した値だけシフトします。プラス値で後方、マイナス値で前方にシフトします。
- 連想配列
- 連想配列とは、自動的に割り当てられる数字をキーとして持つかわりに、自由に任意の文字列を割り振ることができる配列のことです。添え字に番号の変わりに名前をつけることでわかりやすく管理することができます。
- divisors関数 (自作関数)
- 引数に指定した数値の約数のリストを返します。
- POPUPMENU関数 (スクリプト関数)
- ポップアップメニューを表示し、引数に指定した配列の中から選択された項目の要素番号を取得します。選択された項目を取得したい場合は、POPUPMENUの戻値を引数に指定した配列の要素番号として指定します。
- Collatz関数 (自作関数)
- コラッツ数列 を求め結果を配列で返します。