spamsink: (Default)
spamsink ([personal profile] spamsink) wrote2019-01-22 09:01 am

Я милого узнаю по походке

В процессе восстановления исходного текста программы, про которую я рассказывал в давнем году, нашлась вот такая функция (выдача скрипта-декомпилятора слегка причёсана и приведена к сишному виду):
int func(int arg1, int arg2, int arg3) {
    if (arg2 >= 3) goto a;
    arg3 = arg3 - 1;
a: 
    arg2 = arg2 + 011;
    if (arg2 <= 013) goto b;
    arg2 = arg2 - 014;
b:
    arg2 := arg2 + 1;
    return (((((arg1 + arg3) + (arg3 >> 2)) + (((015 * arg2) - 1) / 5)) - 034) % 7);
}


Предлагается угадать, зачем эта функция была нужна, и почему она именно в таком виде.
sab123: (Default)

[personal profile] sab123 2019-01-22 06:13 pm (UTC)(link)
Судя по всему, arg2 "циклически вращается": на каждом вызове уменьшается на 2 в диапазоне [1..12]. Когда он проходит полный цикл, arg3 уменьшается.

Сделано так хитро, наверное, потому что сначала arg2 переводится из "базы 1" в "базу 0" и _увеличивается_, потом это увеличение берется по модулю, а потом значение возвращается в "базу 1". А величение по сути оказывается уменьшением потому что оно по размеру больше половины модуля.

А вот что они потом с ним делают - непонятно. Что-нибудь типа генерации псевдослучайных чисел в диапазое [0..6]?
proben: (Default)

[personal profile] proben 2019-01-22 08:42 pm (UTC)(link)
Я бы проверил версию с календарем. 12 мес, 7 дней недели...