#============================================================================== # ■ 配列操作系メソッド集 #------------------------------------------------------------------------------ #  作ったメソッドを適当に保存しておくところ # # # 乱数一括代入 # randpack(min, max, [start[, goal]]) # # 部分的昇順ソート # partialsort_up([start[, goal]]) # # 部分的降順ソート # partialsort_down([start[, goal]]) # # 最大値検索 # search_max([start[, goal[, border]]]) # # 最小値検索 # search_min([start[, goal[, border]]]) # # 後方移動 # move_back([target[, start[, goal]]]) # # 前方移動 # move_front([target[, start[, goal]]]) # # シャッフル # shuffle([start[, goal]]) # # 重複無しの乱数一括代入 # randpackplus(min, max, [start[, goal]]) #============================================================================== class Array #-------------------------------------------------------------------------- # ● 乱数一括代入 2005/7/24 #-------------------------------------------------------------------------- def randpack(min, max, start = 0, goal = self.size - 1) #min=乱数の最小値,max=乱数の最大値,start=範囲の最初, goal=範囲の最後 for pointer in start..goal #変数pointerの値を変数startから変数goalまで変動させながらループ self[pointer] = rand(max - min + 1) + min #変数pointerで指定したツクール変数に変数minから変数maxまでの乱数を代入 end return self end #-------------------------------------------------------------------------- # ● 部分的昇順ソート 2005/7/24 #-------------------------------------------------------------------------- def partialsort_up(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 array = self[start..goal] #配列初期化 array.sort! #配列をソートする self[start..goal] = array #元の配列に代入 return self end #-------------------------------------------------------------------------- # ● 部分的降順ソート 2005/7/24 #-------------------------------------------------------------------------- def partialsort_down(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 array = self[start..goal] #配列初期化 array.sort! #配列をソートする array.reverse! #配列を逆順に並び替える self[start..goal] = array #元の配列に代入 return self end #-------------------------------------------------------------------------- # ● 最大値検索 2005/7/24 #-------------------------------------------------------------------------- def search_max(start = 0, goal = self.size - 1, border = nil) #start=範囲の最初, goal=範囲の最後, border=調べる数値の最大値 max_variable = [] #最大値とその番号を記録する配列 for pointer in start..goal #変数pointerをstartからgoalまで繰り返す if border == nil || border >= self[pointer] #ボーダーが無いか、現在の変数がボーダー以下の時 if max_variable[0] == nil || max_variable[0] < self[pointer] #最大値がまだ記録されてないか、現在の変数が記録した最大値より大きい時 max_variable = [self[pointer],pointer] #最大値に現在の変数とその変数の番号を代入 elsif max_variable[0] == self[pointer] #現在の変数が記録した最大値と同じ時 max_variable.push pointer #配列に変数の番号を追加 end end end return max_variable #最大値とその番号の配列を返す end #-------------------------------------------------------------------------- # ● 最小値検索 2005/7/24 #-------------------------------------------------------------------------- def search_min(start = 0, goal = self.size - 1, border = nil) #start=範囲の最初, goal=範囲の最後, border=調べる数値の最大値 max_variable = [] #最小値とその番号を記録する配列 for pointer in start..goal #変数pointerをstartからgoalまで繰り返す if border == nil || border <= self[pointer] #ボーダーが無いまたは現在の変数がボーダー以上の時 if max_variable[0] == nil || max_variable[0] > self[pointer] #最小値がまだ記録されてないか、現在の変数が記録した最小値より小さい時 max_variable = [self[pointer],pointer] #最小値に現在の変数とその変数の番号を代入 elsif max_variable[0] == self[pointer] #現在の変数が記録した最小値と同じ時 max_variable.push pointer #配列に変数の番号を追加 end end end return max_variable #最小値とその番号の配列を返す end #-------------------------------------------------------------------------- # ● 後方移動 2004/8/18 #-------------------------------------------------------------------------- def move_back(target = 0, start = 0, goal = self.size - 1) #target=移動する数値,start=範囲の最初,goal=範囲の最後 pointer = start #範囲の最初から順番に移動する変数 k = 0 #ターゲットの個数を記録する変数 while (pointer + k <= goal) #変数pointer + kの値が範囲内にある間ループ while (self[pointer + k] == target && pointer + k <= goal) #k個分先の変数がターゲットなら k += 1 #ターゲットの個数1個追加 end #以上繰り返し self[pointer] = self[pointer + k] #変数k個分先の変数を代入(前に詰める) pointer += 1 #変数を1つ移動する end #以上繰り返し while (k > 0) #見つかったターゲットの個数だけ繰り返す k -= 1 #ターゲット数を1つ減らす self[goal - k] = target #範囲の後ろをtargetで埋める end return self end #-------------------------------------------------------------------------- # ● 前方移動 2004/8/18 #-------------------------------------------------------------------------- def move_front(target = 0, start = 0, goal = self.size - 1) #target=移動する数値,start=範囲の最初,goal=範囲の最後 pointer = goal #範囲の最後から順番に移動する変数 k = 0 #ターゲットの個数を記録する変数 while (pointer - k >= start) #変数pointer - kの値が範囲内にある間ループ while (self[pointer - k] == target && pointer - k >= start) #k個分先の変数がターゲットなら k += 1 #ターゲットの個数1個追加 end #以上繰り返し self[pointer] = self[pointer - k] #変数k個分先の変数を代入(前に詰める) pointer -= 1 #変数を1つ移動する end #以上繰り返し while (k > 0) #見つかったターゲットの個数だけ繰り返す k -= 1 #ターゲット数を1つ減らす self[start + k] = target #範囲の後ろをtargetで埋める end return self end #-------------------------------------------------------------------------- # ● シャッフル 2005/7/24 #-------------------------------------------------------------------------- def shuffle(start = 0, goal = self.size - 1) #start=範囲の最初, goal=範囲の最後 for pointer in start...goal #変数pointerの値を変数startから変数goalまで変動させながらループ other = rand(goal - pointer + 1) + pointer #現在の位置以降の範囲からランダムに1つ選択 self[pointer], self[other] = self[other], self[pointer] #2変数を交換 end return self end #-------------------------------------------------------------------------- # ● 重複無しの乱数一括代入 2005/7/24 #-------------------------------------------------------------------------- def randpackplus(min, max, start = 0, goal = self.size - 1) #min=乱数の最小値,max=乱数の最大値,start=範囲の最初, goal=範囲の最後 array = [] #配列初期化 for pointer in min..max #変数pointerの値を変数minから変数maxまで変動させながらループ array.push pointer #pointerの値を順次代入 end for pointer in 0...array.size - 1 #変数pointerの値を変数startから変数array.size - 1まで変動させながらループ other = rand(array.size - pointer) + pointer #現在の位置以降の範囲からランダムに1つ選択 array[pointer], array[other] = array[other], array[pointer] #2変数を交換 end while array.size <= goal - start #arrayの要素数が部分配列と同じ数になるまで array.push 0 #配列の末尾に0を追加する end for pointer in start..goal #変数pointerの値を変数startから変数goalまで変動させながらループ self[pointer] = array[pointer - start] #元の変数に順次代入 end return self end end