# ライブラリ「TETRAZ.排他理論」 ver.1.02 (Since 2005/11/20)
# by Tetra-Z
#
# ライブラリとか言っている割に非常にわかりづらい仕様ですが、
# 「とある配列(object)に、同時に存在させたくない組み合わせ」を設定する時に用います。
#
# 併用必須 : Tetra-Z作「TETRAZ.配列操作」
#------------------------------------------------------------------------------
# ★メゾット : TetraZ_Exclusive.follow_exclusive?(object, judge_array)
#
# judge_arrayに下記のように配列を返すメゾットを入れます。
#
# def judge_array
#   array = []
#   array.push([配列A中のobject保持許可数, [配列A], 配列B中のobject保持許可数, [配列B], ……, object配列所属許可数])
#                                                 :
#                                                 :
#                                    (複数並べれば、多数設定可能)
#                                                 :
#                                                 :
#   return array
# end
#
# 配列*中のobject保持許可数 : 配列*の中で、objectに保持を許可する数。
# object配列所属許可数      : objectに所属を許可する配列種数。
#                             配列内に1つでも共通する要素があれば、
#                             所属しているとみなされます。
#
# 配列*中のobject保持許可数, object配列所属許可数は省略可能。省略すると、
# 前者を省略すると不問扱い、後者を省略すると「1」扱いになります。また、
# array.push([項目A, 項目B, 項目C, ……])
# とすると、objectが保持を許可されるのは項目A, 項目B, 項目C, ……のうち
# 1つのみとなります。
#
# 以上の条件に適合している時にtrue、そうでない時にfalseを返します。
#------------------------------------------------------------------------------
# 例1 : 
#
# object = [1, 3, 4, 6, 8]
#
# def judge_array
#   array = []
#   array.push[2, [1, 2, 3], 2, [7, 8, 9], 1, [5, 10], 2]
#              ^^^^^^^^^^^^a ^^^^^^^^^^^^b ^^^^^^^^^^c d
#   return array
# end
#
# a : 「1, 2, 3のうち、所持を許可するのは2つまで」
#     objectが所持しているのは1, 3の2つなのでOK
# b : 「7, 8, 9のうち、所持を許可するのは2つまで」
#     objectが所持しているのは8の1つだけなのでOK
# c : 「5, 10のうち、所持を許可するのは1つまで」
#     objectが所持しているのは1つもないのでOK
# d : ここまでの配列で所属を許可するのは2つまで
#     objectが所属しているのはa,bの2配列なのでOK
#
# 結果 : TetraZ_Exclusive.follow_exclusive?(object, judge_array) → true
#------------------------------------------------------------------------------
# 例2 : XMS.「セレクトスキル」拡張子「排他セレクトスキル」
#
# TetraZ_Exclusive.follow_exclusive?(after, exclusive_skills_array)
# # after : 仮想上の変更後セレクトスキル
#
# def exclusive_skills_array
#   array = []
#   array.push[[7, 8, 9], [10, 11, 12]]
#   return array
# end
#
# ID 7〜9(ファイア系)とID 10〜12(アイス系)は、
# 同時にセレクトスキルに設定できない(排他である)ことを示しています。
#------------------------------------------------------------------------------
# ver.1.00(2005/11/20)
# 公開
# ver.1.01(2005/11/21)
# 修正、重複を加味するように(要:「TETRAZ.配列操作」)
# ver.1.02(2005/11/23)
# 配列*中のobject保持許可数の動作を修正

#==============================================================================
# TETRAZ_Exclusive
#==============================================================================
module TETRAZ_Exclusive
  #--------------------------------------------------------------------------
  # ● 排他理論に従っているか?
  #     object      : 判断対象
  #     judge_array : 排他理論配列
  #--------------------------------------------------------------------------
  def self.follow_exclusive?(object, judge_array)
    for judge in judge_array.dup
      if (judge.size >= 2 and !(judge[0].is_a?(Array)) and !(judge[1].is_a?(Array)))
        add = object.array_and_repeat(judge)
        return false if add.size > 1
        next
      end
      can_inclusion = judge[-1].is_a?(Array) ? 1 : judge[-1]
      judge.pop if !(judge[-1].is_a?(Array))
      i = 0
      loop do
        break if i >= judge.size
        if !(judge[i].is_a?(Array))
          able_number = judge[i]
          i += 1
        else
          able_number = judge[i].size          
        end
        add = object.array_and_repeat(judge[i])
        return false if add.size > able_number
        can_inclusion -= 1 if !(add.empty?)
        return false if can_inclusion < 0 
        i += 1
      end
    end
    return true
  end
end

[PR]田丸麻紀さん愛用ダイエット:大人気サプリメント!注文殺到中です