wordle 0.6.0 → 0.7.0
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/.tool-versions +1 -1
- data/CHANGELOG.md +4 -0
- data/Gemfile +3 -3
- data/Gemfile.lock +30 -31
- data/README.md +1 -0
- data/lib/string.rb +8 -0
- data/lib/wordle/game.rb +7 -2
- data/lib/wordle/guess_analyzer.rb +19 -24
- data/lib/wordle/legend.rb +22 -10
- data/lib/wordle/options.rb +4 -0
- data/lib/wordle/result_builder.rb +68 -0
- data/lib/wordle/version.rb +1 -1
- data/lib/wordle.rb +7 -6
- metadata +3 -2
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 5fa86fa80e845caca00f5128d21a4c569996441d57b9367862a1a634067052d3
|
|
4
|
+
data.tar.gz: a3965aea2dba04cf9abfd4a8bc1e1760980630200f576d60bf7b14319aace3a3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: 9f1772bbf2e003583cf25ee27af46f2911ff584dfa4c4e2533aafeaa411ba877db690d4f4789242a50e9c54a070beea66e3db966ed4aa0a84075b431977be10c
|
|
7
|
+
data.tar.gz: 87f7b5e53311ee0e15f1cacf56f2eaae014ea1a78ce0363f590ee9a4c273b4717bf13f748864dbe67ab567d0862c881fe69f62b2adec8a1c579921b451d9aa74
|
data/.tool-versions
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
ruby 3.1.
|
|
1
|
+
ruby 3.1.1
|
data/CHANGELOG.md
CHANGED
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
|
@@ -1,71 +1,70 @@
|
|
|
1
1
|
PATH
|
|
2
2
|
remote: .
|
|
3
3
|
specs:
|
|
4
|
-
wordle (0.
|
|
4
|
+
wordle (0.7.0)
|
|
5
5
|
|
|
6
6
|
GEM
|
|
7
7
|
remote: https://rubygems.org/
|
|
8
8
|
specs:
|
|
9
9
|
ast (2.4.2)
|
|
10
|
-
debug (1.
|
|
10
|
+
debug (1.5.0)
|
|
11
11
|
irb (>= 1.3.6)
|
|
12
12
|
reline (>= 0.2.7)
|
|
13
13
|
diff-lcs (1.5.0)
|
|
14
14
|
io-console (0.5.11)
|
|
15
15
|
irb (1.4.1)
|
|
16
16
|
reline (>= 0.3.0)
|
|
17
|
-
parallel (1.
|
|
18
|
-
parser (3.1.
|
|
17
|
+
parallel (1.22.1)
|
|
18
|
+
parser (3.1.2.0)
|
|
19
19
|
ast (~> 2.4.1)
|
|
20
|
-
rainbow (3.
|
|
20
|
+
rainbow (3.1.1)
|
|
21
21
|
rake (13.0.6)
|
|
22
|
-
regexp_parser (2.
|
|
22
|
+
regexp_parser (2.3.0)
|
|
23
23
|
reline (0.3.1)
|
|
24
24
|
io-console (~> 0.5)
|
|
25
25
|
rexml (3.2.5)
|
|
26
|
-
rspec (3.
|
|
27
|
-
rspec-core (~> 3.
|
|
28
|
-
rspec-expectations (~> 3.
|
|
29
|
-
rspec-mocks (~> 3.
|
|
30
|
-
rspec-core (3.
|
|
31
|
-
rspec-support (~> 3.
|
|
32
|
-
rspec-expectations (3.
|
|
26
|
+
rspec (3.11.0)
|
|
27
|
+
rspec-core (~> 3.11.0)
|
|
28
|
+
rspec-expectations (~> 3.11.0)
|
|
29
|
+
rspec-mocks (~> 3.11.0)
|
|
30
|
+
rspec-core (3.11.0)
|
|
31
|
+
rspec-support (~> 3.11.0)
|
|
32
|
+
rspec-expectations (3.11.0)
|
|
33
33
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
34
|
-
rspec-support (~> 3.
|
|
35
|
-
rspec-mocks (3.
|
|
34
|
+
rspec-support (~> 3.11.0)
|
|
35
|
+
rspec-mocks (3.11.1)
|
|
36
36
|
diff-lcs (>= 1.2.0, < 2.0)
|
|
37
|
-
rspec-support (~> 3.
|
|
38
|
-
rspec-support (3.
|
|
39
|
-
rubocop (1.
|
|
37
|
+
rspec-support (~> 3.11.0)
|
|
38
|
+
rspec-support (3.11.0)
|
|
39
|
+
rubocop (1.27.0)
|
|
40
40
|
parallel (~> 1.10)
|
|
41
|
-
parser (>= 3.
|
|
41
|
+
parser (>= 3.1.0.0)
|
|
42
42
|
rainbow (>= 2.2.2, < 4.0)
|
|
43
43
|
regexp_parser (>= 1.8, < 3.0)
|
|
44
44
|
rexml
|
|
45
|
-
rubocop-ast (>= 1.
|
|
45
|
+
rubocop-ast (>= 1.16.0, < 2.0)
|
|
46
46
|
ruby-progressbar (~> 1.7)
|
|
47
47
|
unicode-display_width (>= 1.4.0, < 3.0)
|
|
48
|
-
rubocop-ast (1.
|
|
49
|
-
parser (>= 3.
|
|
50
|
-
rubocop-performance (1.13.
|
|
48
|
+
rubocop-ast (1.17.0)
|
|
49
|
+
parser (>= 3.1.1.0)
|
|
50
|
+
rubocop-performance (1.13.3)
|
|
51
51
|
rubocop (>= 1.7.0, < 2.0)
|
|
52
52
|
rubocop-ast (>= 0.4.0)
|
|
53
53
|
ruby-progressbar (1.11.0)
|
|
54
|
-
standard (1.
|
|
55
|
-
rubocop (= 1.
|
|
56
|
-
rubocop-performance (= 1.13.
|
|
54
|
+
standard (1.10.0)
|
|
55
|
+
rubocop (= 1.27.0)
|
|
56
|
+
rubocop-performance (= 1.13.3)
|
|
57
57
|
unicode-display_width (2.1.0)
|
|
58
58
|
|
|
59
59
|
PLATFORMS
|
|
60
60
|
x86_64-darwin-21
|
|
61
|
-
x86_64-linux
|
|
62
61
|
|
|
63
62
|
DEPENDENCIES
|
|
64
63
|
debug (>= 1.0.0)
|
|
65
|
-
rake
|
|
66
|
-
rspec
|
|
67
|
-
standard
|
|
64
|
+
rake
|
|
65
|
+
rspec
|
|
66
|
+
standard
|
|
68
67
|
wordle!
|
|
69
68
|
|
|
70
69
|
BUNDLED WITH
|
|
71
|
-
2.3.
|
|
70
|
+
2.3.7
|
data/README.md
CHANGED
|
@@ -20,6 +20,7 @@ This version will pull a new word at random every time you run it from a very we
|
|
|
20
20
|
Usage: wordle [options]
|
|
21
21
|
-i, --identifier=IDENTIFIER Pass word identifer to target a specific word that someone else has played. Identifier gets printed at the end of the game to share with a friend.
|
|
22
22
|
-d, --difficult Hard mode. Any revealed hints must be used in subsequent guesses.
|
|
23
|
+
-c, --contrast High contrast mode. Matched letters will be orange. Included letters will be blue.
|
|
23
24
|
```
|
|
24
25
|
|
|
25
26
|
## Development
|
data/lib/string.rb
CHANGED
data/lib/wordle/game.rb
CHANGED
|
@@ -10,12 +10,13 @@ module Wordle
|
|
|
10
10
|
@list = List.new
|
|
11
11
|
@options = options_reader.read
|
|
12
12
|
@target_word = generate_word
|
|
13
|
+
@result_builder = ResultBuilder.new(@options[:contrast])
|
|
13
14
|
end
|
|
14
15
|
|
|
15
16
|
def play
|
|
16
17
|
winner = false
|
|
17
18
|
|
|
18
|
-
Legend.print
|
|
19
|
+
Legend.print(@result_builder)
|
|
19
20
|
puts "Guess a 5 letter word: "
|
|
20
21
|
guesses = []
|
|
21
22
|
must_include = []
|
|
@@ -36,7 +37,11 @@ module Wordle
|
|
|
36
37
|
next
|
|
37
38
|
end
|
|
38
39
|
|
|
39
|
-
analyzer = GuessAnalyzer.new(
|
|
40
|
+
analyzer = GuessAnalyzer.new(
|
|
41
|
+
@target_word,
|
|
42
|
+
guess,
|
|
43
|
+
@result_builder
|
|
44
|
+
)
|
|
40
45
|
puts analyzer.colors
|
|
41
46
|
guesses << analyzer.squares
|
|
42
47
|
if @options[:difficult]
|
|
@@ -2,9 +2,10 @@
|
|
|
2
2
|
|
|
3
3
|
module Wordle
|
|
4
4
|
class GuessAnalyzer
|
|
5
|
-
def initialize(target_word, guess)
|
|
5
|
+
def initialize(target_word, guess, result_builder = ResultBuilder.new)
|
|
6
6
|
@target_word = target_word
|
|
7
7
|
@guess = guess
|
|
8
|
+
@result_builder = result_builder
|
|
8
9
|
end
|
|
9
10
|
|
|
10
11
|
def match?
|
|
@@ -12,26 +13,20 @@ module Wordle
|
|
|
12
13
|
end
|
|
13
14
|
|
|
14
15
|
def colors
|
|
15
|
-
|
|
16
|
-
guess_letters[i].send(
|
|
16
|
+
raw_results.each_with_index.map do |result, i|
|
|
17
|
+
guess_letters[i].send(@result_builder.text_color(result))
|
|
17
18
|
end.join("")
|
|
18
19
|
end
|
|
19
20
|
|
|
20
21
|
def squares
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
yellow: "🟨",
|
|
24
|
-
gray: "⬛️"
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
raw_colors.each_with_index.map do |color, i|
|
|
28
|
-
color_map[color]
|
|
22
|
+
raw_results.each_with_index.map do |result, i|
|
|
23
|
+
@result_builder.square(result)
|
|
29
24
|
end.join("")
|
|
30
25
|
end
|
|
31
26
|
|
|
32
27
|
def must_include(prev_must_include)
|
|
33
|
-
|
|
34
|
-
if
|
|
28
|
+
raw_results.each_with_index do |result, i|
|
|
29
|
+
if @result_builder.included?(result) && !prev_must_include.include?(guess_letters[i])
|
|
35
30
|
prev_must_include << guess_letters[i]
|
|
36
31
|
end
|
|
37
32
|
end
|
|
@@ -40,8 +35,8 @@ module Wordle
|
|
|
40
35
|
end
|
|
41
36
|
|
|
42
37
|
def must_match(prev_must_match)
|
|
43
|
-
|
|
44
|
-
if
|
|
38
|
+
raw_results.each_with_index do |result, i|
|
|
39
|
+
if @result_builder.match?(result)
|
|
45
40
|
prev_must_match[i] = guess_letters[i]
|
|
46
41
|
end
|
|
47
42
|
end
|
|
@@ -55,29 +50,29 @@ module Wordle
|
|
|
55
50
|
@_guess_letters ||= @guess.chars
|
|
56
51
|
end
|
|
57
52
|
|
|
58
|
-
def
|
|
59
|
-
@
|
|
53
|
+
def raw_results
|
|
54
|
+
@_raw_results ||= begin
|
|
60
55
|
target_letters = @target_word.chars
|
|
61
|
-
|
|
56
|
+
results = []
|
|
62
57
|
|
|
63
58
|
guess_letters.each_with_index do |letter, i|
|
|
64
59
|
if letter == target_letters[i]
|
|
65
|
-
|
|
60
|
+
results[i] = @result_builder.match
|
|
66
61
|
target_letters[i] = nil
|
|
67
62
|
end
|
|
68
63
|
end
|
|
69
64
|
|
|
70
65
|
guess_letters.each_with_index do |letter, i|
|
|
71
|
-
if
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
if results[i].nil?
|
|
67
|
+
results[i] = if target_letters.include?(letter)
|
|
68
|
+
@result_builder.included
|
|
74
69
|
else
|
|
75
|
-
|
|
70
|
+
@result_builder.miss
|
|
76
71
|
end
|
|
77
72
|
end
|
|
78
73
|
end
|
|
79
74
|
|
|
80
|
-
|
|
75
|
+
results
|
|
81
76
|
end
|
|
82
77
|
end
|
|
83
78
|
end
|
data/lib/wordle/legend.rb
CHANGED
|
@@ -2,29 +2,41 @@
|
|
|
2
2
|
|
|
3
3
|
module Wordle
|
|
4
4
|
class Legend
|
|
5
|
-
def self.print
|
|
6
|
-
new.print
|
|
5
|
+
def self.print(*args)
|
|
6
|
+
new(*args).print
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def initialize(result_builder = ResultBuilder.new)
|
|
10
|
+
@result_builder = result_builder
|
|
7
11
|
end
|
|
8
12
|
|
|
9
13
|
def print
|
|
10
|
-
puts
|
|
11
|
-
puts
|
|
12
|
-
puts
|
|
14
|
+
puts match_example
|
|
15
|
+
puts included_example
|
|
16
|
+
puts miss_example
|
|
13
17
|
puts "\nRestart and add -i flag to target a specific word by hash, for example:"
|
|
14
18
|
puts "$ wordle -i ed541a\n\n"
|
|
15
19
|
end
|
|
16
20
|
|
|
17
21
|
private
|
|
18
22
|
|
|
19
|
-
def
|
|
20
|
-
|
|
23
|
+
def match_color
|
|
24
|
+
@result_builder.match_text_color
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
def included_color
|
|
28
|
+
@result_builder.included_text_color
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def match_example
|
|
32
|
+
"#{"w".send(match_color)}eary - The letter w is in the word and in the correct spot."
|
|
21
33
|
end
|
|
22
34
|
|
|
23
|
-
def
|
|
24
|
-
"p#{"i".
|
|
35
|
+
def included_example
|
|
36
|
+
"p#{"i".send(included_color)}lls - The letter i is in the word but in the wrong spot."
|
|
25
37
|
end
|
|
26
38
|
|
|
27
|
-
def
|
|
39
|
+
def miss_example
|
|
28
40
|
"vag#{"u".gray}e - The letter u is not in the word in any spot."
|
|
29
41
|
end
|
|
30
42
|
end
|
data/lib/wordle/options.rb
CHANGED
|
@@ -15,6 +15,10 @@ module Wordle
|
|
|
15
15
|
opts.on("-d", "--difficult", "Hard mode. Any revealed hints must be used in subsequent guesses.") do |d|
|
|
16
16
|
options[:difficult] = d
|
|
17
17
|
end
|
|
18
|
+
|
|
19
|
+
opts.on("-c", "--contrast", "High contrast mode. Matched letters will be orange. Included letters will be blue.") do |c|
|
|
20
|
+
options[:contrast] = c
|
|
21
|
+
end
|
|
18
22
|
end
|
|
19
23
|
|
|
20
24
|
begin
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
module Wordle
|
|
4
|
+
class ResultBuilder
|
|
5
|
+
MATCH = :match
|
|
6
|
+
INCLUDED = :included
|
|
7
|
+
MISS = :miss
|
|
8
|
+
|
|
9
|
+
DEFAULT_OPTIONS = {
|
|
10
|
+
MATCH => {text: :green, square: "🟩"},
|
|
11
|
+
INCLUDED => {text: :yellow, square: "🟨"},
|
|
12
|
+
MISS => {text: :gray, square: "⬛️"}
|
|
13
|
+
}.freeze
|
|
14
|
+
|
|
15
|
+
CONTRAST_OPTIONS = {
|
|
16
|
+
MATCH => {text: :orange, square: "🟧"},
|
|
17
|
+
INCLUDED => {text: :blue, square: "🟦"},
|
|
18
|
+
MISS => {text: :gray, square: "⬛️"}
|
|
19
|
+
}.freeze
|
|
20
|
+
|
|
21
|
+
def initialize(contrast = false)
|
|
22
|
+
@contrast = contrast
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def match?(result)
|
|
26
|
+
result == MATCH
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def included?(result)
|
|
30
|
+
result == INCLUDED
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def match
|
|
34
|
+
MATCH
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
def included
|
|
38
|
+
INCLUDED
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
def miss
|
|
42
|
+
MISS
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
def match_text_color
|
|
46
|
+
options[match][:text]
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
def included_text_color
|
|
50
|
+
options[included][:text]
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
def text_color(result)
|
|
54
|
+
options[result][:text]
|
|
55
|
+
end
|
|
56
|
+
|
|
57
|
+
def square(result)
|
|
58
|
+
options[result][:square]
|
|
59
|
+
end
|
|
60
|
+
|
|
61
|
+
private
|
|
62
|
+
|
|
63
|
+
def options
|
|
64
|
+
return DEFAULT_OPTIONS if !@contrast
|
|
65
|
+
@_options ||= CONTRAST_OPTIONS
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|
data/lib/wordle/version.rb
CHANGED
data/lib/wordle.rb
CHANGED
|
@@ -4,14 +4,15 @@ require "digest"
|
|
|
4
4
|
require "optparse"
|
|
5
5
|
require_relative "integer"
|
|
6
6
|
require_relative "string"
|
|
7
|
-
require_relative "wordle/
|
|
8
|
-
require_relative "wordle/options"
|
|
9
|
-
require_relative "wordle/source"
|
|
10
|
-
require_relative "wordle/list"
|
|
11
|
-
require_relative "wordle/guess_validator"
|
|
7
|
+
require_relative "wordle/game"
|
|
12
8
|
require_relative "wordle/guess_analyzer"
|
|
9
|
+
require_relative "wordle/guess_validator"
|
|
13
10
|
require_relative "wordle/legend"
|
|
14
|
-
require_relative "wordle/
|
|
11
|
+
require_relative "wordle/list"
|
|
12
|
+
require_relative "wordle/options"
|
|
13
|
+
require_relative "wordle/result_builder"
|
|
14
|
+
require_relative "wordle/source"
|
|
15
|
+
require_relative "wordle/version"
|
|
15
16
|
|
|
16
17
|
module Wordle
|
|
17
18
|
class Error < StandardError; end
|
metadata
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
|
2
2
|
name: wordle
|
|
3
3
|
version: !ruby/object:Gem::Version
|
|
4
|
-
version: 0.
|
|
4
|
+
version: 0.7.0
|
|
5
5
|
platform: ruby
|
|
6
6
|
authors:
|
|
7
7
|
- Jonathan Thom
|
|
@@ -54,6 +54,7 @@ files:
|
|
|
54
54
|
- lib/wordle/legend.rb
|
|
55
55
|
- lib/wordle/list.rb
|
|
56
56
|
- lib/wordle/options.rb
|
|
57
|
+
- lib/wordle/result_builder.rb
|
|
57
58
|
- lib/wordle/source.rb
|
|
58
59
|
- lib/wordle/version.rb
|
|
59
60
|
- wordle.gemspec
|
|
@@ -80,7 +81,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
|
80
81
|
- !ruby/object:Gem::Version
|
|
81
82
|
version: '0'
|
|
82
83
|
requirements: []
|
|
83
|
-
rubygems_version: 3.3.
|
|
84
|
+
rubygems_version: 3.3.7
|
|
84
85
|
signing_key:
|
|
85
86
|
specification_version: 4
|
|
86
87
|
summary: Wordle CLI in Ruby
|