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.
- Крайният резултат е комбинация от събраната информация за всеки бит, която моделирам с логическо "или".
|
f | 1 | from secret import clue | f | 1 | from secret import clue |
2 | 2 | ||||
3 | def lucky(): | 3 | def lucky(): | ||
4 | 4 | ||||
5 | bits_low = (clue(left_shift=5) >> 5) & 0b111 # bit2, bit1, bit0 | 5 | bits_low = (clue(left_shift=5) >> 5) & 0b111 # bit2, bit1, bit0 | ||
6 | bits_high = clue(right_shift=5) & 0b111 # bit7, bit6, bit5 | 6 | bits_high = clue(right_shift=5) & 0b111 # bit7, bit6, bit5 | ||
n | 7 | bit4 = 1 if clue(bw_or=239) != 239 else 0 # bit4 | n | ||
8 | bit3 = 1 if clue(bw_and=8) else 0 # bit3 | ||||
9 | 7 | ||||
t | t | 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 | |||||
10 | result = (bits_high << 5) | (bit4 << 4) | (bit3 << 3) | bits_low | 11 | result = (bits_high << 5) | (bit_middle << 3) | bits_low | ||
11 | 12 | ||||
12 | return result | 13 | return result |
Legends | ||||||||||
---|---|---|---|---|---|---|---|---|---|---|
|
|