Entry tags:
Я милого узнаю по походке
В процессе восстановления исходного текста программы, про которую я рассказывал в давнем году, нашлась вот такая функция (выдача скрипта-декомпилятора слегка причёсана и приведена к сишному виду):
Предлагается угадать, зачем эта функция была нужна, и почему она именно в таком виде.
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
Сделано так хитро, наверное, потому что сначала arg2 переводится из "базы 1" в "базу 0" и _увеличивается_, потом это увеличение берется по модулю, а потом значение возвращается в "базу 1". А величение по сути оказывается уменьшением потому что оно по размеру больше половины модуля.
А вот что они потом с ним делают - непонятно. Что-нибудь типа генерации псевдослучайных чисел в диапазое [0..6]?
no subject
Во-вторых, для чего бы было нужно принимать три числа, а возвращать число от 0 до 6?
no subject
no subject