We use cookies to ensure you have the best browsing experience on our website. Please read our cookie policy for more information about how we use cookies.
Project Euler #185: Number Mind
Project Euler #185: Number Mind
Sort by
recency
|
15 Discussions
|
Please Login in order to post a comment
include
include
include
typedef std::vector Sequence; std::vector sequences;
std::vector hits;
// a simple pseudo-random number generator, result in 0 .. modulo - 1 //hackerrank.com/whorahul unsigned int myrand(unsigned int modulo) { static unsigned int seed = 0; seed = 1103515245 * seed + 12345; return seed % modulo; }
// replace reference by a new random digit (0..9) void shuffle(unsigned char& digit) { auto old = digit; do digit = myrand(10); while (digit == old); }
// a player's guess and how many digits were correct void add(const std::string& guess, unsigned int matches) { // convert from ASCII to int Sequence s; for (auto c : guess) s.push_back(c - '0'); sequences.push_back(s);
hits.push_back(matches); }
// compute how many digits of the guesses don't match to the currently analyzed number // a perfect match returns 0, "mismatches" return > 0 unsigned int distance(const Sequence& current) { unsigned int errors = 0;
for (unsigned int i = 0; i < sequences.size(); i++) { // count number of matching digits unsigned int same = 0; for (unsigned int j = 0; j < current.size(); j++) if (current[j] == sequences[i][j]) same++;
}
return errors; }
int main() { //#define ORIGINAL
ifdef ORIGINAL
// guesses of the problem add("5616185650518293", 2); add("3847439647293047", 1); add("5855462940810587", 3); add("9742855507068353", 3); add("4296849643607543", 3); add("3174248439465858", 1); add("4513559094146117", 2); add("7890971548908067", 3); add("8157356344118483", 1); add("2615250744386899", 2); add("8690095851526254", 3); add("6375711915077050", 1); add("6913859173121360", 1); add("6442889055042768", 2); add("2321386104303845", 0); add("2326509471271448", 2); add("5251583379644322", 2); add("1748270476758276", 3); add("4895722652190306", 1); add("3041631117224635", 3); add("1841236454324589", 3); add("2659862637316867", 2);
else
unsigned int numGuesses; std::cin >> numGuesses; while (numGuesses--) { std::string guess; unsigned int correct; std::cin >> guess >> correct; add(guess.c_str(), correct); }
endif
// initially a purely random guess const auto NumDigits = sequences.front().size(); Sequence current(NumDigits, 0); for (auto& x : current) shuffle(x);
// shuffle a random digit when stuck in a local optimum, too const auto MaxRoundsWithoutImprovement = 20; // "sweet spot" for my random number generator auto quietRounds = 0;
auto errors = distance(current); auto previous = errors; while (errors != 0) { // replace every digit by a different random number, keep those that minimize the error metric for (auto& digit : current) { // replace by a new random digit auto previousDigit = digit; do shuffle(digit); while (digit == previousDigit);
}
// show solution for (auto c : current) std::cout << int(c); std::cout << std::endl;
return 0; }
For those who are too much frustrated, here is my code. Sometimes, it passes all tests cases, sometimes 1 or 2 end in "timeout".
I am looking forward to a guess by guess(row by row) approach but I am not able to get the intuition, someone please give me the basic idea or foundation or maybe the pseudo code.
BTW I work in c#
I have designed a genetic algorithm with a fitness function of how many of the guesses my solution satisfies(satisfy = my suggestion and the guess having same digits in the right place, because once my suggestion satisfies all guesses it will be the solution anyways). I am using the most successful ones to generate offsprings(some chars from mother, some from father equal probability) to test again to improve, and 1% mutation to change a random digit doing so. It 100% finds a solution after a couple of minutes, but can't use it on hackerrank because of the timeout limitation :/
20 228569150065 1 907564288621 0 496954400043 0 713459943615 0 211421327491 1 258317293172 0 919252724339 1 197103476352 0 151173430038 0 063794395936 0 504759866532 1 502906565456 0 790539816536 0 595873942664 1 346602334981 0 988808475766 1 559203789779 0 498580144863 1 441454897857 1 622818801178 0