-
Notifications
You must be signed in to change notification settings - Fork 0
/
wordle_tools.hpp
109 lines (74 loc) · 2.91 KB
/
wordle_tools.hpp
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#pragma once
#include "word.hpp"
extern std::vector < Word > all_words;
extern std::vector < Word > all_answers;
Word random(const std::vector< Word > & words);
enum Clue { GRAY, YELLOW, GREEN };
struct State {
char matched[word_length];
uint32_t misplaced[word_length];
uint32_t unused;
uint32_t used;
// '?' here will denote we haven't found a match
State() : matched{'?', '?', '?', '?', '?'}, misplaced{}, unused{}, used{}{}
void update(std::array< Clue, 5 > clues, Word word) {
for (int i = 0; i < 5; i++) {
auto mask = letter_mask(word[i]);
if (clues[i] == GRAY) unused |= mask;
if (clues[i] == GREEN) matched[i] = word[i];
if (clues[i] == YELLOW) misplaced[i] |= mask;
if (clues[i] == GREEN || clues[i] == YELLOW) { used |= mask; }
}
}
bool is_possible_hard_mode_guess(Word word) {
// the given word must contain certain letters
if ((letter_mask(word) & used) != used) return false;
// and also satisfy certain matching conditions
for (int i = 0; i < word_length; i++) {
// matched letters must be in certain locations
if (matched[i] != '?' && word[i] != matched[i]) return false;
}
return true;
}
// check if word satisfies the given information about
// which characters are matched, misplaced or unused
bool is_consistent_with(Word word) const {
uint32_t mask = letter_mask(word);
// the given word must contain certain letters
if ((mask & used) != used) return false;
// and not contain others
if (mask & unused) return false;
// and also satisfy certain matching conditions
for (int i = 0; i < word_length; i++) {
char c = word[i];
// matched letters must be in certain locations
if (matched[i] != '?' && c != matched[i]) return false;
// misplaced letters must not be in certain locations
if (letter_mask(c) & misplaced[i]) return false;
}
return true;
}
};
State combine(State a, State b);
void print(State s);
std::vector< Word > select(const std::vector < Word > & words, const State & s);
size_t num_remaining_words(const std::vector < Word > & words, const State & s);
State check(Word answer, Word guess);
auto best_guess_brute_force(const std::vector < Word > & possible_words, State clues);
int wordle_solve(Word answer, bool debug_print = false);
void delete_line();
std::array<Clue, 5> get_clues(Word answer, Word guess);
void print(std::array< Clue, 5 > clues, Word guess);
std::ostream& operator<<(std::ostream & out, std::array< Clue, 5 > clues);
static constexpr std::array< std::array<Clue,5>, 243> all_clues = [](){
std::array< std::array<Clue,5>, 243> clues{};
int count = 0;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
for (int l = 0; l < 3; l++) {
for (int m = 0; m < 3; m++) {
clues[count] = std::array{(Clue)i, (Clue)j, (Clue)k, (Clue)l, (Clue)m};
}}}}}
return clues;
}();