class WordSearch::PositionWord::Base

Attributes

coordinate[RW]
direction[RW]
plane[RW]
positions[RW]
word[RW]

Public Class Methods

new(plane, word, direction, coordinate) click to toggle source
# File lib/word_search/position_word/base.rb, line 8
def initialize(plane, word, direction, coordinate)
  @plane = plane
  @word = word
  @direction = direction
  @coordinate = coordinate
  @positions = {}
end

Public Instance Methods

document_position() click to toggle source
# File lib/word_search/position_word/base.rb, line 52
def document_position
  raise NotImplementedError
end
last_coordinates_in_plane?() click to toggle source
# File lib/word_search/position_word/base.rb, line 44
def last_coordinates_in_plane?
  raise NotImplementedError
end
letter_at() click to toggle source
# File lib/word_search/position_word/base.rb, line 48
def letter_at
  raise NotImplementedError
end
perform() click to toggle source
# File lib/word_search/position_word/base.rb, line 16
def perform
  return false unless valid?

  letters.each_with_index do |letter, index|
    place_letter(letter)
    document_position(letter, index)
    update_coordinates
  end

  positions
end
place_letter() click to toggle source
# File lib/word_search/position_word/base.rb, line 32
def place_letter
  raise NotImplementedError
end
positive_last_coordinates?() click to toggle source
# File lib/word_search/position_word/base.rb, line 40
def positive_last_coordinates?
  raise NotImplementedError
end
update_coordinates() click to toggle source
# File lib/word_search/position_word/base.rb, line 36
def update_coordinates
  raise NotImplementedError
end
valid?() click to toggle source
# File lib/word_search/position_word/base.rb, line 28
def valid?
  valid_coordinates? && valid_letters?
end

Private Instance Methods

last_x() click to toggle source
# File lib/word_search/position_word/base.rb, line 58
def last_x
  return @last_x if defined? @last_x

  @last_x = coordinate.x
  (word.length - 1).times do
    @last_x += direction.x
  end

  @last_x
end
last_y() click to toggle source
# File lib/word_search/position_word/base.rb, line 69
def last_y
  return @last_y if defined? @last_y

  @last_y = coordinate.y
  (word.length - 1).times do
    @last_y += direction.y
  end

  @last_y
end
last_z() click to toggle source
# File lib/word_search/position_word/base.rb, line 80
def last_z
  return @last_z if defined? @last_z

  @last_z = coordinate.z
  (word.length - 1).times do
    @last_z += direction.z
  end

  @last_z
end
letters() click to toggle source
# File lib/word_search/position_word/base.rb, line 111
def letters
  @letters ||= word.split("")
end
valid_coordinates?() click to toggle source
# File lib/word_search/position_word/base.rb, line 91
def valid_coordinates?
  positive_last_coordinates? && last_coordinates_in_plane?
end
valid_letters?() click to toggle source
# File lib/word_search/position_word/base.rb, line 95
def valid_letters?
  bad_overlap, intersection_points = false, 0

  letters.count.times do |position|
    next if letter_at(position).blank?

    if letters[position] == letter_at(position)
      intersection_points += 1
    else
      bad_overlap = true
    end
  end

  !bad_overlap && intersection_points < 2
end
x_at(position) click to toggle source
# File lib/word_search/position_word/base.rb, line 115
def x_at(position)
  coordinate.x + position * direction.x
end
y_at(position) click to toggle source
# File lib/word_search/position_word/base.rb, line 119
def y_at(position)
  coordinate.y + position * direction.y
end
z_at(position) click to toggle source
# File lib/word_search/position_word/base.rb, line 123
def z_at(position)
  coordinate.z + position * direction.z
end