幻日幻月環

作成した伺かの更新情報などをつぶやくところ

複数の変数の中から最多と最小を取得

スクリプトの相談がありましたので、返信します。

>お時間ありましたら教えていただけないでしょうか。
つい最近伺かに触れて、ゴーストも作り始めたのですが、触った回数などの数を比べて一番多い数や少ない数を求める事は出来るのでしょうか?
例としては
頭を触った数10回腕を触った数30回足を触った数15回
となっていた場合
全てを比べて一番多く触った数30回
一番多く触った部位腕
といった風にできないでしょうか?

稚拙な質問ですいません。

素晴らしいゴーストを作って下さってありがとうございます。
ロストユーサムウェアは伺かに触れて初めての日に触れましたが、それでも圧倒されました。
応援しています、お体ご自愛下さい。


里々で作成されているとして、相談いただいた内容の処理は里々で作ることが出来ます。
追記の内容をご確認ください。

記事末尾に数字のみを列挙して最大と最小を取得するものを付記します。
触った回数自体は変数に入っているものとします。
以下を辞書の何処かに記述してください。

スクリプト本体

@回数取得
(nop,
#-2147483648は里々で数字として扱える最小数
(set,最多回数,-2147483648)
(set,最多部位名,無し)
#2147483647は里々で数字として扱える最大数
(set,最小回数,2147483647)
(set,最小部位名,無し)
(for,1,(calc,(Aの数) - 1),2
,(when,(A(C0)) > (最多回数)
,(set,最多回数,(A(C0)))
(set(バイト値,1)最多部位名(バイト値,1)(A(calc,(C0) - 1)))

(when,(A(C0)) < (最小回数)
,(set,最小回数,(A(C0)))
(set(バイト値,1)最小部位名(バイト値,1)(A(calc,(C0) - 1)))



#空白はタブ文字です。見やすくするためだけのものなのでなくても構いません。

「回数取得」を呼ぶと、変数「最多回数」と「最多部位名」に該当するものが入って帰ってきます。
注意点として、この場合は頭10足10などの同値を考慮していません。同値は最初のものが記録されます。
同値の場合に全ての部位名を記録するスクリプトは後述します。

1.基本の使い方


:頭10
腕30
足15
$ダミー=(call、回数取得、頭、10、腕、30、足、15)
一番触った部分は(最多部位名)、その回数は(最多回数)です。
#一番触った部分は腕、その回数は30です。
触られた回数が最も少ない部分は(最小部位名)、その回数は(最小回数)です。
#「$ダミー=」の部分は、改行を発生させないためにいれています。変数「ダミー」は使いません。
#不要なら「(call、回数取得、頭、10、腕、30、足、15)」をそのまま書いてください。
#回数部分は、全角でも半角でもかまいませんが、必ず数字のみが入っているようにしてください。

2.変数を使い、ジャンプして別トークを実行させる


$ダミー=(call、回数取得、頭、(頭カウント)、腕、(腕カウント)、足、(足カウント))
>頭が多いトーク【タブ】(最多部位名) == 頭
>腕か足が多いトーク【タブ】(最多部位名) == 腕 || (最多部位名) == 足

*頭が多いトーク
:もう頭ばっかり、(最多回数)回もなでられちゃったね……。

3.「部位名,数字」のセットを複数並べて使う


$ダミー=(call,回数取得
,頭,(頭カウント)
,腕,(腕カウント)
,足,(足カウント)
,手,(手カウント)
,尻,(尻カウント)
,その他,(体カウント)

:一番触った部分は(最多部位名)、その回数は(最多回数)です。


同値の場合に部位名を全て記録
同値の場合の取得も出来ます。以下は同値の部位名があれば、部位名が半角カンマ「,」で連結されています(「頭,腕」など)。
使うときに少々ややこしいので、同率をどうしても取りたい場合以外は推奨しません。
また、部位名に半角カンマが入るとおかしくなるのでご注意ください。

@回数取得同値取得版
(nop,
(set,最多回数,-2147483648)
(set,最多部位名,)
(set,最小回数,2147483647)
(set,最小部位名,)
(for,1,(calc,(Aの数) - 1),2
,(when,(A(C0)) >= (最多回数)
,(when,(A(C0)) > (最多回数)
,(set,最多部位名,)

(set,最多回数,(A(C0)))
(when,(変数「最多部位名」の存在)
,(set(バイト値,1)最多部位名(バイト値,1)(最多部位名),(A(calc,(C0) - 1)))
,(set,最多部位名,(A(calc,(C0) - 1)))


(when,(A(C0)) <= (最小回数)
,(when,(A(C0)) < (最小回数)
,(set,最小部位名,)

(set,最小回数,(A(C0)))
(when,(変数「最小部位名」の存在)
,(set(バイト値,1)最小部位名(バイト値,1)(最小部位名),(A(calc,(C0) - 1)))
,(set,最小部位名,(A(calc,(C0) - 1)))





:頭10
胸20
腕30
足10
顔30
その他25
$ダミー=(call、回数取得同値取得版、頭、10、胸、20、腕、30、足、10、顔、30、その他、25)
最多は(最多部位名)で(最多回数)。
最小は(最小部位名)で(最小回数)。
#「最多は腕,顔で30。最小は頭,足で10」
(split、(最多部位名)、,)個が最多部位名では同率。
#2個が最多部位名では同率。

$ダミー=(call、回数取得同値取得版、頭、10、胸、20、腕、30、足、10、顔、30、その他、25)
>頭が最小グループにあるトーク【タブ】(count、(最小部位名)、頭)

*頭が最小グループにあるトーク
:頭を(最小回数)だけしか触られてない。


スクリプト解説

ざっくり解説すると、記述された「部位名、回数」分だけ同じ処理を行っています。
回数が現在記録している最多回数より多ければ、そのたびに最多回数と最多部位名を上書きし、現在記録している最小回数より多ければ、そのたびに最小回数と最小部位名を更新を上書きしています。
初期値を最多回数を-2147483648、最小回数を2147483647としているのは、渡されたのがどんな回数でも、最初の「部位名、回数」で上書きされ、何かしらの値がセットされるためです。
例えば、「(call、回数取得、頭、0)」を実行した場合も、最多回数の初期値-2147483648より大きいので頭0回で上書き、最小回数の初期値2147483647より小さいので頭0回で上書きされます。
結果、最多回数「0」、最多部位名「頭」、最小回数「0」、最小部位名「頭」がセットされます。
「(call、回数取得、頭、0、手、10)」を実行した場合、最初の1回は「頭、0」で最多回数「0」、最多部位名「頭」が上書きされますが、次の「手、10」で10は0より大きいため、最多回数「10」、最多部位名「手」が上書きされます。

少しだけ高速化

サンプルは説明しやすくするため、初期値をセットしておきましたが、最初から1番目の「部位、回数」の組をセットすれば処理回数を1回減らせ、ほんの少し(体感出来ない範囲)だけ早くなります。
代わりに、1つしか「部位、回数」の組を渡さなかった場合の結果は保証出来ません。

@回数取得高速化
(nop,
(set,最多回数,(A1))
(set,最多部位名,(A0))
(set,最小回数,(A1))
(set,最小部位名,(A0))
(for,3,(calc,(Aの数) - 1),2
,(when,(A(C0)) > (最多回数)
,(set,最多回数,(A(C0)))
(set(バイト値,1)最多部位名(バイト値,1)(A(calc,(C0) - 1)))

(when,(A(C0)) < (最小回数)
,(set,最小回数,(A(C0)))
(set(バイト値,1)最小部位名(バイト値,1)(A(calc,(C0) - 1)))





数字比較のみ行うスクリプト

@最多最小取得
(nop,
(set,最多回数,-2147483648)
(set,最小回数,2147483647)
(for,0,(calc,(Aの数) - 1),1
,(when,(A(C0)) > (最多回数)
,(set,最多回数,(A(C0)))

(when,(A(C0)) < (最小回数)
,(set,最小回数,(A(C0)))





$変数1=10
$変数2=40
$変数3=-5
$変数4=15
$ダミー=(call、最多最小取得、(変数1)、(変数2)、(変数3)、(変数4))
:最多(最多回数)。最小(最小回数)。
#最多40。最小-5。
PageTop

コメント


管理者にだけ表示を許可する