【解決】複数の変数が何個1以上なのか、という処理について

kix
記事: 19
登録日時: 2017年7月02日(日) 18:45

【解決】複数の変数が何個1以上なのか、という処理について

投稿記事by kix » 2017年7月03日(月) 19:39

「決まった数の複数の変数のうち、1以上になっているものは何個あるかを別の変数一つに返す」という処理を、なるべく軽いものにしたいと思っています。
条件分岐で1以上を見るべきか、同じ変数で割ってまとめるのがいいのか(添付画像)、他にもっと良い方法があるのか。これが数百数千の変数まで増えるとかなり違ってきてしまうのではないかと思います。
良い方法をご存知であればお教え下さい。
添付ファイル
クリップボード.jpg
最後に編集したユーザー kix on 2017年7月09日(日) 19:26 [ 編集 1 回目 ]

奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by 奏ねこま » 2017年7月03日(月) 20:09

スクリプトを使った方法ですが。

◆変数#0002~#0010までの中で、1以上になっている変数の個数を変数#0001に代入する。

コード: 全て選択

$game_variables[1] = Array(2..10).inject(0){|r,i|
  r + ($game_variables[i] >= 1 ? 1 : 0)
}

最初の「$game_variables[1]」が個数を代入する変数
「2..10」となっているのが、変数#0002~#0010という範囲を作っているところ
「$game_variables[i] >= 1」が「1以上だったら」という条件

こんな感じで。
kix
記事: 19
登録日時: 2017年7月02日(日) 18:45

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by kix » 2017年7月04日(火) 12:13

奏ねこま さんが書きました:

コード: 全て選択

$game_variables[1] = Array(2..10).inject(0){|r,i|
  r + ($game_variables[i] >= 1 ? 1 : 0)
}


ありがとうございます。動作が軽いのはもちろん、記述も劇的に短く管理しやすくなって、大助かりです。

重ねてお願いするのは不躾ですが、あと一つだけ、教えていただいてもよろしいでしょうか。
「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。
14個の変数にこれを行うと0.2秒だけかかるのですが、ループの中でははっきりと遅延を感じてしまいます。
本当は200個以上の変数を対象にしてループしたいので、重さをどうしても解消したいのです。
利用規約を教えてください。
添付ファイル
あいsえお.jpg
SBR

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by SBR » 2017年7月04日(火) 13:34

別解ですがこんなのはどうでしょう?

コード: 全て選択

$game_variables[1] = (1..200).count do |i|
  $game_variables[i] >= 1
end
kix
記事: 19
登録日時: 2017年7月02日(日) 18:45

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by kix » 2017年7月04日(火) 19:12

SBR さんが書きました:別解ですがこんなのはどうでしょう?

コード: 全て選択

$game_variables[1] = (1..200).count do |i|
  $game_variables[i] >= 1
end

ありがとうございます。使い方は添付画像の通りでいいのでしょうか?
添付ファイル
クリップボード.png
クリップボード.png (7.1 KiB) 閲覧数: 5002 回
SBR

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by SBR » 2017年7月04日(火) 19:36

それでいいと思います。

1つにまとめたいのであればこの様な方法もあります。
n.png
n.png (24.23 KiB) 閲覧数: 4994 回
奏ねこま
記事: 702
登録日時: 2016年1月20日(水) 20:04

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by 奏ねこま » 2017年7月04日(火) 20:06

kix さんが書きました:「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。
14個の変数にこれを行うと0.2秒だけかかるのですが、ループの中でははっきりと遅延を感じてしまいます。
本当は200個以上の変数を対象にしてループしたいので、重さをどうしても解消したいのです。

比較的わかりやすいやつ。

コード: 全て選択

(2..10).each{|i|
  if $game_variables[i] >= 1
    $game_variables[i] += 1
  end
  if $game_variables[i] == 14
    $game_variables[i] = 0
  end
}

わかりづらいけどコンパクトにまとめたやつ。

コード: 全て選択

(2..10).each{|i|
  v = $game_variables[i] + 1
  $game_variables[i] = v.between?(2, 13) ? v : 0
}

どちらでも結果は同じです。

>SBRさん
・count使ったやりかた
・Rangeから配列を作るやり方

そんなやり方もあるのですね…勉強になります。
faida
記事: 272
登録日時: 2015年12月17日(木) 16:44

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by faida » 2017年7月04日(火) 20:53

kix さんが書きました:「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。

正解が出てるのでおまけ。

コード: 全て選択

(2..10).each{|i|
  next if $game_variables[i] < 1
  $game_variables[i] = ($game_variables[i] + 1) % 14
}

nextを使わない方が早そうですが。
------------------------------------------------------------------
自作の(改造でない)スクリプト、プラグイン素材に
関しては、リードミーもしくは作中に
「faida」と記名していただければ
利用可能です。
kix
記事: 19
登録日時: 2017年7月02日(日) 18:45

Re: 複数の変数が何個1以上なのか、という処理について

投稿記事by kix » 2017年7月04日(火) 21:54

皆様に感謝します。
奏ねこま さんが書きました:わかりづらいけどコンパクトにまとめたやつ。

コード: 全て選択

(2..10).each{|i|
  v = $game_variables[i] + 1
  $game_variables[i] = v.between?(2, 13) ? v : 0
}

動作確認できました。再び助けていただき、ありがとうございました。

“VX / Ace:質問” へ戻る