Module: Codebreaker::CompareCodes

Included in:
Game
Defined in:
lib/codebreaker/compare_codes.rb

Instance Method Summary collapse

Instance Method Details

#compare(secret_code, match_code) ⇒ Object



3
4
5
6
7
8
9
# File 'lib/codebreaker/compare_codes.rb', line 3

def compare(secret_code, match_code)
  @secret_code_positions = get_code_positions(secret_code)
  @match_code_positions = get_code_positions(match_code)
  crossing_values = secret_code & match_code
  crossing_values.each_with_object([]) { |value, cross_result| cross_result << get_cross_value(value) }
                 .flatten.sort_by { |item| item ? 0 : 1 }
end

#crossing_code_position(value, code_array, crossing_positions) ⇒ Object



30
31
32
33
34
# File 'lib/codebreaker/compare_codes.rb', line 30

def crossing_code_position(value, code_array, crossing_positions)
  code_positions = code_array.dup
  code_positions[value] -= crossing_positions
  code_positions
end

#get_code_positions(code_array) ⇒ Object



36
37
38
39
40
# File 'lib/codebreaker/compare_codes.rb', line 36

def get_code_positions(code_array)
  return if code_array.nil? || code_array.empty?

  code_array.each_with_object(Hash.new([])).with_index { |(value, code), index| code[value] += [index] }
end

#get_cross_value(value) ⇒ Object



11
12
13
# File 'lib/codebreaker/compare_codes.rb', line 11

def get_cross_value(value)
  guess_position(value) + guess_value(value)
end

#guess_position(value) ⇒ Object



15
16
17
18
# File 'lib/codebreaker/compare_codes.rb', line 15

def guess_position(value)
  crossing_positions = @match_code_positions[value] & @secret_code_positions[value]
  crossing_positions.empty? ? [] : Array.new(crossing_positions.size, true)
end

#guess_value(value) ⇒ Object



20
21
22
23
24
25
26
27
28
# File 'lib/codebreaker/compare_codes.rb', line 20

def guess_value(value)
  crossing_positions = @match_code_positions[value] & @secret_code_positions[value]

  match_code_positions = crossing_code_position(value, @match_code_positions, crossing_positions)
  secret_code_positions = crossing_code_position(value, @secret_code_positions, crossing_positions)

  size_no_cross_code = [secret_code_positions[value].size, match_code_positions[value].size].min
  crossing_positions.empty? && size_no_cross_code.zero? ? [] : Array.new(size_no_cross_code, false)
end