ページ 11

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

Posted: 2017年7月03日(月) 19:39
by kix
「決まった数の複数の変数のうち、1以上になっているものは何個あるかを別の変数一つに返す」という処理を、なるべく軽いものにしたいと思っています。
条件分岐で1以上を見るべきか、同じ変数で割ってまとめるのがいいのか(添付画像)、他にもっと良い方法があるのか。これが数百数千の変数まで増えるとかなり違ってきてしまうのではないかと思います。
良い方法をご存知であればお教え下さい。

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

Posted: 2017年7月03日(月) 20:09
by 奏ねこま
スクリプトを使った方法ですが。

◆変数#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以上だったら」という条件

こんな感じで。

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

Posted: 2017年7月04日(火) 12:13
by kix
奏ねこま さんが書きました:

コード: 全て選択

$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個以上の変数を対象にしてループしたいので、重さをどうしても解消したいのです。
利用規約を教えてください。

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

Posted: 2017年7月04日(火) 13:34
by SBR
別解ですがこんなのはどうでしょう?

コード: 全て選択

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

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

Posted: 2017年7月04日(火) 19:12
by kix
SBR さんが書きました:別解ですがこんなのはどうでしょう?

コード: 全て選択

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

ありがとうございます。使い方は添付画像の通りでいいのでしょうか?

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

Posted: 2017年7月04日(火) 19:36
by SBR
それでいいと思います。

1つにまとめたいのであればこの様な方法もあります。
n.png
n.png (24.23 KiB) 閲覧数: 5112 回

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

Posted: 2017年7月04日(火) 20:06
by 奏ねこま
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から配列を作るやり方

そんなやり方もあるのですね…勉強になります。

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

Posted: 2017年7月04日(火) 20:53
by faida
kix さんが書きました:「複数の変数の中で、1以上になっているものだけに1を加算して、14になれば0に戻す」という記述です。

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

コード: 全て選択

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

nextを使わない方が早そうですが。

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

Posted: 2017年7月04日(火) 21:54
by kix
皆様に感謝します。
奏ねこま さんが書きました:わかりづらいけどコンパクトにまとめたやつ。

コード: 全て選択

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

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