wordle 0.5.0 → 0.6.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 37a2b0b303c14b7f71edbfd175f86a25614a3fc103ba6d1870c02432d2d6010f
4
- data.tar.gz: 336637bbb33eecf7647cc166aa98f0cd3e75e354346a9ac16a3f083a32c24412
3
+ metadata.gz: 4aa10bd48df4f525022634f4a41a1c4009f25e6da6bd9992470c2c963f08a91c
4
+ data.tar.gz: 99047acbf6078ca14d65aaaf71d0727fbb489557d58c72ed02c41d67bbb9b22e
5
5
  SHA512:
6
- metadata.gz: 6f20ad88e68d4fcdbdc5540905690cebb9018aea5dcc8e5f9aa3707aea9321a3579689e8aa0f5b21bd95375906c05135a5e819af33efa1cebfa754cdcbd5d657
7
- data.tar.gz: 9eb4620e84138d2d87204fac907834b24cf41d431b5f4c36e546eb2f545465f8c2ebafae95f563cecf08a0b7f6822f1435d8d122dcf695cadba7ee4790a8660f
6
+ metadata.gz: a807bcfa10a95e25cb272da8d28a8bd65172e3d623ba76f8e0bc98fd8e4f8618e205a18b6ead77c79e3c21171b6801e64c729029cdbbd9615d713cef53767a87
7
+ data.tar.gz: 3e44a8f3ed4eb337de645d60d50399393206d56df15e29262d6a327ae52c3b2edf6dd8e9daee3eeaffb05d66470916cddf518113d2c4d0fb1a0eca720e976db0
data/CHANGELOG.md CHANGED
@@ -1,3 +1,7 @@
1
+ ## [0.6.0] - 2022-04-14
2
+
3
+ - Adds hard mode.
4
+
1
5
  ## [0.5.0] - 2022-02-02
2
6
 
3
7
  - Prints outs squares for sharing at the end of a game.
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- wordle (0.5.0)
4
+ wordle (0.6.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
data/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  Ruby implementation of [Wordle](https://www.powerlanguage.co.uk/wordle/).
4
4
 
5
- <img width="785" alt="Screen Shot 2022-01-14 at 8 10 22 PM" src="https://user-images.githubusercontent.com/22665228/149608330-f5514be8-c0d9-4860-9ed4-d652fdb35cb3.png">
5
+ <img width="869" alt="Screen Shot 2022-02-02 at 10 32 02 PM" src="https://user-images.githubusercontent.com/22665228/152292863-33743039-d9f4-4afa-a321-684d7b67cdb3.png">
6
6
 
7
7
  [![Build](https://github.com/JonathanWThom/wordle/actions/workflows/build.yml/badge.svg)](https://github.com/JonathanWThom/wordle/actions/workflows/build.yml)
8
8
 
@@ -14,11 +14,14 @@ Ruby implementation of [Wordle](https://www.powerlanguage.co.uk/wordle/).
14
14
 
15
15
  Just run `wordle` from the command line.
16
16
 
17
- After the game, a hash will be included with your result. A friend can pass this
18
- hash as the `-i` option to play the same word as you, e.g. `wordle -i ed541a`.
19
-
20
17
  This version will pull a new word at random every time you run it from a very weird and long list. It's much more difficult than the original due to some of the words being a bit uncommon.
21
18
 
19
+ ```
20
+ Usage: wordle [options]
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
+ -d, --difficult Hard mode. Any revealed hints must be used in subsequent guesses.
23
+ ```
24
+
22
25
  ## Development
23
26
 
24
27
  After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake spec` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
@@ -31,7 +34,7 @@ Bug reports and pull requests are welcome on GitHub at https://github.com/Jonath
31
34
 
32
35
  ## Acknowledgements
33
36
 
34
- I cribbed my word list from the Wordle site itself. I have no association with the site or its creator, I'm just a fan!
37
+ I cribbed my word list from the Wordle site itself. I have no association with the site, its creator, or the New York Times - I'm just a fan!
35
38
 
36
39
  ## License
37
40
 
data/lib/integer.rb ADDED
@@ -0,0 +1,13 @@
1
+ # frozen_string_literal: true
2
+
3
+ class Integer
4
+ def ordinalize
5
+ {
6
+ 1 => "1st",
7
+ 2 => "2nd",
8
+ 3 => "3rd",
9
+ 4 => "4th",
10
+ 5 => "5th"
11
+ }[self]
12
+ end
13
+ end
data/lib/wordle/game.rb CHANGED
@@ -2,13 +2,13 @@
2
2
 
3
3
  module Wordle
4
4
  class Game
5
- def self.play
6
- new.play
5
+ def self.play(*args)
6
+ new(*args).play
7
7
  end
8
8
 
9
- def initialize
9
+ def initialize(options_reader = Options.new)
10
10
  @list = List.new
11
- @options = read_options
11
+ @options = options_reader.read
12
12
  @target_word = generate_word
13
13
  end
14
14
 
@@ -18,11 +18,19 @@ module Wordle
18
18
  Legend.print
19
19
  puts "Guess a 5 letter word: "
20
20
  guesses = []
21
+ must_include = []
22
+ must_match = Array.new(5)
21
23
 
22
24
  while guesses.length < 6 && !winner
23
25
  guess = gets.chomp
24
26
 
25
- validator = GuessValidator.new(guess, @list)
27
+ validator = GuessValidator.new(
28
+ guess,
29
+ @list,
30
+ @options[:difficult],
31
+ must_include,
32
+ must_match
33
+ )
26
34
  if validator.invalid?
27
35
  puts validator.error
28
36
  next
@@ -31,6 +39,10 @@ module Wordle
31
39
  analyzer = GuessAnalyzer.new(@target_word, guess)
32
40
  puts analyzer.colors
33
41
  guesses << analyzer.squares
42
+ if @options[:difficult]
43
+ must_include = analyzer.must_include(must_include)
44
+ must_match = analyzer.must_match(must_match)
45
+ end
34
46
 
35
47
  if analyzer.match?
36
48
  winner = true
@@ -58,24 +70,5 @@ module Wordle
58
70
  @list.random
59
71
  end
60
72
  end
61
-
62
- def read_options
63
- options = {}
64
- parser = OptionParser.new do |opts|
65
- opts.banner = "Usage: wordle [options]"
66
-
67
- opts.on("-iIDENTIFIER", "--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.") do |i|
68
- options[:identifier] = i
69
- end
70
- end
71
-
72
- begin
73
- parser.parse!
74
- rescue OptionParser::InvalidOption
75
- puts "Option not recognized"
76
- end
77
-
78
- options
79
- end
80
73
  end
81
74
  end
@@ -1,7 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require_relative "../string"
4
-
5
3
  module Wordle
6
4
  class GuessAnalyzer
7
5
  def initialize(target_word, guess)
@@ -31,10 +29,30 @@ module Wordle
31
29
  end.join("")
32
30
  end
33
31
 
32
+ def must_include(prev_must_include)
33
+ raw_colors.each_with_index do |color, i|
34
+ if color == :yellow && !prev_must_include.include?(guess_letters[i])
35
+ prev_must_include << guess_letters[i]
36
+ end
37
+ end
38
+
39
+ prev_must_include
40
+ end
41
+
42
+ def must_match(prev_must_match)
43
+ raw_colors.each_with_index do |color, i|
44
+ if color == :green
45
+ prev_must_match[i] = guess_letters[i]
46
+ end
47
+ end
48
+
49
+ prev_must_match
50
+ end
51
+
34
52
  private
35
53
 
36
54
  def guess_letters
37
- @_guess_letters = @guess.chars
55
+ @_guess_letters ||= @guess.chars
38
56
  end
39
57
 
40
58
  def raw_colors
@@ -2,23 +2,62 @@
2
2
 
3
3
  module Wordle
4
4
  class GuessValidator
5
- attr_reader :error
6
-
7
- def initialize(guess, list)
5
+ def initialize(
6
+ guess,
7
+ list,
8
+ difficult,
9
+ must_include,
10
+ must_match
11
+ )
8
12
  @guess = guess
9
13
  @list = list
14
+ @difficult = difficult
15
+ @must_include = must_include
16
+ @must_match = must_match
17
+ @validated = false
10
18
  end
11
19
 
12
20
  def invalid?
21
+ !error.nil?
22
+ end
23
+
24
+ def error
25
+ validate if !@validated
26
+
27
+ @error
28
+ end
29
+
30
+ private
31
+
32
+ def validate
33
+ validate_normal_mode
34
+ validate_hard_mode if @difficult
35
+ @validated = true
36
+ end
37
+
38
+ def validate_normal_mode
13
39
  if @guess.length != 5
14
40
  @error = "Guess must be 5 letters long"
15
- return true
16
41
  elsif @list.invalid?(@guess)
17
- @error = "Guess must be a real word"
18
- return true
42
+ @error = "Guess not in word list"
43
+ end
44
+ end
45
+
46
+ def validate_hard_mode
47
+ @must_include.each do |letter|
48
+ if !@guess.include?(letter)
49
+ @error = "Guess must include #{letter}"
50
+ break
51
+ end
19
52
  end
20
53
 
21
- false
54
+ @guess.each_char.with_index do |letter, i|
55
+ match = @must_match[i]
56
+ if match && match != letter
57
+ @error = "#{(i + 1).ordinalize} letter must be #{match}"
58
+ break
59
+ end
60
+ end
22
61
  end
23
62
  end
24
63
  end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Wordle
4
+ class Options
5
+ def read
6
+ options = {}
7
+
8
+ parser = OptionParser.new do |opts|
9
+ opts.banner = "Usage: wordle [options]"
10
+
11
+ opts.on("-iIDENTIFIER", "--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.") do |i|
12
+ options[:identifier] = i
13
+ end
14
+
15
+ opts.on("-d", "--difficult", "Hard mode. Any revealed hints must be used in subsequent guesses.") do |d|
16
+ options[:difficult] = d
17
+ end
18
+ end
19
+
20
+ begin
21
+ parser.parse!
22
+ rescue OptionParser::InvalidOption
23
+ puts "Option not recognized"
24
+ end
25
+
26
+ options
27
+ end
28
+ end
29
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module Wordle
4
- VERSION = "0.5.0"
4
+ VERSION = "0.6.0"
5
5
  end
data/lib/wordle.rb CHANGED
@@ -2,8 +2,10 @@
2
2
 
3
3
  require "digest"
4
4
  require "optparse"
5
+ require_relative "integer"
5
6
  require_relative "string"
6
7
  require_relative "wordle/version"
8
+ require_relative "wordle/options"
7
9
  require_relative "wordle/source"
8
10
  require_relative "wordle/list"
9
11
  require_relative "wordle/guess_validator"
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordle
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.5.0
4
+ version: 0.6.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Jonathan Thom
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2022-02-03 00:00:00.000000000 Z
11
+ date: 2022-04-15 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: debug
@@ -45,6 +45,7 @@ files:
45
45
  - bin/console
46
46
  - bin/setup
47
47
  - exe/wordle
48
+ - lib/integer.rb
48
49
  - lib/string.rb
49
50
  - lib/wordle.rb
50
51
  - lib/wordle/game.rb
@@ -52,6 +53,7 @@ files:
52
53
  - lib/wordle/guess_validator.rb
53
54
  - lib/wordle/legend.rb
54
55
  - lib/wordle/list.rb
56
+ - lib/wordle/options.rb
55
57
  - lib/wordle/source.rb
56
58
  - lib/wordle/version.rb
57
59
  - wordle.gemspec