Class: Codebreaker::CompareCodes

Inherits:
Object
  • Object
show all
Defined in:
lib/codebreaker/compare_codes.rb

Instance Method Summary collapse

Constructor Details

#initialize(secret_code) ⇒ CompareCodes

Returns a new instance of CompareCodes.



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

def initialize(secret_code)
  @secret_code = secret_code
  @secret_code_positions = get_code_positions(@secret_code)
end

Instance Method Details

#compare(match_code) ⇒ Object



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

def compare(match_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



34
35
36
37
38
# File 'lib/codebreaker/compare_codes.rb', line 34

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



40
41
42
43
44
# File 'lib/codebreaker/compare_codes.rb', line 40

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



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

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

#guess_position(value) ⇒ Object



19
20
21
22
# File 'lib/codebreaker/compare_codes.rb', line 19

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



24
25
26
27
28
29
30
31
32
# File 'lib/codebreaker/compare_codes.rb', line 24

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