new_super_codebreaker_2021 0.4.1 → 0.4.5

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: 75669bd5b9508401f9d4392343606ee771717cec9e5a9d1549bc961640807e61
4
- data.tar.gz: 6b805d7ada72e527238e0855753b173e73bf2c3da90ece4dea51e81b07617467
3
+ metadata.gz: e6e66f5272359e959f412ca6dc0d7363d7ede198844dcdbcd9878701b90347cf
4
+ data.tar.gz: 450d2f983d577a9ccc0c979cb29b8ae8364c3542d809db80dec89482910604c5
5
5
  SHA512:
6
- metadata.gz: fc7468aad2c2075fe1fc48819cfe1c01235f452e9ae564e272d5ca8bef53fad71566f229d7c84a5d114ab9b04121af05263a96ae042ae522ea8f442d9d593551
7
- data.tar.gz: 0dbfc3426a92d5d0502b047f9a2d86300a19a171221e584a6b2579fca532ce5dd64a31f2162da91b3ce6459b0a9db60b9a709c5e6d7637abcf503551d84a3ae1
6
+ metadata.gz: 15def3bd39bf2b810370cf2310d1ac613013a3179da4565459214f2533fe057222b16b4f27bbea189e236f13f4eb022cce560c8983420c0f5a7fa41ff89392f1
7
+ data.tar.gz: 12586743080a5fc9dff5b8e32155f327a95de55ca7355f982f70b530f548daadc8098c268777a78bc6e35a631d7febe1e8d1da309fd933ca272863e388640fae
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- new_super_codebreaker_2021 (0.1.0)
4
+ new_super_codebreaker_2021 (0.4.4)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
@@ -13,6 +13,7 @@ GEM
13
13
  fasterer (0.9.0)
14
14
  colorize (~> 0.7)
15
15
  ruby_parser (>= 3.14.1)
16
+ ffaker (2.19.0)
16
17
  parallel (1.20.1)
17
18
  parser (3.0.2.0)
18
19
  ast (~> 2.4.1)
@@ -54,6 +55,8 @@ GEM
54
55
  simplecov_json_formatter (~> 0.1)
55
56
  simplecov-html (0.12.3)
56
57
  simplecov_json_formatter (0.1.3)
58
+ terminal-table (3.0.1)
59
+ unicode-display_width (>= 1.1.1, < 3)
57
60
  unicode-display_width (2.0.0)
58
61
 
59
62
  PLATFORMS
@@ -61,11 +64,13 @@ PLATFORMS
61
64
 
62
65
  DEPENDENCIES
63
66
  fasterer (~> 0.9.0)
67
+ ffaker
64
68
  new_super_codebreaker_2021!
65
69
  rake (~> 13.0)
66
70
  rspec (~> 3.10.0)
67
71
  rubocop (~> 1.7)
68
- simplecov
72
+ simplecov (~> 0.21.2)
73
+ terminal-table (~> 3.0.1)
69
74
 
70
75
  BUNDLED WITH
71
76
  2.2.26
data/lib/game.rb CHANGED
@@ -5,12 +5,15 @@ require_relative 'db_methods'
5
5
  require_relative 'user'
6
6
  module NewSuperCodebreaker2021
7
7
  class Game
8
+ attr_reader :code
9
+
8
10
  include Validate
9
11
  include ShowContent
10
12
  include DBMethods
11
13
 
12
14
  def initialize
13
15
  @code = generate_code
16
+ @code_copy = @code.dup
14
17
  end
15
18
 
16
19
  GUESS_COMMANDS = %i[hint rules exit].freeze
@@ -36,22 +39,18 @@ module NewSuperCodebreaker2021
36
39
  end
37
40
 
38
41
  def user_guess(code)
39
- if code.to_i != 0
40
- validate_user_code(code)
41
- elsif GUESS_COMMANDS.include?(code.to_sym)
42
- code.to_sym
43
- else false
44
- end
42
+ return validate_user_code(code) unless code.to_i.zero?
43
+
44
+ symbol_code = code.to_sym
45
+ GUESS_COMMANDS.include?(symbol_code) ? symbol_code : nil
45
46
  end
46
47
 
47
- def take_hint(user, code, used_hints)
48
- if user.hints_total > user.hints_used
49
- user.hints_used += 1
50
- used_hints.each { |hint| code.delete(hint) }
51
- code.sample
52
- else
53
- false
54
- end
48
+ def take_hint(user, used_hints)
49
+ return unless user.hints_total > user.hints_used
50
+
51
+ user.hints_used += 1
52
+ used_hints.each { |hint| @code_copy.delete(hint) }
53
+ @code_copy.sample
55
54
  end
56
55
 
57
56
  def after_game_commands(command)
@@ -63,27 +62,34 @@ module NewSuperCodebreaker2021
63
62
  end
64
63
 
65
64
  def compare_codes(user_code)
66
- matches, u_char = number_on_right_place(user_code)
67
- number_in_secret_code(user_code, matches, u_char)
65
+ matches, user_code, code_copy = number_on_right_place(user_code)
66
+ number_in_secret_code(user_code, matches, code_copy)
68
67
  end
69
68
 
70
69
  private
71
70
 
72
71
  def number_on_right_place(user_code)
72
+ code_copy = @code.dup
73
73
  matches = []
74
- u_char = []
75
74
  user_code.each_index do |i|
76
- if @code[i] == user_code[i]
77
- matches.unshift('+')
78
- u_char << user_code[i]
79
- end
75
+ next unless @code[i] == user_code[i]
76
+
77
+ matches.unshift('+')
78
+ user_code[i] = nil
79
+ code_copy[i] = false
80
80
  end
81
- [matches, u_char]
81
+ [matches, user_code, code_copy]
82
82
  end
83
83
 
84
- def number_in_secret_code(user_code, matches, u_char)
84
+ def number_in_secret_code(user_code, matches, code_copy)
85
+ amount_numbers_in_secret_code = Hash.new(0)
86
+ amount_numbers_in_user_code = Hash.new(0)
87
+ code_copy.each { |number| amount_numbers_in_secret_code[number] += 1 }
85
88
  user_code.each do |element|
86
- matches.push('-') if @code.include?(element) && !u_char.include?(element)
89
+ if code_copy.include?(element) && amount_numbers_in_user_code[element] < amount_numbers_in_secret_code[element]
90
+ matches.push('-')
91
+ amount_numbers_in_user_code[element] += 1
92
+ end
87
93
  end
88
94
  matches
89
95
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module NewSuperCodebreaker2021
4
- VERSION = '0.4.1'
4
+ VERSION = '0.4.5'
5
5
  end
data/lib/show_content.rb CHANGED
@@ -1,32 +1,10 @@
1
1
  require 'terminal-table'
2
2
 
3
3
  module ShowContent
4
- DIFFICULTY = {
5
- easy: { attempts: 15, hints: 2 },
6
- medium: { attempts: 10, hints: 1 },
7
- hell: { attempts: 5, hints: 1 }
8
- }.freeze
9
-
10
4
  def show_stats(file)
11
5
  data = YAML.load_file(file) || []
12
- data.sort_by(&:hints_used).sort_by(&:attempts_used).sort_by { |game| -game.difficulty }
13
- create_table(data)
6
+ data.sort_by! { |game| [-game.difficulty, game.attempts_used, game.hints_used] }
14
7
  rescue Errno::ENOENT
15
8
  []
16
9
  end
17
-
18
- private
19
-
20
- def create_table(users)
21
- table = Terminal::Table.new(headings: ['Rating', 'Name', 'Difficulty', 'Attempts Total',
22
- 'Attempts Used', 'Hints Total', 'Hints Used'])
23
- rate = 1
24
-
25
- users.each do |user|
26
- table.add_row([rate, user.name, DIFFICULTY.keys[user.difficulty],
27
- user.attempts_total, user.attempts_used, user.hints_used, user.hints_total])
28
- rate += 1
29
- end
30
- table
31
- end
32
10
  end
data/lib/user.rb CHANGED
@@ -1,32 +1,28 @@
1
+ require_relative 'show_content'
2
+
1
3
  class User
2
4
  attr_reader :name, :difficulty, :hints_total, :attempts_total
3
5
  attr_accessor :hints_used, :attempts_used
4
6
 
7
+ DIFFICULTY = {
8
+ easy: { attempts: 15, hints: 2 },
9
+ medium: { attempts: 10, hints: 1 },
10
+ hell: { attempts: 5, hints: 1 }
11
+ }.freeze
12
+
5
13
  def initialize(name, difficulty)
6
14
  @name = name
7
15
  @difficulty = difficulty
8
16
  @hints_used = 0
9
17
  @attempts_used = 0
10
- check_difficulty(difficulty)
18
+ set_total_fields
11
19
  end
12
20
 
13
21
  private
14
22
 
15
- def check_difficulty(difficulty)
16
- case difficulty
17
- when 0
18
- set_total_fields(2, 15)
19
- when 1
20
- set_total_fields(1, 10)
21
- when 2
22
- set_total_fields(1, 5)
23
- else
24
- false
25
- end
26
- end
27
-
28
- def set_total_fields(hints_total, attempts_total)
29
- @hints_total = hints_total
30
- @attempts_total = attempts_total
23
+ def set_total_fields
24
+ difficulty = DIFFICULTY.keys[@difficulty]
25
+ @hints_total = DIFFICULTY[difficulty][:hints]
26
+ @attempts_total = DIFFICULTY[difficulty][:attempts]
31
27
  end
32
28
  end
data/lib/validate.rb CHANGED
@@ -1,35 +1,32 @@
1
1
  module Validate
2
2
  def validate_name(name)
3
- if name.length >= 3 && name.length <= 20
4
- name
5
- else
6
- false
7
- end
3
+ name if valid_name?(name)
8
4
  end
9
5
 
10
6
  def validate_user_code(us_code)
11
- arr_code = check_splitting(us_code)
12
- if valid_number?(arr_code)
13
- arr_code
14
- else
15
- false
16
- end
7
+ arr_code = split_to_integer_array(us_code)
8
+ return unless valid_number?(arr_code)
9
+
10
+ arr_code
17
11
  end
18
12
 
19
13
  def check_input(input, command_list)
20
- if input.to_i.zero? && command_list.include?(input.to_sym)
21
- input.to_sym
22
- else false
23
- end
14
+ return unless valid_input?(input, command_list)
15
+
16
+ input.to_sym
24
17
  end
25
18
 
26
19
  private
27
20
 
21
+ def valid_input?(input, command_list)
22
+ input.to_i.zero? && command_list.include?(input.to_sym)
23
+ end
24
+
28
25
  def valid_number?(arr_code)
29
- arr_code && check_length?(arr_code) && check_numbers?(arr_code)
26
+ arr_code && check_code_length?(arr_code) && check_numbers?(arr_code)
30
27
  end
31
28
 
32
- def check_splitting(code)
29
+ def split_to_integer_array(code)
33
30
  code.chars.map!(&:to_i) if integer?(code)
34
31
  end
35
32
 
@@ -37,14 +34,15 @@ module Validate
37
34
  code.to_i.to_s == code
38
35
  end
39
36
 
40
- def check_length?(code)
37
+ def check_code_length?(code)
41
38
  code.length == 4
42
39
  end
43
40
 
44
41
  def check_numbers?(code)
45
- code.each do |number|
46
- return if number < 1 || number > 6
47
- end
48
- true
42
+ code.all? { |value| value.between?(1, 6) }
43
+ end
44
+
45
+ def valid_name?(name)
46
+ name.length >= 3 && name.length <= 20
49
47
  end
50
48
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: new_super_codebreaker_2021
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.4.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Nazar Dakhno
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2021-09-06 00:00:00.000000000 Z
11
+ date: 2021-09-12 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: fasterer
@@ -24,6 +24,20 @@ dependencies:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
26
  version: 0.9.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: ffaker
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: 2.19.0
34
+ type: :development
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: 2.19.0
27
41
  - !ruby/object:Gem::Dependency
28
42
  name: rake
29
43
  requirement: !ruby/object:Gem::Requirement