codebreaker-ga 0.2.5 → 0.2.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 2ae8843aa507b5332c188c9a0e9caf2fe8889d4500db837e0384fd8cb3c787f0
4
- data.tar.gz: 35563bc719b3982e6421377b24da6b763c55aebd1453d5dc532b8238854d0026
3
+ metadata.gz: e647e6d8cb566c0a1f3c8898876d13ac451f7271429ae361fb9750162eeb0e3b
4
+ data.tar.gz: ee54eee43f35693f60ec86ee5cbbb31ef735a6a662c1cde88a7698832f09f5fc
5
5
  SHA512:
6
- metadata.gz: b9c9302560fd26e0dd001d40264a863c01d22baa5790b73f67c4e7ddd3a809e37b17698cf80c8bfc45e784ba3b18a142348bbb1cec34e46aae2c58c4e49374b9
7
- data.tar.gz: e73a4da19d8a35e5ad0ee7d8630240a12350d2b9fe4b2844f889716e8db635799c7410eeb1af1a604583bc4d4441f4cceb84417744faa3d6719334a584d08610
6
+ metadata.gz: c50dc7181c2161a182ee4edb114d36d54795c4de8f81dae72aa948ea580e63cec486516c94357a126572270dd938d6a5861cf4bfc89216bd382d77e44cf83d43
7
+ data.tar.gz: 904ba288e4f486c88398a7a3297b3d3ba6df35b188367280b19d8d81a6bcd6f6d85776117bd1a781e8e677a2a5402b009ba5719862d4e24ee2e560a8a21e1c8a
data/Gemfile.lock CHANGED
@@ -1,12 +1,13 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- codebreaker-ga (0.2.5)
4
+ codebreaker-ga (0.2.6)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.0)
10
+ coderay (1.1.2)
10
11
  colorize (0.8.1)
11
12
  diff-lcs (1.3)
12
13
  docile (1.3.2)
@@ -15,9 +16,13 @@ GEM
15
16
  ruby_parser (>= 3.14.1)
16
17
  jaro_winkler (1.5.4)
17
18
  json (2.3.0)
19
+ method_source (0.9.2)
18
20
  parallel (1.19.1)
19
21
  parser (2.6.5.0)
20
22
  ast (~> 2.4.0)
23
+ pry (0.12.2)
24
+ coderay (~> 1.1.0)
25
+ method_source (~> 0.9.0)
21
26
  rainbow (3.0.0)
22
27
  rake (12.3.3)
23
28
  rspec (3.9.0)
@@ -33,7 +38,7 @@ GEM
33
38
  diff-lcs (>= 1.2.0, < 2.0)
34
39
  rspec-support (~> 3.9.0)
35
40
  rspec-support (3.9.0)
36
- rubocop (0.77.0)
41
+ rubocop (0.78.0)
37
42
  jaro_winkler (~> 1.5.1)
38
43
  parallel (~> 1.10)
39
44
  parser (>= 2.6)
@@ -60,6 +65,7 @@ DEPENDENCIES
60
65
  bundler (~> 2.0)
61
66
  codebreaker-ga!
62
67
  fasterer (~> 0.8.0)
68
+ pry (~> 0.12.2)
63
69
  rake (~> 12.3.1)
64
70
  rspec (~> 3.0)
65
71
  rubocop-rspec
data/codebreaker.gemspec CHANGED
@@ -21,7 +21,7 @@ Gem::Specification.new do |spec|
21
21
 
22
22
  spec.add_development_dependency 'bundler', '~> 2.0'
23
23
  spec.add_development_dependency 'fasterer', '~> 0.8.0'
24
- # spec.add_development_dependency 'pry', '~> 0.12.2'
24
+ spec.add_development_dependency 'pry', '~> 0.12.2'
25
25
  spec.add_development_dependency 'rake', '~> 12.3.1'
26
26
  spec.add_development_dependency 'rspec', '~> 3.0'
27
27
  spec.add_development_dependency 'rubocop-rspec'
data/lib/codebreaker.rb CHANGED
@@ -1,7 +1,9 @@
1
1
  module Codebreaker
2
+ require 'pry'
2
3
  require 'codebreaker/version'
3
4
  require 'codebreaker/yaml_file.rb'
4
5
  require 'codebreaker/validator.rb'
6
+ require 'codebreaker/compare_codes.rb'
5
7
  require 'codebreaker/base_class.rb'
6
8
  require 'codebreaker/difficulty.rb'
7
9
  require 'codebreaker/init_difficulties.rb'
@@ -0,0 +1,46 @@
1
+ module Codebreaker
2
+ class CompareCodes
3
+ def initialize(secret_code)
4
+ @secret_code = secret_code
5
+ @secret_code_positions = get_code_positions(@secret_code)
6
+ end
7
+
8
+ def compare(match_code)
9
+ @match_code_positions = get_code_positions(match_code)
10
+ crossing_values = @secret_code & match_code
11
+ crossing_values.each_with_object([]) { |value, cross_result| cross_result << get_cross_value(value) }
12
+ .flatten.sort_by { |item| item ? 0 : 1 }
13
+ end
14
+
15
+ def get_cross_value(value)
16
+ guess_position(value) + guess_value(value)
17
+ end
18
+
19
+ def guess_position(value)
20
+ crossing_positions = @match_code_positions[value] & @secret_code_positions[value]
21
+ crossing_positions.empty? ? [] : Array.new(crossing_positions.size, true)
22
+ end
23
+
24
+ def guess_value(value)
25
+ crossing_positions = @match_code_positions[value] & @secret_code_positions[value]
26
+
27
+ match_code_positions = crossing_code_position(value, @match_code_positions, crossing_positions)
28
+ secret_code_positions = crossing_code_position(value, @secret_code_positions, crossing_positions)
29
+
30
+ size_no_cross_code = [secret_code_positions[value].size, match_code_positions[value].size].min
31
+ crossing_positions.empty? && size_no_cross_code.zero? ? [] : Array.new(size_no_cross_code, false)
32
+ end
33
+
34
+ def crossing_code_position(value, code_array, crossing_positions)
35
+ code_positions = code_array.dup
36
+ code_positions[value] -= crossing_positions
37
+ code_positions
38
+ end
39
+
40
+ def get_code_positions(code_array)
41
+ return if code_array.nil? || code_array.empty?
42
+
43
+ code_array.each_with_object(Hash.new([])).with_index { |(value, code), index| code[value] += [index] }
44
+ end
45
+ end
46
+ end
@@ -1,46 +1,45 @@
1
1
  module Codebreaker
2
- class CodebreakerGem < BaseClass
2
+ class Game < BaseClass
3
3
  include InitDifficulties
4
4
 
5
5
  CODE_LENGTH = 4
6
6
  CODE_NUMBERS = ('1'..'6').freeze
7
7
 
8
- attr_reader :statistic, :difficulty, :game_stage, :difficulty_change, :errors
8
+ attr_reader :statistic, :difficulties, :difficulty, :errors #:game_stage
9
9
  attr_accessor :user, :hint_code
10
10
 
11
11
  def initialize
12
12
  @errors = {}
13
13
  @statistic = Statistic.new
14
- @difficulty = init_difficulties
14
+ @difficulties = init_difficulties
15
15
  end
16
16
 
17
- def user_code_valid_length?(user_code)
18
- return true if validate_length?(user_code, CODE_LENGTH..CODE_LENGTH)
17
+ def match_code_valid_length?(match_code)
18
+ return true if validate_length?(match_code, CODE_LENGTH..CODE_LENGTH)
19
19
 
20
- false || @errors[:user_code] = 'error_user_code_length'
20
+ (@errors[:match_code] = 'error_match_code_length') && false
21
21
  end
22
22
 
23
- def validate_user_code_number_range?(user_code)
24
- return true if validate_number_range?(user_code, CODE_NUMBERS)
23
+ def validate_match_code_number_range?(match_code)
24
+ return true if validate_number_range?(match_code, CODE_NUMBERS)
25
25
 
26
- false || @errors[:user_code] = 'error_user_code_number'
26
+ (@errors[:match_code] = 'error_match_code_number') && false
27
27
  end
28
28
 
29
- def difficulty_change=(difficulty)
30
- @difficulty_change = @difficulty.detect { |value| value.name == difficulty }
29
+ def difficulty=(difficulty)
30
+ @difficulty = @difficulties.detect { |value| value.name == difficulty }
31
31
  end
32
32
 
33
33
  def game_start
34
34
  generate_secret_code
35
- generate_hints unless @difficulty_change.nil?
36
- @game_stage = GameStage.new(user_code_length: CODE_LENGTH, attempts: @difficulty_change.attempts)
35
+ generate_hints
36
+ @game_stage = GameStage.new(match_code_length: CODE_LENGTH, attempts: @difficulty.attempts)
37
37
  end
38
38
 
39
- def game_step(user_code)
40
- return unless user_code_valid?(user_code)
39
+ def game_step(match_codes)
40
+ return unless match_code_valid?(match_codes)
41
41
 
42
- @user_code_positions = get_code_positions(user_code)
43
- @game_stage.step(compare_codes(user_code))
42
+ @game_stage.step(@compare_codes.compare(match_codes))
44
43
  @game_stage.compare_result
45
44
  end
46
45
 
@@ -57,78 +56,40 @@ module Codebreaker
57
56
  end
58
57
 
59
58
  def statistic_save
60
- @statistic.statistic_add_item(name: user.username, difficulty: difficulty_change, game_stage: game_stage)
59
+ @statistic.statistic_add_item(name: user.username, difficulty: @difficulty, game_stage: @game_stage)
61
60
  @statistic.statistic_save
62
61
  end
63
62
 
64
63
  private
65
64
 
66
- def user_code_valid?(user_code)
67
- return unless user_code_valid_length?(user_code)
68
- return unless validate_user_code_number_range?(user_code)
65
+ def match_code_valid?(match_code)
66
+ return unless match_code_valid_length?(match_code)
67
+ return unless validate_match_code_number_range?(match_code)
69
68
 
70
69
  true
71
70
  end
72
71
 
73
72
  def difficulty_valid?
74
- return true unless @difficulty_change.nil? || @difficulty_change.empty?
73
+ return true unless @difficulty.nil? || @difficulty.empty?
75
74
 
76
75
  @errors[:difficulty] = 'difficulty_change_error'
77
76
  false
78
77
  end
79
78
 
80
- def compare_codes(user_code)
81
- crossing_values = @secret_code & user_code
82
- crossing_values.each_with_object([]) { |value, cross_result| cross_result << get_cross_value(value) }
83
- .flatten.sort_by { |item| item ? 0 : 1 }
84
- end
85
-
86
79
  def generate_number
87
80
  Array.new(CODE_LENGTH) { CODE_NUMBERS.to_a.sample }
88
81
  end
89
82
 
90
- def generate_secret_code
91
- @secret_code = generate_number
92
- @secret_code_positions = get_code_positions(@secret_code)
93
- generate_hints
94
- end
95
-
96
83
  def generate_hints
97
- @hint_code = @secret_code.nil? ? [] : @secret_code.sample(@difficulty_change.hints)
84
+ @hint_code = @secret_code.nil? ? [] : @secret_code.sample(@difficulty.hints)
98
85
  end
99
86
 
100
- def get_cross_value(value)
101
- guess_position(value) + guess_value(value)
102
- end
103
-
104
- def guess_position(value)
105
- crossing_positions = @user_code_positions[value] & @secret_code_positions[value]
106
- crossing_positions.empty? ? [] : Array.new(crossing_positions.size, true)
107
- end
108
-
109
- def guess_value(value)
110
- crossing_positions = @user_code_positions[value] & @secret_code_positions[value]
111
-
112
- user_code_positions = crossing_code_position(value, @user_code_positions, crossing_positions)
113
- secret_code_positions = crossing_code_position(value, @secret_code_positions, crossing_positions)
114
-
115
- size_no_cross_code = [secret_code_positions[value].size, user_code_positions[value].size].min
116
- crossing_positions.empty? && size_no_cross_code.zero? ? [] : Array.new(size_no_cross_code, false)
117
- end
118
-
119
- def crossing_code_position(value, code_array, crossing_positions)
120
- code_positions = code_array.dup
121
- code_positions[value] -= crossing_positions
122
- code_positions
123
- end
124
-
125
- def get_code_positions(code_array)
126
- return if code_array.nil? || code_array.empty?
127
-
128
- code_array.each_with_object(Hash.new([])).with_index { |(value, code), index| code[value] += [index] }
87
+ def generate_secret_code
88
+ @secret_code = generate_number
89
+ @compare_codes = CompareCodes.new(@secret_code)
129
90
  end
130
91
 
131
- def validate?
92
+ def validate
132
93
  @errors = {}
133
94
  difficulty_valid?
134
95
  end
@@ -3,19 +3,19 @@ module Codebreaker
3
3
  attr_reader :step_number, :endgame, :attempts, :compare_result, :win
4
4
  attr_accessor :hint_used
5
5
 
6
- def initialize(user_code_length:, attempts:)
6
+ def initialize(match_code_length:, attempts:)
7
7
  @step_number = 1
8
8
  @endgame = false
9
9
  @attempts = attempts
10
10
  @compare_result = []
11
- @user_code_length = user_code_length
11
+ @match_code_length = match_code_length
12
12
  @hint_used = 0
13
13
  end
14
14
 
15
15
  def step(compare_result)
16
16
  @compare_result = compare_result
17
17
  @step_number += 1
18
- @win = @compare_result.length == @user_code_length && @compare_result.all?
18
+ @win = @compare_result.length == @match_code_length && @compare_result.all?
19
19
  @endgame = true if @step_number > @attempts || @win
20
20
  end
21
21
  end
@@ -1,10 +1,11 @@
1
1
  module Codebreaker
2
2
  module InitDifficulties
3
3
  def init_difficulties
4
- difficulty = []
5
- difficulty << Difficulty.new(name: 'Easy', attempts: 15, hints: 2, level: 0)
6
- difficulty << Difficulty.new(name: 'Medium', attempts: 10, hints: 1, level: 1)
7
- difficulty << Difficulty.new(name: 'Hell', attempts: 5, hints: 1, level: 2)
4
+ [
5
+ Difficulty.new(name: 'Easy', attempts: 15, hints: 2, level: 0),
6
+ Difficulty.new(name: 'Medium', attempts: 10, hints: 1, level: 1),
7
+ Difficulty.new(name: 'Hell', attempts: 5, hints: 1, level: 2)
8
+ ]
8
9
  end
9
10
  end
10
11
  end
@@ -6,13 +6,13 @@ module Codebreaker
6
6
 
7
7
  def initialize(username_new)
8
8
  @username = username_new
9
- @errors = []
9
+ @errors = {}
10
10
  end
11
11
 
12
12
  private
13
13
 
14
14
  def validate
15
- @errors << 'error_name_length' unless validate_length?(@username, USERNAME_LENGTH_RANGE)
15
+ @errors[:user] = 'error_name_length' unless validate_length?(@username, USERNAME_LENGTH_RANGE)
16
16
  end
17
17
  end
18
18
  end
@@ -1,3 +1,3 @@
1
1
  module Codebreaker
2
- VERSION = '0.2.5'.freeze
2
+ VERSION = '0.2.6'.freeze
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: codebreaker-ga
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.2.5
4
+ version: 0.2.6
5
5
  platform: ruby
6
6
  authors:
7
7
  - GorohovAlex
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2019-12-21 00:00:00.000000000 Z
11
+ date: 2019-12-23 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -38,6 +38,20 @@ dependencies:
38
38
  - - "~>"
39
39
  - !ruby/object:Gem::Version
40
40
  version: 0.8.0
41
+ - !ruby/object:Gem::Dependency
42
+ name: pry
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 0.12.2
48
+ type: :development
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 0.12.2
41
55
  - !ruby/object:Gem::Dependency
42
56
  name: rake
43
57
  requirement: !ruby/object:Gem::Requirement
@@ -115,6 +129,7 @@ files:
115
129
  - codebreaker.gemspec
116
130
  - lib/codebreaker.rb
117
131
  - lib/codebreaker/base_class.rb
132
+ - lib/codebreaker/compare_codes.rb
118
133
  - lib/codebreaker/difficulty.rb
119
134
  - lib/codebreaker/game.rb
120
135
  - lib/codebreaker/game_stage.rb