Guesses are cleaned from information already known

This commit is contained in:
Matúš Púll 2024-11-03 14:16:40 +01:00
parent 7aae78f92e
commit de5b6f183a

View file

@ -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();