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