Guesses are cleaned from information already known
This commit is contained in:
parent
7aae78f92e
commit
de5b6f183a
1 changed files with 46 additions and 7 deletions
47
solver.hpp
47
solver.hpp
|
@ -78,11 +78,39 @@ public:
|
||||||
return {};
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Clear what we already know
|
||||||
|
Historic_guess clean(Historic_guess hist) {
|
||||||
|
// The correct colors we know
|
||||||
|
for(int n = 0; n < known.N; n++) {
|
||||||
|
if(known.final_color(n) == hist.guess[n]) {
|
||||||
|
hist.guess[n] = -1;
|
||||||
|
hist.response[1] -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// The out-of-place colors we know
|
||||||
|
for(int n = 0; n < known.N; n++) {
|
||||||
|
if(hist.guess[n] == -1)
|
||||||
|
continue;
|
||||||
|
for(int i = 0; i < known.N; i++) {
|
||||||
|
if(i == n)
|
||||||
|
continue;
|
||||||
|
if(known.final_color(i) == hist.guess[n]) {
|
||||||
|
hist.guess[n] = -1;
|
||||||
|
hist.response[0] -= 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return hist;
|
||||||
|
}
|
||||||
|
|
||||||
// Specific reactions
|
// Specific reactions
|
||||||
void if_not_here_then_nowhere(vector<int> guess) {
|
void if_not_here_then_nowhere(vector<int> guess) {
|
||||||
// Get all positions of these colors
|
// Get all positions of these colors
|
||||||
auto positions_of_colors = vector<vector<int>>(known.M, vector<int>(0));
|
auto positions_of_colors = vector<vector<int>>(known.M, vector<int>(0));
|
||||||
for(int n = 0; n < known.N; n++)
|
for(int n = 0; n < known.N; n++)
|
||||||
|
if(guess[n] > -1)
|
||||||
positions_of_colors[guess[n]].push_back(n);
|
positions_of_colors[guess[n]].push_back(n);
|
||||||
|
|
||||||
// If color can't be anywhere here, it can't be in the sequence
|
// If color can't be anywhere here, it can't be in the sequence
|
||||||
|
@ -97,20 +125,31 @@ public:
|
||||||
}
|
}
|
||||||
void not_here(vector<int> guess) {
|
void not_here(vector<int> guess) {
|
||||||
for(int n = 0; n < known.N; n++)
|
for(int n = 0; n < known.N; n++)
|
||||||
|
if(guess[n] > -1)
|
||||||
known.cannot_be(n, guess[n]);
|
known.cannot_be(n, guess[n]);
|
||||||
}
|
}
|
||||||
void empty(vector<int> guess) {
|
void empty(vector<int> guess) {
|
||||||
for(int col : guess)
|
for(int col : guess)
|
||||||
|
if(col > -1)
|
||||||
known.empty_color(col);
|
known.empty_color(col);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool learn_back(Historic_guess hist) {
|
bool learn_back(Historic_guess hist) {
|
||||||
bool something_to_learn = true;
|
bool something_to_learn = true;
|
||||||
// TODO
|
|
||||||
|
hist = clean(hist);
|
||||||
|
// TODO Actually learn
|
||||||
|
|
||||||
return something_to_learn;
|
return something_to_learn;
|
||||||
}
|
}
|
||||||
void learn(vector<int> guess, vector<int> response) {
|
void learn(vector<int> p_guess, vector<int> p_response) {
|
||||||
bool something_to_learn;
|
bool something_to_learn;
|
||||||
|
|
||||||
|
// A bit of cleaning
|
||||||
|
auto cleaned = clean({p_guess, p_response});
|
||||||
|
vector<int> guess = cleaned.guess;
|
||||||
|
vector<int> response = cleaned.response;
|
||||||
|
|
||||||
// None of these colors are there
|
// None of these colors are there
|
||||||
if(response[0] == 0 && response[1] == 0) {
|
if(response[0] == 0 && response[1] == 0) {
|
||||||
empty(guess);
|
empty(guess);
|
||||||
|
@ -126,6 +165,7 @@ public:
|
||||||
// At least only on the right spot
|
// At least only on the right spot
|
||||||
else if(response[0] == 0) {
|
else if(response[0] == 0) {
|
||||||
if_not_here_then_nowhere(guess);
|
if_not_here_then_nowhere(guess);
|
||||||
|
// TODO maybe I can guess which one is right
|
||||||
something_to_learn = true;
|
something_to_learn = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -142,10 +182,9 @@ public:
|
||||||
i--;
|
i--;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Write to history
|
// Write to history
|
||||||
if(something_to_learn)
|
if(something_to_learn)
|
||||||
history.push_back({guess, response});
|
history.push_back({p_guess, p_response});
|
||||||
}
|
}
|
||||||
void print() {
|
void print() {
|
||||||
known.print();
|
known.print();
|
||||||
|
|
Loading…
Reference in a new issue