class Mastermind::Game::Code

Attributes

sequence[R]

Public Class Methods

from(colors) click to toggle source
# File lib/mastermind/game/code.rb, line 11
def self.from(colors)
  new(sequence: colors.map { |color| Piece.new(color: color) })
end
new(sequence:) click to toggle source
# File lib/mastermind/game/code.rb, line 15
def initialize(sequence:)
  raise ArgumentError unless sequence.all? { |piece| piece.is_a? Piece }
  @sequence = sequence
end
random(number_of_pieces = 4) click to toggle source
# File lib/mastermind/game/code.rb, line 6
def self.random(number_of_pieces = 4)
  sequence = Array.new(number_of_pieces) { Piece.new }
  new(sequence: sequence)
end

Public Instance Methods

==(code) click to toggle source
# File lib/mastermind/game/code.rb, line 55
def ==(code)
  code.is_a?(Code) &&
  length == code.length &&
  exact_matches_with(code) == length
end
color_counts() click to toggle source
# File lib/mastermind/game/code.rb, line 24
def color_counts
  sequence.each_with_object({}) do |piece, counts|
    counts[piece.color] ||= 0
    counts[piece.color] += 1
  end
end
color_matches_with(code) click to toggle source
# File lib/mastermind/game/code.rb, line 40
def color_matches_with(code)
  raise ArgumentError unless code.is_a? Code
  other_colors = code.color_counts
  sum = 0
  color_counts.each do |color, quantity|
    sum += [quantity, other_colors[color] || 0].min
  end
  sum
end
exact_matches_with(code) click to toggle source
# File lib/mastermind/game/code.rb, line 31
def exact_matches_with(code)
  raise ArgumentError unless code.is_a? Code
  sum = 0
  sequence.each_with_index do |piece, idx|
    sum += 1 if piece == code.sequence[idx]
  end
  sum
end
length() click to toggle source
# File lib/mastermind/game/code.rb, line 20
def length
  @sequence.length
end
partial_matches_with(code) click to toggle source
# File lib/mastermind/game/code.rb, line 50
def partial_matches_with(code)
  raise ArgumentError unless code.is_a? Code
  color_matches_with(code) - exact_matches_with(code)
end