Предизвикателства > Осем-измерна битова баница с късмет > Решения > Решението на Йоан Байчев

Резултати
1 точки от тестове
0 точки от учител

1 точки общо

1 успешни теста
0 неуспешни теста
Код

 1from secret import clue
 2
 3def lucky():
 4
 5    bits_low = (clue(left_shift=5) >> 5) & 0b111  # bit2, bit1, bit0
 6    bits_high = clue(right_shift=5) & 0b111  # bit7, bit6, bit5
 7
 8    bit_middle = (1 << 0b1) if clue(bw_or=239) != 239 else 0 # bit4
 9    bit_middle = (bit_middle | 0b1) if clue(bw_and=8) else bit_middle # bit4, bit3
10
11    result = (bits_high << 5) | (bit_middle << 3) | bits_low
12
13    return result

.
----------------------------------------------------------------------
Ran 1 test in 0.004s

OK

Дискусия
Йоан Байчев
19.12.2024 18:25

Ето и логиката: - Шифтвайки с 5 надясно резултата от шифтването на търсеното число с 5 наляво, аз имам контрол над първите 3 бита(отляво надясно), които могат да са от множеството {0,1}, но не и за останалите 5 бита, които след шифтването надясно съм нулирал и загубил информация за тях. Сега мога да си ги взема и по отделно и наведнъж, аз го правя наведнъж с логичско "и" на "0b111", което ми казва реално, кой от първите 3 бита е 1. - След шифтване на търсеното число с 5 надясно имам последните 3 бита, които стават водещи(трябва да се съобрази накрая, че трябва да се върнат на реалната си позиция с 5 наляво) след изместването, които аналогично взимам наведнъж с логическо "и" на "0b111". Взимайки първите 3 и последните 3 бита наведнъж, аз ги пазя в 2 битови маски(две числа), вместо за всеки бит да правя отделно число(6 числа), което е по-оптимално откъм памет. - Третият и четвъртият бит ги взимам отново наведнъж в една обща маска, като ако след логическо "или" на търсеното число с 239 = 0b11101111 функцията върне число различно от 239, четвъртият бит го запазвам в маската като 1 << 0b1, за да оставя поне едно предходно свободно място за третия бит(защото третият бит е преди четвъртия отдясно наляво), а ако върне различно число от 239, то сетвам маската на 0. След това ако след логическо "и" на търсеното число с 8 = 0b00001000 функцията върне число различно от 0, то директно актуализирам маската за двата бити с логическо "или" отново с 0b1(практически запълвам умишлено оставеното от мен място с 1), а ако ли не маската остава непроменена. Чисто оптимизационно откъм памет пазя третия и четвъртия бит в едно число, като отново е важно да се съобрази, че битовете трябва да се преместят на съответната си позиция със шифтване наляво с 3. - Крайният резултат е комбинация от събраната информация за всеки бит, която моделирам с логическо "или".
История

f1from secret import cluef1from secret import clue
22
3def lucky():3def lucky():
44
5    bits_low = (clue(left_shift=5) >> 5) & 0b111  # bit2, bit1, bit05    bits_low = (clue(left_shift=5) >> 5) & 0b111  # bit2, bit1, bit0
6    bits_high = clue(right_shift=5) & 0b111  # bit7, bit6, bit56    bits_high = clue(right_shift=5) & 0b111  # bit7, bit6, bit5
n7    bit4 = 1 if clue(bw_or=239) != 239 else 0 # bit4n
8    bit3 = 1 if clue(bw_and=8) else 0 # bit3
97
tt8    bit_middle = (1 << 0b1) if clue(bw_or=239) != 239 else 0 # bit4
9    bit_middle = (bit_middle | 0b1) if clue(bw_and=8) else bit_middle # bit4, bit3
10 
10    result = (bits_high << 5) | (bit4 << 4) | (bit3 << 3) | bits_low11    result = (bits_high << 5) | (bit_middle << 3) | bits_low
1112
12    return result13    return result
Legends
Colors
 Added 
Changed
Deleted
Links
(f)irst change
(n)ext change
(t)op