Я милого узнаю по походке
Jan. 22nd, 2019 09:01 am![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
В процессе восстановления исходного текста программы, про которую я рассказывал в давнем году, нашлась вот такая функция (выдача скрипта-декомпилятора слегка причёсана и приведена к сишному виду):
Предлагается угадать, зачем эта функция была нужна, и почему она именно в таком виде.
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); }
Предлагается угадать, зачем эта функция была нужна, и почему она именно в таком виде.
no subject
Date: 2019-01-22 06:13 pm (UTC)Сделано так хитро, наверное, потому что сначала arg2 переводится из "базы 1" в "базу 0" и _увеличивается_, потом это увеличение берется по модулю, а потом значение возвращается в "базу 1". А величение по сути оказывается уменьшением потому что оно по размеру больше половины модуля.
А вот что они потом с ним делают - непонятно. Что-нибудь типа генерации псевдослучайных чисел в диапазое [0..6]?
no subject
Date: 2019-01-22 07:45 pm (UTC)Во-вторых, для чего бы было нужно принимать три числа, а возвращать число от 0 до 6?
no subject
Date: 2019-01-22 08:42 pm (UTC)no subject
Date: 2019-01-22 11:36 pm (UTC)