module GraphUtils

Included in these methods are enumerators that can perform iterations over entire N-d Array structures. We can call these 'deep' enumerators.

Public Class Methods

deepeach(array) { |elem| ... } click to toggle source
# File lib/graphutils.rb, line 108
def self.deepeach(array, &block)
    array.each do |elem|
      elem.is_a?(Array) ? deepeach(elem, &block) : yield(elem)
  end
end
deepmap(array) { |elem| ... } click to toggle source
# File lib/graphutils.rb, line 102
def self.deepmap(array, &block)
    array.map do |elem|
      elem.is_a?(Array) ? deepmap(elem, &block) : yield(elem)
  end
end
deepmap!(array) { |elem| ... } click to toggle source

Deep iteration tools meant for manipulating N-D Array structures.

# File lib/graphutils.rb, line 96
def self.deepmap!(array, &block)
  array.map! do |elem|
    elem.is_a?(Array) ? deepmap!(elem, &block) : yield(elem)
  end
end
deepselect!(array) { |elem| ... } click to toggle source
# File lib/graphutils.rb, line 114
def self.deepselect!(array, &block)
    array.select! do |elem|
    elem.is_a?(Array) ? deepselect!(elem, &block) : yield(elem)
  end
  array
end
find_column(board, column_index) click to toggle source

Return an array of a column at a particular index.

# File lib/graphutils.rb, line 40
def self.find_column(board, column_index)
  column = []
  row_index = 0
  until row_index == board.length
    column << board[row_index][column_index]
    row_index += 1
  end
  column
end
find_rc(two_dimensional_array, target) click to toggle source

Find the coordinates of a target, returning the row and column indices as an array

# File lib/graphutils.rb, line 13
def self.find_rc(two_dimensional_array, target)
  column = nil
  row = nil
  two_dimensional_array.each do |y|
    if y.include?(target)
      row = two_dimensional_array.index(y)
      y.each do |x|
        if x == target
          column = y.index(x)
          break
        end
      end
    end
  end
  [row, column]
end
rc_lookup(two_dimensional_array, coordinates) click to toggle source

Find a value corresponding with the given [row,column] coordinates

# File lib/graphutils.rb, line 32
def self.rc_lookup(two_dimensional_array, coordinates)
  row = coordinates[0]
  column = coordinates[1]
  two_dimensional_array[row][column]
end
surrounding_coordinates(two_dimensional_array, coordinates, options = {} ) click to toggle source

Returns an array of adjacent coordinates for a given set of coordinates. An options hash is included to specify an inclusive or exclusive lookup, defaulting to inclusive.

# File lib/graphutils.rb, line 52
def self.surrounding_coordinates(two_dimensional_array, coordinates, options = {} )
  raise ArgumentError.new("Must include [row,column] coordinates") unless coordinates.is_a?(Array)
  range = options[:range] || :inclusive
  row = coordinates[0]
  column = coordinates[1]

  coordinates = [
    [(row - 1), (column    )], # up
    [(row - 1), (column - 1)], # upleft
    [(row    ), (column - 1)], # left
    [(row + 1), (column - 1)], # downleft
    [(row + 1), (column    )], # down
    [(row + 1), (column + 1)], # downright
    [(row    ), (column + 1)], # right
    [(row - 1), (column + 1)], # upright
    ]

    coordinates.unshift([row, column]) if range == :inclusive

    values = []
    coordinates.each do |xyvalues|
      unless xyvalues.any? { |n| n < 0 || n > two_dimensional_array.length-1 }
        values << xyvalues
      end
    end
    values
end
surrounding_coordinates_to_values(two_dimensional_array, coordinates, options = {}) click to toggle source

Returns an array of adjacent targets for a given set of coordinates.

# File lib/graphutils.rb, line 82
def self.surrounding_coordinates_to_values(two_dimensional_array, coordinates, options = {})
  coordinates = GraphUtils.surrounding_coordinates(two_dimensional_array, coordinates, options)

  values = []
  coordinates.each do |xyvalues|
    unless xyvalues.any? { |n| n < 0 || n > two_dimensional_array.length-1 }
      values << rc_lookup(two_dimensional_array, xyvalues)
    end
  end
  values
end