From b2a572efb67ab4b419582b101bde8259166ced38 Mon Sep 17 00:00:00 2001 From: Matuush Date: Sun, 3 Nov 2024 11:51:36 +0100 Subject: [PATCH] Learning better divided into functions --- solver.hpp | 113 +++++++++++++++++++++++++++++++++++------------------ 1 file changed, 74 insertions(+), 39 deletions(-) diff --git a/solver.hpp b/solver.hpp index 42d9e69..96d68dc 100644 --- a/solver.hpp +++ b/solver.hpp @@ -9,11 +9,8 @@ struct Game { int N, M; // Table of NxM saying which position can hold which color vector> possible; - // Searched sequence - vector sequence; Game(int p_N, int p_M) : N(p_N), M(p_M) { possible = vector>(N, vector(M, 1)); - sequence = vector(N, -1); } // Learning functions @@ -29,7 +26,22 @@ struct Game { for(int n = 0; n < N; n++) possible[n][col] = 0; } + + // Checking + int final_color(int n) { + int final_col, count = 0; + for(int col = 0; col < M; col++) + if(possible[n][col]) { + final_col = col; + count++; + } + + if(count == 1) + return final_col; + return -1; + } + // Print known information void print() { cout << " "; for(int col = 0; col < M; col++) @@ -44,57 +56,80 @@ struct Game { } }; +// For remembering guesses with their responses +struct Historic_guess { + vector guess, response; + Historic_guess(vector p_guess, vector p_response) { + guess = p_guess; + response = p_response; + } +}; + class Solver { Game known; - vector> history = {}; + vector history = {}; + vector sequence; public: - Solver(int p_N, int p_M) : known({p_N, p_M}) {} + Solver(int p_N, int p_M) : known({p_N, p_M}) { + sequence = vector(p_N, -1); + } vector guess() { // TODO return {}; } - void learn_back(vector historic_guess) { + + // Specific reactions + void if_not_here_then_nowhere(vector guess) { + // Get all positions of these colors + auto positions_of_colors = vector>(known.M, vector(0)); + for(int n = 0; n < known.N; n++) + positions_of_colors[guess[n]].push_back(n); + + // If color can't be anywhere here, it can't be in the sequence + for(int col = 0; col < known.M; col++) { + int possible_count = 0; + for(int n : positions_of_colors[col]) + if(known.possible[n][col]) + possible_count++; + if(possible_count == 0 && positions_of_colors[col].size() > 0) + known.empty_color(col); + } + } + void not_here(vector guess) { + for(int n = 0; n < known.N; n++) + known.cannot_be(n, guess[n]); + } + void empty(vector guess) { + for(int col : guess) + known.empty_color(col); + } + + void learn_back(Historic_guess hist) { // TODO } void learn(vector guess, vector response) { - // Reduce color positions - if(response[0] == 0 && response[1] == 0) { // None of these colors are there - for(int col : guess) - known.empty_color(col); - } - else if(response[1] == 0) { // None at the right spot - // Not here - for(int n = 0; n < known.N; n++) - known.cannot_be(n, guess[n]); - } - else if(response[0] == 0) { // At least only on the right spot - // Get all positions of these colors - auto positions_of_colors = vector>(known.M, vector(0)); - for(int n = 0; n < known.N; n++) - positions_of_colors[guess[n]].push_back(n); + // None of these colors are there + if(response[0] == 0 && response[1] == 0) + empty(guess); - // If color can't be anywhere here, it can't be in the sequence - for(int col = 0; col < known.M; col++) { - int possible_count = 0; - for(int n : positions_of_colors[col]) - if(known.possible[n][col]) - possible_count++; - if(possible_count == 0 && positions_of_colors[col].size() > 0) - known.empty_color(col); - } - } - else { - // TODO nonzero / nonzero - } + // None at the right spot + else if(response[1] == 0) + not_here(guess); + + // At least only on the right spot + else if(response[0] == 0) + if_not_here_then_nowhere(guess); + + // TODO nonzero / nonzero + else + {} // Learn from previous guesses - for(vector past_guess : history) - learn_back(past_guess); + for(auto hist : history) + learn_back(hist); // Write to history - for(int r : response) - guess.push_back(r); - history.push_back(guess); + history.push_back({guess, response}); } void print() { known.print();