wordl-solver 1.4.0 → 2.0.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.
data/lib/wordl_solver.rb CHANGED
@@ -1,64 +1,38 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- require "csv"
4
- require "fileutils"
5
-
6
- FILE_PATH = File.join(File.dirname(__FILE__), "5_words.csv")
7
-
8
- LETTER_WORDS = []
9
-
10
- CSV.foreach(FILE_PATH) do |row|
11
- LETTER_WORDS << row[0]
12
- end
13
-
14
- # The Class WordlSolver is a class that contains the methods to solve the wordl puzzle.
15
- class WordlSolver
16
- class << self
17
- def find_possible_words(greys, greens, yellows)
18
- @greys = greys
19
- @greens = greens
20
- @yellows = yellows
21
- @possible_words = @possible_words.nil? || @possible_words.empty? ? LETTER_WORDS : @possible_words
22
- filter_greens
23
- filter_yellows
24
- filter_greys
25
- @possible_words
3
+ require_relative "wordl_solver/version"
4
+ require_relative "wordl_solver/feedback"
5
+
6
+ module WordlSolver
7
+ # Compute Wordle feedback for a guess against a secret.
8
+ # Returns an Array of 5 Symbols drawn from :green / :yellow / :grey.
9
+ # Two-pass algorithm so duplicate letters are scored correctly.
10
+ def self.score(guess, secret)
11
+ raise ArgumentError, "guess must be a 5-char String" unless guess.is_a?(String) && guess.length == 5
12
+ raise ArgumentError, "secret must be a 5-char String" unless secret.is_a?(String) && secret.length == 5
13
+
14
+ colors = Array.new(5, :grey)
15
+ pool = secret.chars.tally
16
+
17
+ # Pass 1: greens.
18
+ 5.times do |i|
19
+ next unless guess[i] == secret[i]
20
+
21
+ colors[i] = :green
22
+ pool[guess[i]] -= 1
26
23
  end
27
24
 
28
- def filter_greens
29
- @possible_words.select! do |word|
30
- put_in = true
31
- @greens.each do |key, value|
32
- next if value.nil?
25
+ # Pass 2: yellows / greys.
26
+ 5.times do |i|
27
+ next if colors[i] == :green
33
28
 
34
- put_in = false unless word[key] == value
35
- end
36
- put_in
29
+ letter = guess[i]
30
+ if pool.fetch(letter, 0) > 0
31
+ colors[i] = :yellow
32
+ pool[letter] -= 1
37
33
  end
38
34
  end
39
35
 
40
- def filter_yellows
41
- yellow_letters = @yellows.values.flatten.uniq
42
- @possible_words.select! do |word|
43
- possible = true
44
- word.chars.each_with_index do |letter, index|
45
- possible = false if @yellows[index].include?(letter)
46
- end
47
- possible = false unless yellow_letters.all? { |letter| word.include?(letter) }
48
- possible
49
- end
50
- end
51
-
52
- def filter_greys
53
- @possible_words.reject! do |word|
54
- @greys.each do |letter|
55
- if @greens.values.include?(letter)
56
- word.count(letter) > 1
57
- else
58
- word.include?(letter)
59
- end
60
- end
61
- end
62
- end
36
+ Feedback.new(colors)
63
37
  end
64
38
  end
metadata CHANGED
@@ -1,114 +1,84 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: wordl-solver
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.4.0
4
+ version: 2.0.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - george kosmopoulos
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2022-12-24 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
- name: shoulda
15
- requirement: !ruby/object:Gem::Requirement
16
- requirements:
17
- - - ">="
18
- - !ruby/object:Gem::Version
19
- version: '0'
20
- type: :development
21
- prerelease: false
22
- version_requirements: !ruby/object:Gem::Requirement
23
- requirements:
24
- - - ">="
25
- - !ruby/object:Gem::Version
26
- version: '0'
27
- - !ruby/object:Gem::Dependency
28
- name: rdoc
13
+ name: bundler
29
14
  requirement: !ruby/object:Gem::Requirement
30
15
  requirements:
31
16
  - - "~>"
32
17
  - !ruby/object:Gem::Version
33
- version: '3.12'
18
+ version: '2.0'
34
19
  type: :development
35
20
  prerelease: false
36
21
  version_requirements: !ruby/object:Gem::Requirement
37
22
  requirements:
38
23
  - - "~>"
39
24
  - !ruby/object:Gem::Version
40
- version: '3.12'
25
+ version: '2.0'
41
26
  - !ruby/object:Gem::Dependency
42
- name: bundler
27
+ name: minitest
43
28
  requirement: !ruby/object:Gem::Requirement
44
29
  requirements:
45
30
  - - "~>"
46
31
  - !ruby/object:Gem::Version
47
- version: '1.0'
32
+ version: '5.20'
48
33
  type: :development
49
34
  prerelease: false
50
35
  version_requirements: !ruby/object:Gem::Requirement
51
36
  requirements:
52
37
  - - "~>"
53
38
  - !ruby/object:Gem::Version
54
- version: '1.0'
39
+ version: '5.20'
55
40
  - !ruby/object:Gem::Dependency
56
- name: juwelier
41
+ name: rake
57
42
  requirement: !ruby/object:Gem::Requirement
58
43
  requirements:
59
44
  - - "~>"
60
45
  - !ruby/object:Gem::Version
61
- version: 2.1.0
46
+ version: '13.0'
62
47
  type: :development
63
48
  prerelease: false
64
49
  version_requirements: !ruby/object:Gem::Requirement
65
50
  requirements:
66
51
  - - "~>"
67
52
  - !ruby/object:Gem::Version
68
- version: 2.1.0
69
- - !ruby/object:Gem::Dependency
70
- name: simplecov
71
- requirement: !ruby/object:Gem::Requirement
72
- requirements:
73
- - - ">="
74
- - !ruby/object:Gem::Version
75
- version: '0'
76
- type: :development
77
- prerelease: false
78
- version_requirements: !ruby/object:Gem::Requirement
79
- requirements:
80
- - - ">="
81
- - !ruby/object:Gem::Version
82
- version: '0'
83
- description: This gem helps you solve wordl puzzles. It does so by asking you for
84
- the letters position you know, the letters you know exists and the ones you know
85
- don't exists. It then proposes words depending on how good they are by weighting
86
- the letters by their frequency in the english language.
53
+ version: '13.0'
54
+ description: Solves Wordle puzzles by ranking next guesses by expected information
55
+ gain (Shannon entropy of the feedback-pattern distribution). Ships with the real
56
+ Wordle word lists and a single-line interactive CLI.
87
57
  email: gkosmo1@hotmail.com
88
58
  executables:
89
59
  - wordl-solver
90
60
  extensions: []
91
- extra_rdoc_files:
92
- - LICENSE.txt
93
- - README.rdoc
61
+ extra_rdoc_files: []
94
62
  files:
95
- - ".document"
96
- - Gemfile
97
- - Gemfile.lock
63
+ - CHANGELOG.md
98
64
  - LICENSE.txt
99
- - README.rdoc
100
- - Rakefile
101
- - VERSION
65
+ - README.md
102
66
  - bin/wordl-solver
103
- - lib/5_words.csv
67
+ - lib/data/allowed_guesses.txt
68
+ - lib/data/answers.txt
69
+ - lib/data/opening_scores.json
104
70
  - lib/wordl_solver.rb
105
- - lib/wordl_solver_interface.rb
106
- - wordl-solver.gemspec
71
+ - lib/wordl_solver/cli.rb
72
+ - lib/wordl_solver/feedback.rb
73
+ - lib/wordl_solver/filter.rb
74
+ - lib/wordl_solver/game_state.rb
75
+ - lib/wordl_solver/scorer.rb
76
+ - lib/wordl_solver/version.rb
77
+ - lib/wordl_solver/word_lists.rb
107
78
  homepage: http://github.com/gkosmo/wordl-solver
108
79
  licenses:
109
80
  - MIT
110
81
  metadata: {}
111
- post_install_message:
112
82
  rdoc_options: []
113
83
  require_paths:
114
84
  - lib
@@ -116,15 +86,14 @@ required_ruby_version: !ruby/object:Gem::Requirement
116
86
  requirements:
117
87
  - - ">="
118
88
  - !ruby/object:Gem::Version
119
- version: '0'
89
+ version: '3.0'
120
90
  required_rubygems_version: !ruby/object:Gem::Requirement
121
91
  requirements:
122
92
  - - ">="
123
93
  - !ruby/object:Gem::Version
124
94
  version: '0'
125
95
  requirements: []
126
- rubygems_version: 3.3.7
127
- signing_key:
96
+ rubygems_version: 3.6.9
128
97
  specification_version: 4
129
- summary: This gem solves wordl puzzles.
98
+ summary: Entropy-based Wordle solver gem.
130
99
  test_files: []
data/.document DELETED
@@ -1,5 +0,0 @@
1
- lib/**/*.rb
2
- bin/*
3
- -
4
- features/**/*.feature
5
- LICENSE.txt
data/Gemfile DELETED
@@ -1,14 +0,0 @@
1
- source "https://rubygems.org"
2
- # Add dependencies required to use your gem here.
3
- # Example:
4
- # gem "activesupport", ">= 2.3.5"
5
-
6
- # Add dependencies to develop your gem here.
7
- # Include everything needed to run rake, tests, features, etc.
8
- group :development do
9
- gem "shoulda", ">= 0"
10
- gem "rdoc", "~> 3.12"
11
- gem "bundler", "~> 1.0"
12
- gem "juwelier", "~> 2.1.0"
13
- gem "simplecov", ">= 0"
14
- end
data/Gemfile.lock DELETED
@@ -1,113 +0,0 @@
1
- GEM
2
- remote: https://rubygems.org/
3
- specs:
4
- activesupport (7.0.2.3)
5
- concurrent-ruby (~> 1.0, >= 1.0.2)
6
- i18n (>= 1.6, < 2)
7
- minitest (>= 5.1)
8
- tzinfo (~> 2.0)
9
- addressable (2.8.0)
10
- public_suffix (>= 2.0.2, < 5.0)
11
- builder (3.2.4)
12
- concurrent-ruby (1.1.10)
13
- descendants_tracker (0.0.4)
14
- thread_safe (~> 0.3, >= 0.3.1)
15
- docile (1.4.0)
16
- faraday (1.10.0)
17
- faraday-em_http (~> 1.0)
18
- faraday-em_synchrony (~> 1.0)
19
- faraday-excon (~> 1.1)
20
- faraday-httpclient (~> 1.0)
21
- faraday-multipart (~> 1.0)
22
- faraday-net_http (~> 1.0)
23
- faraday-net_http_persistent (~> 1.0)
24
- faraday-patron (~> 1.0)
25
- faraday-rack (~> 1.0)
26
- faraday-retry (~> 1.0)
27
- ruby2_keywords (>= 0.0.4)
28
- faraday-em_http (1.0.0)
29
- faraday-em_synchrony (1.0.0)
30
- faraday-excon (1.1.0)
31
- faraday-httpclient (1.0.1)
32
- faraday-multipart (1.0.3)
33
- multipart-post (>= 1.2, < 3)
34
- faraday-net_http (1.0.1)
35
- faraday-net_http_persistent (1.2.0)
36
- faraday-patron (1.0.0)
37
- faraday-rack (1.0.0)
38
- faraday-retry (1.0.3)
39
- git (1.10.2)
40
- rchardet (~> 1.8)
41
- github_api (0.19.0)
42
- addressable (~> 2.4)
43
- descendants_tracker (~> 0.0.4)
44
- faraday (>= 0.8, < 2)
45
- hashie (~> 3.5, >= 3.5.2)
46
- oauth2 (~> 1.0)
47
- hashie (3.6.0)
48
- highline (2.0.3)
49
- i18n (1.10.0)
50
- concurrent-ruby (~> 1.0)
51
- json (1.8.6)
52
- juwelier (2.1.3)
53
- builder
54
- bundler (>= 1.13)
55
- git (>= 1.2.5)
56
- github_api
57
- highline (>= 1.6.15)
58
- nokogiri (>= 1.5.10)
59
- rake
60
- rdoc
61
- semver
62
- jwt (2.3.0)
63
- mini_portile2 (2.8.0)
64
- minitest (5.15.0)
65
- multi_json (1.15.0)
66
- multi_xml (0.6.0)
67
- multipart-post (2.1.1)
68
- nokogiri (1.13.3)
69
- mini_portile2 (~> 2.8.0)
70
- racc (~> 1.4)
71
- oauth2 (1.4.9)
72
- faraday (>= 0.17.3, < 3.0)
73
- jwt (>= 1.0, < 3.0)
74
- multi_json (~> 1.3)
75
- multi_xml (~> 0.5)
76
- rack (>= 1.2, < 3)
77
- public_suffix (4.0.6)
78
- racc (1.6.0)
79
- rack (2.2.3)
80
- rake (13.0.6)
81
- rchardet (1.8.0)
82
- rdoc (3.12.2)
83
- json (~> 1.4)
84
- ruby2_keywords (0.0.5)
85
- semver (1.0.1)
86
- shoulda (4.0.0)
87
- shoulda-context (~> 2.0)
88
- shoulda-matchers (~> 4.0)
89
- shoulda-context (2.0.0)
90
- shoulda-matchers (4.5.1)
91
- activesupport (>= 4.2.0)
92
- simplecov (0.21.2)
93
- docile (~> 1.1)
94
- simplecov-html (~> 0.11)
95
- simplecov_json_formatter (~> 0.1)
96
- simplecov-html (0.12.3)
97
- simplecov_json_formatter (0.1.4)
98
- thread_safe (0.3.6)
99
- tzinfo (2.0.4)
100
- concurrent-ruby (~> 1.0)
101
-
102
- PLATFORMS
103
- ruby
104
-
105
- DEPENDENCIES
106
- bundler (~> 1.0)
107
- juwelier (~> 2.1.0)
108
- rdoc (~> 3.12)
109
- shoulda
110
- simplecov
111
-
112
- BUNDLED WITH
113
- 1.17.3
data/README.rdoc DELETED
@@ -1,28 +0,0 @@
1
- = wordl-solver
2
-
3
- Description goes here.
4
-
5
- This is a tool I've built to help me solve wordle.
6
- It does so by providing all the 5 letter words, ordering them by the frequency of the letters and filter them depending on the the colours.
7
-
8
-
9
- ** Still To DO
10
-
11
- - have the logic for when a letter appear twice or not
12
- - allow to correct the inputs
13
- - clean the code a bit more
14
-
15
- == Contributing to wordl-solver
16
-
17
- * Check out the latest master to make sure the feature hasn't been implemented or the bug hasn't been fixed yet.
18
- * Check out the issue tracker to make sure someone already hasn't requested it and/or contributed it.
19
- * Fork the project.
20
- * Start a feature/bugfix branch.
21
- * Commit and push until you are happy with your contribution.
22
- * Make sure to add tests for it. This is important so I don't break it in a future version unintentionally.
23
- * Please try not to mess with the Rakefile, version, or history. If you want to have your own version, or is otherwise necessary, that is fine, but please isolate to its own commit so I can cherry-pick around it.
24
-
25
- == Copyright
26
-
27
- Copyright (c) 2022 george kosmopoulos. See LICENSE.txt for
28
- further details.
data/Rakefile DELETED
@@ -1,49 +0,0 @@
1
- require "rubygems"
2
- require "bundler"
3
- begin
4
- Bundler.setup(:default, :development)
5
- rescue Bundler::BundlerError => e
6
- warn e.message
7
- warn "Run `bundle install` to install missing gems"
8
- exit e.status_code
9
- end
10
- require "rake"
11
- require "juwelier"
12
- Juwelier::Tasks.new do |gem|
13
- # gem is a Gem::Specification... see http://guides.rubygems.org/specification-reference/ for more options
14
- gem.name = "wordl-solver"
15
- gem.homepage = "http://github.com/gkosmo/wordl-solver"
16
- gem.license = "MIT"
17
- gem.summary = "This gem solves wordl puzzles."
18
- gem.description = "This gem helps you solve wordl puzzles. It does so by asking you for the letters position you know, the letters you know exists and the ones you know don't exists. It then proposes words depending on how good they are by weighting the letters by their frequency in the english language."
19
- gem.email = "gkosmo1@hotmail.com"
20
- gem.authors = ["george kosmopoulos"]
21
- gem.files.include "lib/*"
22
- # dependencies defined in Gemfile
23
- gem.executables = ["wordl-solver"]
24
- end
25
- Juwelier::RubygemsDotOrgTasks.new
26
- require "rake/testtask"
27
- Rake::TestTask.new(:test) do |test|
28
- test.libs << "lib" << "test"
29
- test.pattern = "test/**/test_*.rb"
30
- test.verbose = true
31
- end
32
-
33
- desc "Code coverage detail"
34
- task :simplecov do
35
- ENV["COVERAGE"] = "true"
36
- Rake::Task["test"].execute
37
- end
38
-
39
- task default: :test
40
-
41
- require "rdoc/task"
42
- Rake::RDocTask.new do |rdoc|
43
- version = File.exist?("VERSION") ? File.read("VERSION") : ""
44
-
45
- rdoc.rdoc_dir = "rdoc"
46
- rdoc.title = "wordl-solver #{version}"
47
- rdoc.rdoc_files.include("README*")
48
- rdoc.rdoc_files.include("lib/**/*.rb")
49
- end
data/VERSION DELETED
@@ -1 +0,0 @@
1
- 1.4.0