Страницы

Поиск по вопросам

пятница, 12 октября 2018 г.

Как создать программу с отгадыванием числа?

Когда я только знакомился с программированием, мне брат подкинул 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 "
"; }

Комментариев нет:

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