andrii_codebreaker 0.1.6 → 0.1.11
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 +4 -4
- data/.rubocop.yml +3 -3
- data/Gemfile.lock +3 -5
- data/andrii_codebreaker.gemspec +1 -1
- data/lib/andrii_codebreaker/constants.rb +5 -0
- data/lib/andrii_codebreaker/difficulty.rb +22 -0
- data/lib/andrii_codebreaker/game.rb +42 -48
- data/lib/andrii_codebreaker/statistic.rb +1 -1
- data/lib/andrii_codebreaker/user.rb +3 -13
- data/lib/andrii_codebreaker/version.rb +1 -1
- data/lib/andrii_codebreaker.rb +1 -1
- metadata +4 -5
- data/andrii_codebreaker-0.1.5.gem +0 -0
- data/lib/andrii_codebreaker/validate/validate.rb +0 -37
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 4bbc75e2ca53efd3c8c664765094884f8b2f1238c3b010b66f1652d41fbe3875
|
4
|
+
data.tar.gz: c929acbe775de6c16915289aab8ebcba90cc64c6e1f57bd671526552adeb6688
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a034dc7c27ac804ca5ccfa9810134a34d71d9ca10af0da69123ea91e5d5e0bf88842ce272fc4c7d0946cd8b89738bcb87c7c61168119c9c042c46ddf9603c592
|
7
|
+
data.tar.gz: 48344173cf96f64068804b5e5e5074cbf3338a43731b36c509d5fade4db96f4dee327ac2e7565ea5a41042dba5d3174c996478c80424b765fcb313817110dd87
|
data/.rubocop.yml
CHANGED
@@ -10,12 +10,12 @@ Style/Documentation:
|
|
10
10
|
Metrics/LineLength:
|
11
11
|
Max: 120
|
12
12
|
|
13
|
-
RSpec/AnyInstance:
|
14
|
-
Enabled: false
|
15
|
-
|
16
13
|
Metrics/BlockLength:
|
17
14
|
Exclude:
|
18
15
|
- 'Rakefile'
|
19
16
|
- '**/*.rake'
|
20
17
|
- 'spec/**/*.rb'
|
21
18
|
- '*.gemspec'
|
19
|
+
|
20
|
+
RSpec/NamedSubject:
|
21
|
+
Enabled: false
|
data/Gemfile.lock
CHANGED
@@ -1,21 +1,19 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
andrii_codebreaker (0.1.
|
4
|
+
andrii_codebreaker (0.1.10)
|
5
5
|
|
6
6
|
GEM
|
7
7
|
remote: https://rubygems.org/
|
8
8
|
specs:
|
9
9
|
ast (2.4.2)
|
10
10
|
colorize (0.8.1)
|
11
|
-
concurrent-ruby (1.1.9)
|
12
11
|
diff-lcs (1.4.4)
|
13
12
|
docile (1.4.0)
|
14
13
|
fasterer (0.9.0)
|
15
14
|
colorize (~> 0.7)
|
16
15
|
ruby_parser (>= 3.14.1)
|
17
|
-
|
18
|
-
concurrent-ruby (~> 1.0)
|
16
|
+
ffaker (2.20.0)
|
19
17
|
parallel (1.21.0)
|
20
18
|
parser (3.0.2.0)
|
21
19
|
ast (~> 2.4.1)
|
@@ -67,7 +65,7 @@ PLATFORMS
|
|
67
65
|
DEPENDENCIES
|
68
66
|
andrii_codebreaker!
|
69
67
|
fasterer
|
70
|
-
|
68
|
+
ffaker
|
71
69
|
rake
|
72
70
|
rspec
|
73
71
|
rubocop
|
data/andrii_codebreaker.gemspec
CHANGED
@@ -20,7 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.metadata['source_code_uri'] = spec.homepage
|
21
21
|
|
22
22
|
spec.add_development_dependency 'fasterer'
|
23
|
-
spec.add_development_dependency '
|
23
|
+
spec.add_development_dependency 'ffaker'
|
24
24
|
spec.add_development_dependency 'rake'
|
25
25
|
spec.add_development_dependency 'rspec'
|
26
26
|
spec.add_development_dependency 'rubocop'
|
@@ -2,16 +2,21 @@
|
|
2
2
|
|
3
3
|
module AndriiCodebreaker
|
4
4
|
module Constant
|
5
|
+
LALA = 2
|
5
6
|
NAME_MIN_LENGTH = 3
|
6
7
|
NAME_MAX_LENGTH = 20
|
7
8
|
CODE_START_LENGTH = 1
|
8
9
|
CODE_LENGTH = 6
|
9
10
|
CODE_LENGTH_COUNT = 4
|
11
|
+
RANGE_SECRET_CODE = (CODE_START_LENGTH..CODE_LENGTH).freeze
|
10
12
|
DIFFICULTY = {
|
11
13
|
easy: { attempts: 15, hints: 2 },
|
12
14
|
medium: { attempts: 10, hints: 1 },
|
13
15
|
hell: { attempts: 5, hints: 1 }
|
14
16
|
}.freeze
|
15
17
|
DIFFICULTY_SORT = { easy: 1, medium: 2, hell: 3 }.freeze
|
18
|
+
WIN = '++++'
|
19
|
+
MINUS = '-'
|
20
|
+
PLUS = '+'
|
16
21
|
end
|
17
22
|
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module AndriiCodebreaker
|
4
|
+
class Difficulty
|
5
|
+
include Constant
|
6
|
+
|
7
|
+
attr_reader :name, :hints, :attempts
|
8
|
+
|
9
|
+
def initialize(name)
|
10
|
+
validate_difficulty(name)
|
11
|
+
@name = name
|
12
|
+
@hints = DIFFICULTY[name.to_sym][:hints]
|
13
|
+
@attempts = DIFFICULTY[name.to_sym][:attempts]
|
14
|
+
end
|
15
|
+
|
16
|
+
def validate_difficulty(name)
|
17
|
+
return DIFFICULTY[name.to_sym] if DIFFICULTY.keys.include? name.to_sym
|
18
|
+
|
19
|
+
raise ArgumentError
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -2,82 +2,76 @@
|
|
2
2
|
|
3
3
|
module AndriiCodebreaker
|
4
4
|
class Game
|
5
|
-
include Validate
|
6
5
|
include Statistic
|
7
6
|
include Constant
|
8
7
|
|
9
|
-
attr_reader :player_name, :
|
10
|
-
attr_accessor :
|
11
|
-
|
12
|
-
CONST_COMMAND = {
|
13
|
-
start: 'start',
|
14
|
-
rules: 'rules',
|
15
|
-
stats: 'stats',
|
16
|
-
exit: 'exit'
|
17
|
-
}.freeze
|
8
|
+
attr_reader :player_name, :difficulties, :secret_code
|
9
|
+
attr_accessor :used_hints, :used_attempts, :available_hints
|
18
10
|
|
19
11
|
def initialize(player_name, difficulty)
|
20
|
-
@player_name = player_name
|
21
|
-
@
|
22
|
-
@
|
23
|
-
@
|
24
|
-
initialize_class
|
12
|
+
@player_name = User.new(player_name)
|
13
|
+
@difficulties = Difficulty.new(difficulty)
|
14
|
+
@used_attempts = 0
|
15
|
+
@used_hints = 0
|
25
16
|
end
|
26
17
|
|
27
|
-
def
|
28
|
-
difficult = DIFFICULTY[@difficulty.to_sym]
|
29
|
-
@hints_total = difficult[:hints]
|
30
|
-
@attempts_total = difficult[:attempts]
|
18
|
+
def start
|
31
19
|
@secret_code = generate_code
|
32
|
-
@
|
20
|
+
@available_hints = @secret_code.join.dup
|
33
21
|
end
|
34
22
|
|
35
|
-
def
|
36
|
-
|
23
|
+
def hint
|
24
|
+
return unless left_hint?
|
25
|
+
|
26
|
+
hint = @available_hints.chars.sample
|
27
|
+
@available_hints.sub!(hint, '')
|
28
|
+
@used_hints += 1
|
29
|
+
hint
|
37
30
|
end
|
38
31
|
|
39
|
-
def
|
40
|
-
|
32
|
+
def left_hint?
|
33
|
+
@used_hints < @difficulties.hints
|
34
|
+
end
|
41
35
|
|
42
|
-
|
36
|
+
def left_attempts?
|
37
|
+
@used_attempts < @difficulties.attempts
|
43
38
|
end
|
44
39
|
|
45
|
-
|
40
|
+
def win?(guees)
|
41
|
+
return true if @secret_code.join == guees
|
46
42
|
|
47
|
-
|
48
|
-
@secret_code == guess
|
43
|
+
false
|
49
44
|
end
|
50
45
|
|
51
|
-
def
|
52
|
-
|
53
|
-
|
54
|
-
|
46
|
+
def lose
|
47
|
+
return false unless left_attempts?
|
48
|
+
|
49
|
+
true
|
55
50
|
end
|
56
51
|
|
57
|
-
def
|
58
|
-
|
52
|
+
def compare_codes(guess)
|
53
|
+
@used_attempts += 1
|
59
54
|
|
60
|
-
|
61
|
-
|
62
|
-
|
55
|
+
guess = guess.chars.map(&:to_i)
|
56
|
+
minuses = (@secret_code & guess).map { |element| [@secret_code.count(element), guess.count(element)].min }.sum
|
57
|
+
result = MINUS * minuses
|
63
58
|
|
64
|
-
|
65
|
-
end
|
66
|
-
arr[1].size - arr[0].size
|
59
|
+
check_result(result, guess)
|
67
60
|
end
|
68
61
|
|
69
|
-
def
|
70
|
-
|
62
|
+
def check_result(result, guess)
|
63
|
+
guess.each.with_index do |code, index|
|
64
|
+
result.sub!(MINUS, PLUS) if code == @secret_code[index]
|
65
|
+
end
|
66
|
+
result
|
71
67
|
end
|
72
68
|
|
73
|
-
def
|
74
|
-
|
75
|
-
.delete_if { |el| el[0] == el[1] }
|
76
|
-
.transpose
|
69
|
+
def generate_code
|
70
|
+
Array.new(CODE_LENGTH_COUNT) { rand(RANGE_SECRET_CODE) }
|
77
71
|
end
|
78
72
|
|
79
|
-
def
|
80
|
-
|
73
|
+
def code_valid?(code)
|
74
|
+
code.to_s.match(/^[1-6]{4}$/)
|
81
75
|
end
|
82
76
|
end
|
83
77
|
end
|
@@ -6,7 +6,7 @@ module AndriiCodebreaker
|
|
6
6
|
|
7
7
|
def statistics
|
8
8
|
data = DbYaml.load_file_stats('result.yml')
|
9
|
-
data.sort_by { |item| [-DIFFICULTY_SORT[item.
|
9
|
+
data.sort_by { |item| [-DIFFICULTY_SORT[item.difficulties.name.to_sym], item.used_attempts, item.used_hints] }
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -2,26 +2,16 @@
|
|
2
2
|
|
3
3
|
module AndriiCodebreaker
|
4
4
|
class User
|
5
|
-
include
|
5
|
+
include Constant
|
6
6
|
|
7
7
|
attr_reader :name
|
8
8
|
|
9
9
|
def initialize(name)
|
10
10
|
@name = name
|
11
|
-
validate_name
|
12
11
|
end
|
13
12
|
|
14
|
-
def
|
15
|
-
|
16
|
-
|
17
|
-
game.hints_left += 1
|
18
|
-
game.secret_code_copy.pop
|
19
|
-
end
|
20
|
-
|
21
|
-
private
|
22
|
-
|
23
|
-
def validate_name
|
24
|
-
@name = validates_name(name)
|
13
|
+
def self.validate_name(name)
|
14
|
+
name if name.length >= NAME_MIN_LENGTH && name.length <= NAME_MAX_LENGTH
|
25
15
|
end
|
26
16
|
end
|
27
17
|
end
|
data/lib/andrii_codebreaker.rb
CHANGED
@@ -2,9 +2,9 @@
|
|
2
2
|
|
3
3
|
require 'yaml'
|
4
4
|
require_relative 'andrii_codebreaker/constants'
|
5
|
-
require_relative 'andrii_codebreaker/validate/validate'
|
6
5
|
require_relative 'andrii_codebreaker/model'
|
7
6
|
require_relative 'andrii_codebreaker/user'
|
7
|
+
require_relative 'andrii_codebreaker/difficulty'
|
8
8
|
require_relative 'andrii_codebreaker/statistic'
|
9
9
|
require_relative 'andrii_codebreaker/version'
|
10
10
|
require_relative 'andrii_codebreaker/game'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: andrii_codebreaker
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.1.
|
4
|
+
version: 0.1.11
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrii
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-11-
|
11
|
+
date: 2021-11-25 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: fasterer
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '0'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: ffaker
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - ">="
|
@@ -127,17 +127,16 @@ files:
|
|
127
127
|
- LICENSE.txt
|
128
128
|
- README.md
|
129
129
|
- Rakefile
|
130
|
-
- andrii_codebreaker-0.1.5.gem
|
131
130
|
- andrii_codebreaker.gemspec
|
132
131
|
- bin/console
|
133
132
|
- bin/setup
|
134
133
|
- lib/andrii_codebreaker.rb
|
135
134
|
- lib/andrii_codebreaker/constants.rb
|
135
|
+
- lib/andrii_codebreaker/difficulty.rb
|
136
136
|
- lib/andrii_codebreaker/game.rb
|
137
137
|
- lib/andrii_codebreaker/model.rb
|
138
138
|
- lib/andrii_codebreaker/statistic.rb
|
139
139
|
- lib/andrii_codebreaker/user.rb
|
140
|
-
- lib/andrii_codebreaker/validate/validate.rb
|
141
140
|
- lib/andrii_codebreaker/version.rb
|
142
141
|
homepage: https://github.com/Andrii-RubyGarage/Codebreker-Gem
|
143
142
|
licenses:
|
Binary file
|
@@ -1,37 +0,0 @@
|
|
1
|
-
# frozen_string_literal: true
|
2
|
-
|
3
|
-
module AndriiCodebreaker
|
4
|
-
module Validate
|
5
|
-
include Constant
|
6
|
-
|
7
|
-
def validates_name(name)
|
8
|
-
name if valid_name?(name)
|
9
|
-
end
|
10
|
-
|
11
|
-
def validate_guess(code)
|
12
|
-
code = string_to_integer(code)
|
13
|
-
true if check_code_length?(code) && check_numbers?(code)
|
14
|
-
end
|
15
|
-
|
16
|
-
private
|
17
|
-
|
18
|
-
def string_to_integer(input_code)
|
19
|
-
array_int = []
|
20
|
-
array_chars = input_code.chars
|
21
|
-
array_chars.each { |i| array_int << i.to_i }
|
22
|
-
array_int
|
23
|
-
end
|
24
|
-
|
25
|
-
def valid_name?(name)
|
26
|
-
name.length >= NAME_MIN_LENGTH && name.length <= NAME_MAX_LENGTH
|
27
|
-
end
|
28
|
-
|
29
|
-
def check_code_length?(code)
|
30
|
-
code.length == CODE_LENGTH_COUNT
|
31
|
-
end
|
32
|
-
|
33
|
-
def check_numbers?(code)
|
34
|
-
code.all? { |value| value.between?(CODE_START_LENGTH, CODE_LENGTH) }
|
35
|
-
end
|
36
|
-
end
|
37
|
-
end
|