new_super_codebreaker_2021 0.4.2 → 0.4.6

Sign up to get free protection for your applications and to get access to all the features.
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