-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathwordle.rb
More file actions
48 lines (43 loc) · 1.22 KB
/
wordle.rb
File metadata and controls
48 lines (43 loc) · 1.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#!ruby -w
words = File.readlines("./words-wordle.txt").map(&:chomp)
scores = Hash.new(0)
words.each do |word|
word.split(//).each { |letter| scores[letter] = scores[letter] + 1 }
end
def score(word, scores) =
word.split(//).uniq.inject(0) { |sum, letter| sum + scores[letter.downcase] }
ARGV.each do |arg|
if arg =~ /^([a-z]{5})=([byg]{5})/
letters = $1.split(//)
results = $2.split(//)
letters
.zip(results)
.each
.with_index do |(letter, result), i|
words =
case result
when "g"
words.select { |word| word[i] == letter }
when "b"
words.reject { |word| word.include?(letter) }
when "y"
words.select { |word| word.include?(letter) && word[i] != letter }
end
end
puts "#{$1} => #{words.size} matches #{"(#{words.sort_by { score(_1, scores) }.join(", ")})" if words.size < 10}"
else
arg
.split(//)
.each { |letter| words = words.select { |word| word.include?(letter) } }
puts "#{arg} => #{words.size} matches"
end
end
puts(
"\n",
words
.map { |word| [word, score(word, scores)] }
.sort_by(&:last)
.reverse
.take(10)
.map { |word, score| "#{word} = #{score}" }
)