Кодовая загадка для Васи и Пети: решение в единственной функции | 04 ноября 2019 года, 15:38

Меня сегодня зачеленжили очень крутой задачей (ниже), я нашел решение, найдете ли вы? Говорят, что решений несколько, но я кроме своего никаких больше не вижу.

Итак, есть доска 8х8 клеток, на которой случайным образом разбросаны камешки. В каждой клетке может быть сколько угодно камешков, от нуля до сколько там поместится. Ведущий загадывает клетку. Называет ее персонажу А. Персонаж А, назовем его Вася, решает убрать или добавить ровно один камешек на какую-то угодную ему клетку или ничего не трогать. Затем уходит. Приходит второй персонаж, назовем его Петя, смотрит на доску, думает и называет загаданную клетку. Разумеется, Петя и Вася заранее согласовали стратегию, что нужно делать Васе, чтобы Петя угадал клетку. Вопрос — что это за стратегия?

UPDATE: Решение: http://datagenetics.com/blog/december12014/index.html

По сути, нужно написать две функции, encode (cell, origboard), которая возвращает newboard и decode (newboard), которая возвращает cell. Разница между newboard и origboard – один установленный бит.

static long encode(long board, int cell) {

int change = getHash(board) ^ cell;

return board ^ (1L << change);

}

static int decode(long board) {

return getHash(board);

}

static private int getHash(long board) {

int hash = 0;

for (int i = 0; i < 64; i++) {

if ((board & 0x1) != 0) {

hash ^= i;

}

board >>>= 1;

}

return hash;

}

http://datagenetics.com/blog/december12014/index.html

Оставьте комментарий