Как угадать за максимум 9 попыток число от 0 до 255?
Компьютер "загадывает" число от 0-255 и вы должны за определенное кол-во попыток (9), "угадать" это число. При этом ничего не меняя нигде, кроме тела функции YouLogic()! Т.е. свой код можно писать только в этой функции, задача которой выдавать число в глобальную переменную Guess. Которое далее проверяется функцией Chance() и выдает результат "-" ваше число меньше загаданного, "+" ваше число больше загаданного, "=" вы угадали!
**Кому интересно, нажимаем ответить на вопрос и выкладываем "тело" только своей функции YouLogic().
У меня естественно есть моё решение. Я его выложу позже, когда кто нибудь даст свой рабочий вариант ;)**
#include <stdio.h>
#include <time.h>
#define MAX_GUESS 255 //максимальное число для угадывания
#define ATTEMPT 9 //угадать число за 8 попыток
/* Словарь терминов
Attempt = попытка
Guess = угадать
*/
int Guess;//Глобальная переменная с вашим вариантом
int i;//Какой сейчас проход в цикле
void YouLogic(char lastchance)//В параметре приходит ответ от предыдущего вашего "предсказания" в виде символа char "-","+","=" или 0 при первом запуске
{
//Место под ваш код, решение. Доступны 2 переменные Guess для результата и i(если нужно) для чтения текущего цикла.
/*
Вы можете писать код, только в этой функции! В остальное вносить изменения запрещено! ;)
Вам известно что компьютер загадал число от 0-255 и вам нужно его угадать, как можно за меньшее кол-во раз.
Ваш вариант должен попадать в переменную Guess, доступной глобально. В i(если нужно) текущий проход (цикл)
*/
}
//Функция отвечает на ваше предсказание
char Chance(int Attempt, int Bingo)
{
printf("Ваш вариант %d Загадано %d\n\n", Attempt, Bingo);
if(Attempt < Bingo) return '-';
if(Attempt > Bingo) return '+';
if(Attempt == Bingo) return '=';
}
//Код в main, менять, дописывать нельзя!
int main() {
int Bingo;//загаданное компьютером число
char LastChance = 0;//Последний результат угадывания
srand((unsigned int)time(NULL));
Bingo = rand() % MAX_GUESS;//Компьютер загадывает число от 0-255
printf("Компьютер загадал число, от 0-255. Вам нужно его отгадать за %d попыток, в вашей функции.\n", ATTEMPT);
YouLogic(LastChance);//первый вызов вашего "предсказания" и получение первого числа, результат в Guess
printf("Вы предсказали первое число %d\n", Guess);
for(i = 0;i < ATTEMPT; i++){
LastChance = Chance(Guess, Bingo);//Проверяем ваш вариант
printf("Проход %d [%c]\n", i, LastChance);
if(LastChance == '-') printf("Ваше число меньше загаданного.");
if(LastChance == '+') printf("Ваше число больше загаданного.");
if(LastChance == '=') break;
YouLogic(LastChance);
}
if(LastChance == '='){
printf("Поздравляем! Вы угадали число %d которое загадал компьютер за %d попыток!",Bingo, i);
return 0;
}
printf("К сожалению :( Вы не смогли угадать число за %d попыток. Меняйте логику в вашей функции ;)", ATTEMPT);
getch();
return 0;
}
Ответы (1 шт):
Вот собственно и ответ, упрощенный вариант, для понимания. Можно числа формировать битовой маской, 0b10000000 = 127, 0b01000000 = 64, 16, 8, 4, 2, 1. Таким образом число в диапазоне от 0 до 255, для компьютера выглядит как последовательность бит в байте. И значит чтобы "угадать" число, нужно включать бит и проверять число на < = > и кол-во попыток зависит от битов в числе, но не более 8 вариантов. Так же можно "угадать" число в INT типе, где диапазон 32 бита, а значит за 33 попытки. Ну и 64 битное значение за 65 попыток. Хотя кажется значения INT от 0 до 4+ миллиардов, невозможно угадать с таким малым числом попыток :)
//Первый проход 0
if(i == 0){
Guess = 128;
}
//Второй проход 1
if(i == 1){
if(lastchance == '-') Guess = Guess + 64;
if(lastchance == '+') Guess = Guess - 64;
}
//Третий проход
if(i == 2){
if(lastchance == '-') Guess = Guess + 32;
if(lastchance == '+') Guess = Guess - 32;
}
//Четвертый проход
if(i == 3){
if(lastchance == '-') Guess = Guess + 16;
if(lastchance == '+') Guess = Guess - 16;
}
//Пятый проход
if(i == 4){
if(lastchance == '-') Guess = Guess + 8;
if(lastchance == '+') Guess = Guess - 8;
}
//Шестой проход
if(i == 5){
if(lastchance == '-') Guess = Guess + 4;
if(lastchance == '+') Guess = Guess - 4;
}
//Седьмой проход
if(i == 6){
if(lastchance == '-') Guess = Guess + 2;
if(lastchance == '+') Guess = Guess - 2;
}
//Восьмой проход
if(i == 7){
if(lastchance == '-') Guess = Guess + 1;
if(lastchance == '+') Guess = Guess - 1;
}
//Девятый проход
if(i == 8){
if(lastchance == '-') Guess = Guess + 1;
if(lastchance == '+') Guess = Guess - 1;
}
Может у кого есть подобные, интересные "загадки" и алгоритм их решения? Пишите...