Повторное объяснение для чайников вроде меня:
Простой способ «кодировать» два двоичных взаимоисключающих числа (w & b == 0
) в троичной форме будет:
white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \
int(format(w, 'b').replace('1','2'), base=3)
Вот все возможные 2-битные варианты:
white_black_empty(0b00, 0b00) == 0
white_black_empty(0b00, 0b01) == 1
white_black_empty(0b01, 0b00) == 2
white_black_empty(0b00, 0b10) == 3
white_black_empty(0b00, 0b11) == 4
white_black_empty(0b01, 0b10) == 5
white_black_empty(0b10, 0b00) == 6
white_black_empty(0b10, 0b01) == 7
white_black_empty(0b11, 0b00) == 8
Наблюдая, что int(format(w, 'b').replace('1','2'), base=3)
на самом деле равно двойному int(format(w, 'b'), base=3)
(например, 2022002 3 == 1011001 3 * 2), мы получаем решение, которое @ Марк Дикинсон разместил в комментариях выше:
white_black_empty = lambda w, b: int(format(b, 'b'), base=3) + \
int(format(w, 'b'), base=3)*2