Class: Codebreaker::CompareCodes
- Inherits:
-
Object
- Object
- Codebreaker::CompareCodes
- Defined in:
- lib/codebreaker/compare_codes.rb
Instance Method Summary collapse
- #compare(match_code) ⇒ Object
- #crossing_code_position(value, code_array, crossing_positions) ⇒ Object
- #get_code_positions(code_array) ⇒ Object
- #get_cross_value(value) ⇒ Object
- #guess_position(value) ⇒ Object
- #guess_value(value) ⇒ Object
-
#initialize(secret_code) ⇒ CompareCodes
constructor
A new instance of CompareCodes.
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 |