new_super_codebreaker_2021 0.4.2 → 0.4.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: dd7869a4d751d84d0a042d1cd3952bab0d885810a52108988056d7e060064fca
4
- data.tar.gz: f352eda0a33895d65c847f80f4f393382a48eebfac47a218dfb713b9f763248b
3
+ metadata.gz: 81df7f5993ddc2b124bf20ac2632b1c6908a785076afacb407e2a3dcf14b7c11
4
+ data.tar.gz: a9246bff8d86887c221547198b93f8716297989de63ea77a5baa6e2a5c3ff87c
5
5
  SHA512:
6
- metadata.gz: 6504ce6e5d9162e084b055deb28710aaf73b7433eb0f0e58ba543ac219e3e22c8154ad6e4604e14955c70cc7ab58c5988b27095cf7e8cdcbef2fe590eef39958
7
- data.tar.gz: 96bd8fb3d4797bd36ac5ba4e735a7a8741a165fa046db94cc9ab9ac5231364eef1a2d857d35c31c317afe4fbcb027962ef99653559c02bb4232eb488ae21b7f9
6
+ metadata.gz: c8c12e16606143f316f87d56e5b92fe5a76ea1fffbe4f4e7c5ea5ca07dd16905dc8d0f35347bfc81c5ad3e4eddee3f435486e1ccfe77682ccd54ca47e9642f5e
7
+ data.tar.gz: eb64b063703142840276857ebf202e97ed4c2c1e31743c7636cc0f0f0759b69ec71626b0a00b77a8afd7e0ab166940c4a3680238d96f1501bbe838919fe0bafa
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.5)
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 (~> 2.19.0)
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/loader.rb ADDED
@@ -0,0 +1,8 @@
1
+ require 'yaml'
2
+ require_relative 'new_super_codebreaker_2021/user'
3
+ require_relative 'new_super_codebreaker_2021/show_content'
4
+ require_relative 'new_super_codebreaker_2021/db_methods'
5
+ require_relative 'new_super_codebreaker_2021/validate'
6
+ require_relative 'new_super_codebreaker_2021/new_super_codebreaker_2021'
7
+ require_relative 'new_super_codebreaker_2021/game'
8
+ require_relative 'new_super_codebreaker_2021/version'
@@ -0,0 +1,17 @@
1
+ module NewSuperCodebreaker2021
2
+ module DBMethods
3
+ def save(user, file)
4
+ rating = load_file(file)
5
+ rating.push(user)
6
+ File.open(file, 'w') do |filename|
7
+ YAML.dump(rating, filename)
8
+ end
9
+ end
10
+
11
+ def load_file(file)
12
+ YAML.load_file(file)
13
+ rescue Errno::ENOENT
14
+ []
15
+ end
16
+ end
17
+ end
@@ -1,16 +1,16 @@
1
- require 'yaml'
2
- require_relative 'validate'
3
- require_relative 'show_content'
4
- require_relative 'db_methods'
5
- require_relative 'user'
1
+ require_relative '../loader'
2
+
6
3
  module NewSuperCodebreaker2021
7
4
  class Game
8
- include Validate
9
- include ShowContent
10
5
  include DBMethods
6
+ include ShowContent
7
+ include Validate
8
+
9
+ attr_reader :code
11
10
 
12
11
  def initialize
13
12
  @code = generate_code
13
+ @code_copy = @code.dup
14
14
  end
15
15
 
16
16
  GUESS_COMMANDS = %i[hint rules exit].freeze
@@ -36,23 +36,18 @@ module NewSuperCodebreaker2021
36
36
  end
37
37
 
38
38
  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
39
+ return validate_user_code(code) unless code.to_i.zero?
40
+
41
+ symbol_code = code.to_sym
42
+ GUESS_COMMANDS.include?(symbol_code) ? symbol_code : nil
45
43
  end
46
44
 
47
45
  def take_hint(user, used_hints)
48
- code_copy = @code.dup
49
- if user.hints_total > user.hints_used
50
- user.hints_used += 1
51
- used_hints.each { |hint| code_copy.delete(hint) }
52
- code_copy.sample
53
- else
54
- false
55
- end
46
+ return unless user.hints_total > user.hints_used
47
+
48
+ user.hints_used += 1
49
+ used_hints.each { |hint| @code_copy.delete(hint) }
50
+ @code_copy.sample
56
51
  end
57
52
 
58
53
  def after_game_commands(command)
@@ -64,27 +59,34 @@ module NewSuperCodebreaker2021
64
59
  end
65
60
 
66
61
  def compare_codes(user_code)
67
- matches, u_char = number_on_right_place(user_code)
68
- number_in_secret_code(user_code, matches, u_char)
62
+ matches, user_code, code_copy = number_on_right_place(user_code)
63
+ number_in_secret_code(user_code, matches, code_copy)
69
64
  end
70
65
 
71
66
  private
72
67
 
73
68
  def number_on_right_place(user_code)
69
+ code_copy = @code.dup
74
70
  matches = []
75
- u_char = []
76
71
  user_code.each_index do |i|
77
- if @code[i] == user_code[i]
78
- matches.unshift('+')
79
- u_char << user_code[i]
80
- end
72
+ next unless @code[i] == user_code[i]
73
+
74
+ matches.unshift('+')
75
+ user_code[i] = nil
76
+ code_copy[i] = false
81
77
  end
82
- [matches, u_char]
78
+ [matches, user_code, code_copy]
83
79
  end
84
80
 
85
- def number_in_secret_code(user_code, matches, u_char)
81
+ def number_in_secret_code(user_code, matches, code_copy)
82
+ amount_numbers_in_secret_code = Hash.new(0)
83
+ amount_numbers_in_user_code = Hash.new(0)
84
+ code_copy.each { |number| amount_numbers_in_secret_code[number] += 1 }
86
85
  user_code.each do |element|
87
- matches.push('-') if @code.include?(element) && !u_char.include?(element)
86
+ if code_copy.include?(element) && amount_numbers_in_user_code[element] < amount_numbers_in_secret_code[element]
87
+ matches.push('-')
88
+ amount_numbers_in_user_code[element] += 1
89
+ end
88
90
  end
89
91
  matches
90
92
  end
@@ -1,6 +1,3 @@
1
- require_relative 'new_super_codebreaker_2021/version'
2
- require 'game'
3
-
4
1
  module NewSuperCodebreaker2021
5
2
  class Error < StandardError; end
6
3
  end
@@ -0,0 +1,10 @@
1
+ module NewSuperCodebreaker2021
2
+ module ShowContent
3
+ def show_stats(file)
4
+ data = YAML.load_file(file) || []
5
+ data.sort_by! { |game| [-game.difficulty, game.attempts_used, game.hints_used] }
6
+ rescue Errno::ENOENT
7
+ []
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,28 @@
1
+ module NewSuperCodebreaker2021
2
+ class User
3
+ attr_reader :name, :difficulty, :hints_total, :attempts_total
4
+ attr_accessor :hints_used, :attempts_used
5
+
6
+ DIFFICULTY = {
7
+ easy: { attempts: 15, hints: 2 },
8
+ medium: { attempts: 10, hints: 1 },
9
+ hell: { attempts: 5, hints: 1 }
10
+ }.freeze
11
+
12
+ def initialize(name, difficulty)
13
+ @name = name
14
+ @difficulty = difficulty
15
+ @hints_used = 0
16
+ @attempts_used = 0
17
+ set_total_fields
18
+ end
19
+
20
+ private
21
+
22
+ def set_total_fields
23
+ difficulty = DIFFICULTY.keys[@difficulty]
24
+ @hints_total = DIFFICULTY[difficulty][:hints]
25
+ @attempts_total = DIFFICULTY[difficulty][:attempts]
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,50 @@
1
+ module NewSuperCodebreaker2021
2
+ module Validate
3
+ def validate_name(name)
4
+ name if valid_name?(name)
5
+ end
6
+
7
+ def validate_user_code(us_code)
8
+ arr_code = split_to_integer_array(us_code)
9
+ return unless valid_number?(arr_code)
10
+
11
+ arr_code
12
+ end
13
+
14
+ def check_input(input, command_list)
15
+ return unless valid_input?(input, command_list)
16
+
17
+ input.to_sym
18
+ end
19
+
20
+ private
21
+
22
+ def valid_input?(input, command_list)
23
+ input.to_i.zero? && command_list.include?(input.to_sym)
24
+ end
25
+
26
+ def valid_number?(arr_code)
27
+ arr_code && check_code_length?(arr_code) && check_numbers?(arr_code)
28
+ end
29
+
30
+ def split_to_integer_array(code)
31
+ code.chars.map!(&:to_i) if integer?(code)
32
+ end
33
+
34
+ def integer?(code)
35
+ code.to_i.to_s == code
36
+ end
37
+
38
+ def check_code_length?(code)
39
+ code.length == 4
40
+ end
41
+
42
+ def check_numbers?(code)
43
+ code.all? { |value| value.between?(1, 6) }
44
+ end
45
+
46
+ def valid_name?(name)
47
+ name.length >= 3 && name.length <= 20
48
+ end
49
+ end
50
+ end
@@ -1,5 +1,3 @@
1
- # frozen_string_literal: true
2
-
3
1
  module NewSuperCodebreaker2021
4
- VERSION = '0.4.2'
2
+ VERSION = '0.4.6'.freeze
5
3
  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.2
4
+ version: 0.4.6
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-13 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
@@ -109,13 +123,14 @@ files:
109
123
  - Rakefile
110
124
  - bin/console
111
125
  - bin/setup
112
- - lib/db_methods.rb
113
- - lib/game.rb
114
- - lib/new_super_codebreaker_2021.rb
126
+ - lib/loader.rb
127
+ - lib/new_super_codebreaker_2021/db_methods.rb
128
+ - lib/new_super_codebreaker_2021/game.rb
129
+ - lib/new_super_codebreaker_2021/new_super_codebreaker_2021.rb
130
+ - lib/new_super_codebreaker_2021/show_content.rb
131
+ - lib/new_super_codebreaker_2021/user.rb
132
+ - lib/new_super_codebreaker_2021/validate.rb
115
133
  - lib/new_super_codebreaker_2021/version.rb
116
- - lib/show_content.rb
117
- - lib/user.rb
118
- - lib/validate.rb
119
134
  homepage: https://rubygems.org/gems/new_super_codebreaker_2021
120
135
  licenses:
121
136
  - MIT
data/lib/db_methods.rb DELETED
@@ -1,15 +0,0 @@
1
- module DBMethods
2
- def save(user, file)
3
- rating = load_file(file)
4
- rating.push(user)
5
- File.open(file, 'w') do |filename|
6
- YAML.dump(rating, filename)
7
- end
8
- end
9
-
10
- def load_file(file)
11
- YAML.load_file(file)
12
- rescue Errno::ENOENT
13
- []
14
- end
15
- end
data/lib/show_content.rb DELETED
@@ -1,32 +0,0 @@
1
- require 'terminal-table'
2
-
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
- def show_stats(file)
11
- data = YAML.load_file(file) || []
12
- data.sort_by(&:hints_used).sort_by(&:attempts_used).sort_by { |game| -game.difficulty }
13
- create_table(data)
14
- rescue Errno::ENOENT
15
- []
16
- 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
- end
data/lib/user.rb DELETED
@@ -1,32 +0,0 @@
1
- class User
2
- attr_reader :name, :difficulty, :hints_total, :attempts_total
3
- attr_accessor :hints_used, :attempts_used
4
-
5
- def initialize(name, difficulty)
6
- @name = name
7
- @difficulty = difficulty
8
- @hints_used = 0
9
- @attempts_used = 0
10
- check_difficulty(difficulty)
11
- end
12
-
13
- private
14
-
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
31
- end
32
- end
data/lib/validate.rb DELETED
@@ -1,50 +0,0 @@
1
- module Validate
2
- def validate_name(name)
3
- if name.length >= 3 && name.length <= 20
4
- name
5
- else
6
- false
7
- end
8
- end
9
-
10
- 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
17
- end
18
-
19
- 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
24
- end
25
-
26
- private
27
-
28
- def valid_number?(arr_code)
29
- arr_code && check_length?(arr_code) && check_numbers?(arr_code)
30
- end
31
-
32
- def check_splitting(code)
33
- code.chars.map!(&:to_i) if integer?(code)
34
- end
35
-
36
- def integer?(code)
37
- code.to_i.to_s == code
38
- end
39
-
40
- def check_length?(code)
41
- code.length == 4
42
- end
43
-
44
- def check_numbers?(code)
45
- code.each do |number|
46
- return if number < 1 || number > 6
47
- end
48
- true
49
- end
50
- end