Когда я только знакомился с программированием, мне брат подкинул exe самописной программы. Исходники он потерял, а я хочу воссоздать эту программу.
Её суть такова:
Даётся три столбца с рандомными цифрами. Ты загадываешь одну цифру и вводишь номер столбца в котором она находится. Потом появляются ещё три столбца, с этими же номерами, но разбросанными по другому. Опять выбираешь столбец в котором твой номер. И так ещё раз. А дальше программа угадывает цифру которую ты загадал.
В общем я не представляю как это реализовать. Я знаю что это абсолютно примитивная консольная программа, но я ещё учусь :)
Дайте хоть какие-нибудь зацепки: алгоритм, пример кода, ссылки. Всему буду благодарен.
Ответ
Дано 3 столбца и 3 итерации. Вариантов размещения одного числа так, что бы можно было по размещению определить число - девять: 000 (число всегда на месте), 001, 002, 010, 011, 012, 020, 021, 022.
Берем по 9 чисел для каждой колонки. Можем заполнить массив из 27 элементов случайными, уникальными числами. Далее в описании алгоритма под число будем понимать его позицию в этом массиве, начиная с 0. Колонки "на экране" будем нумеровать 0, 1, 2. На первой итерации первые 9 чисел заносим в 0 колонку, вторые - в 1ю, третьи в 2ю. При размещении на второй итерации берем остаток до деления числа на 9 (по сути это номер числа в своей группе первой итерации). Делим этот остаток нацело на 3 - это на сколько колонок надо сдвинуть число на второй итерации относительно изначального положения (смещение = (X % 9) / 3). Если номер первоначальной колонки + смещение больше 2, то начинаем отсчет с начала (т.е. делаем 2-(K1+смещение)) На третьей итерации берем остаток от деления на 3 (смещение=X % 3). При таком походе мы для каждого числа получим расстановки указанные в самом начале поста.
Отгадывание: Номер колонки первой итерации умножаем на 9, прибавляем номер колонки второй итерации умноженный на 3, прибавляем номер колонки третьей итерации (K1*9+K2*3+K3). Все, получили число (ну т.е. его позицию в начальном массиве).
Пример:
1я итерация 2я итерация 3я итерация
0 1 2 0 1 2 0 1 2
0 9 18 0 3 6 0 1 2
1 10 19 1 4 7 3 4 5
2 11 20 2 5 8 6 7 8
3 12 21 9 12 15 9 10 11
4 13 22 10 13 16 12 13 14
5 14 23 11 14 17 15 16 17
6 15 24 18 21 24 18 19 20
7 16 25 19 22 25 21 22 23
8 17 26 20 23 26 24 25 26
Пользователь ввел: 2-я, 1-я, 0-я: 2*9+1*3+0=21, ввел 1-я, 2-я, 1-я: 1*9+2*3+1=16
Содержимое колонок на каждой итерации можно перемешать, что бы не было видно закономерностей в распределении.
Прямая печать индексов исходного массива на php (формулы пересмотрены для случая печати всех трех итераций в строку, как на примере выше):
for($i=0;$i<9;$i++) { // Строка
for($j=0;$j<3;$j++) { // Итерация
for($k=0;$k<3;$k++) { // Колонка
if($j==0) $m=$i+9*$k;
elseif($j==1) $m=(int)($i/3)*9+$i%3+$k*3;
else $m=$i*3+$k;
printf("%3d",$m);
}
print " ";
}
print "
";
}
Комментариев нет:
Отправить комментарий