--- divide { |o| ... }
--- divide { |o1, o2| ... }

#    Divides the set into a set of subsets according to the commonality
#    defined by the given block.

    硢ʤ֥åطʬ䤷̤򽸹Ȥ
    ֤ޤ

#    If the arity of the block is 2, elements o1 and o2 are in common
#    if block.call(o1, o2) is true.  Otherwise, elements o1 and o2 are
#    in common if block.call(o1) == block.call(o2).

    2ĤΤȤ block.call(o1, o2) ʤ o1  o2 Ʊʬ
    °ޤ1ĤΤȤ block.call(o1) == block.call(o2) 
    ʤo1  o2 Ʊʬ°ޤĤޤ֥åΰ2
    ΤȤϥ֥åͤοǷޤƱˡ1ĤΤȤϥ֥
    ͤ == ˤƱʬ䤵ޤ

    2ĤΤȤϡƱʹطΤ
    оΧblock.call(o1, o2)  block.call(o2, o1)ס
    ƿΧblock.call(o1, o2)  
    block.call(o2, o3) ʤ
    block.call(o1, o3)
    2ĤȤꤵƤޤ

    :

      require 'set'
      numbers = Set[1, 3, 4, 6, 9, 10, 11]
      set = numbers.divide { |i,j| (i - j).abs == 1 }
      p set     #=> #<Set: {#<Set: {1}>,
                #           #<Set: {11, 9, 10}>,
                #           #<Set: {3, 4}>,
                #           #<Set: {6}>}>

    :

      # 8x2 Υ׾ǥʥȤãǤ֤˴ؤʬ
      require "set"
      board = Set.new
      m, n = 8, 2
      for i in 1..m do for j in 1..n do board << [i,j] end end
      knight_move = Set[1,2]
      p board.divide { |i,j| 
        Set[(i[0]-j[0]).abs, (i[1]-j[1]).abs] == knight_move
      }  #=> #<Set: {#<Set: {[6, 2], [4, 1], [2, 2], [8, 1]}>, 
         #           #<Set: {[2, 1], [8, 2], [6, 1], [4, 2]}>, 
         #           #<Set: {[1, 1], [3, 2], [5, 1], [7, 2]}>, 
         #           #<Set: {[1, 2], [5, 2], [3, 1], [7, 1]}>}>

