spamsink: (Default)
[personal profile] spamsink
В процессе восстановления исходного текста программы, про которую я рассказывал в давнем году, нашлась вот такая функция (выдача скрипта-декомпилятора слегка причёсана и приведена к сишному виду):
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);
}


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

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

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

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

Date: 2019-01-22 08:42 pm (UTC)
proben: (Default)
From: [personal profile] proben
Я бы проверил версию с календарем. 12 мес, 7 дней недели...
Page generated Jul. 2nd, 2025 06:34 am
Powered by Dreamwidth Studios