Как угадать за максимум 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 шт):

Автор решения: FrancNet

Вот собственно и ответ, упрощенный вариант, для понимания. Можно числа формировать битовой маской, 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;
  }

Может у кого есть подобные, интересные "загадки" и алгоритм их решения? Пишите...

→ Ссылка