Что нового

Помогите найти алгоритм роста "квадрата"

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Добрый день, написал в эту формулу. т.к вопрос вроде не относиться к autoit непосредственно.
Хочу спросить совета по нахождению формулы для "черного ящика", который на входе принимает 2 значения, скажем X и Y.
Т.к содержимое "черного ящика" трудновато нарисовать в виде таблице, то сделал в виде картинки. См. вложение.
1-ая вертикальная и горизонтальная строка - это X и Y на пересечении которых - цифра-ответ.
Такой квадрат "вырастает" до сторон 256 на 256 но я привел лишь его часть. Легко прослеживается алгоритм его "роста"
Синим цветом я выделил квадраты которые получаются полностью копированием своего "соседа" по верхней левой диагонали. Фактически таким образом копируются все квадратики.
Я пытаюсь написать программу, где мне нужна будет функция, принимающая в качестве параметров X и Y - а на выходе - число стоящее на пересечении этих координат.
До какого то результата я уже додумался, и вывел формулу для определения ячейки при Y=0.
Результат=8*ЦЕЛОЕ(X/4)+3-X
Но как здесь учесть Y ума не приложу.
Буду благодарен за любую помощь и наводку в сторону правильного решения. Спасибо.
 

dwerf

Использует ArchLinux
Сообщения
478
Репутация
219
inververs [?]
Буду благодарен за любую помощь и наводку в сторону правильного решения. Спасибо.

Например x=4, y=14.
Число находится в квадрате 0-7, 8-15.
Этот квадрат - копия квадрата 8-15, 0-7, а число 4, 14 - копия числа 12, 6.
Число 12, 6 находится в квадрате 12-15, 4-7.
Квадрат 12-15, 4-7 - копия квадрата 8-11, 0-3, а число 12, 6 - копия числа 8, 2.
Число 8, 2 находится в квадрате 8-9, 2-3.
Квадрат 8-9, 2-3 - копия квадрата 10-11, 0-1, а число 8, 2 - копия числа 10, 0.
Число 10, 0 имеет координату y = 0, значит его можно найти по формуле.


Код:
#include <Array.au3>

$iHeight = 16
$iWidth = 16
Dim $aTable[$iHeight][$iWidth]

For $i = 0 To $iHeight-1
    For $j = 0 To $iWidth-1
        $aTable[$i][$j] = foo($j, $i)
    Next
Next

_ArrayDisplay($aTable)

Func foo($x, $y)
#cs
    If $y = 0 Then
        Return $x + 3 - 2 * Mod($x, 4)
    Else
        Local $q = 2 ^ Int(Log($y) / Log(2))
        Return foo(BitXOR($x, $q), BitXOR($y, $q))
    EndIf
#ce

    Local $q

    While $y > 0
        $q = 2 ^ Int(Log($y) / Log(2))
        $x = BitXOR($x, $q)
        $y = BitXOR($y, $q)
    WEnd

    Return $x + 3 - 2 * Mod($x, 4)
EndFunc
 
Автор
inververs

inververs

AutoIT Гуру
Сообщения
2,135
Репутация
465
Re: Помогите найти алгоритм роста \\\"квадрата\\\"

dwerf
Оо! Я вам безгранично благодарен за решение. И вдвойне благодарен за готовый алгоритм. Вы гений! Спасибо огромное!


Добавлено:
Сообщение автоматически объединено:

dwerf
Хочу спросить. Есть ли возможность обратного вычисления. Т.е я знаю число которое должно получиться, например 14, и знаю строку в которой оно находится 11. Можно ли узнать столбец? (6)


Добавлено:
Сообщение автоматически объединено:

Сам понял :smile: Упрастил вашу функцию - и все свелось в одно уравнение.
Определяем цифру на пересечении x и y:
Код:
BitXOR($x,$y + 3 - 2 * Mod($y,4))


Соответственно зная x и цифру определяем y:
Код:
BitXOR($z,$x + 3 - 2 * Mod($x,4))
 
Верх