class C4::Model::Matrix

Attributes

columns[R]
matrix[R]
rows[R]

Public Class Methods

new(matrix, rows, columns) click to toggle source
# File lib/c4/model/matrix.rb, line 12
def initialize(matrix, rows, columns)
  @matrix = matrix
  @rows = rows
  @columns = columns
end

Public Instance Methods

diagonal() click to toggle source

rubocop:enable Metrics/AbcSize

# File lib/c4/model/matrix.rb, line 48
def diagonal
  Array.new(size).each_with_index.map do |_, i|
    matrix[i][i]
  end
end
diagonals() click to toggle source

rubocop:enable Metrics/AbcSize, Performance/TimesMap

# File lib/c4/model/matrix.rb, line 69
def diagonals
  quadrants.flat_map(&:quadrant_diagonals).uniq
end
partial_square(from, to) click to toggle source
# File lib/c4/model/matrix.rb, line 34
def partial_square(from, to)
  self.class.new(matrix[from..to].map { |a| a[from..to] }, to - from + 1, to - from + 1)
end
quadrant_diagonals() click to toggle source
# File lib/c4/model/matrix.rb, line 82
def quadrant_diagonals
  (0...size).map do |i|
    partial_square(0, i).rotate.diagonal
  end
end
quadrants() click to toggle source
# File lib/c4/model/matrix.rb, line 73
def quadrants
  [
    square,
    square.rotate,
    square.rotate.rotate,
    square.rotate.rotate.rotate
  ]
end
reverse() click to toggle source
# File lib/c4/model/matrix.rb, line 54
def reverse
  self.class.new(matrix.reverse, rows, columns)
end
rotate() click to toggle source

rubocop:disable Metrics/AbcSize, Performance/TimesMap

# File lib/c4/model/matrix.rb, line 59
def rotate
  result = rows.times.map do |r|
    columns.times.map do |c|
      matrix[columns - c - 1][r]
    end
  end
  self.class.new(result, columns, rows)
end
size() click to toggle source
# File lib/c4/model/matrix.rb, line 30
def size
  [rows, columns].max
end
square() click to toggle source

rubocop:disable Metrics/AbcSize

# File lib/c4/model/matrix.rb, line 39
def square
  sq = matrix.map do |col|
    col[0, size].fill_up_to(size, nil)
  end
  sq[0, size].fill_up_to(size, Array.new(size))
  self.class.new(sq, size, size)
end
transpose() click to toggle source
# File lib/c4/model/matrix.rb, line 18
def transpose
  self.class.new(
    Array.new(rows).each_with_index.map do |_, row|
      Array.new(columns).each_with_index.map do |_, column|
        matrix[column][row]
      end
    end,
    columns,
    rows
  )
end