from typing import Iterable def digit_to_char(digit): if digit < 10: return str(digit) return chr(ord('A') + digit - 10) def str_base(number, base): if number < 0: return '-' + str_base(-number, base) (d, m) = divmod(number, base) if d > 0: return str_base(d, base) + digit_to_char(m) return digit_to_char(m) def unicode_ascii_repr(ascii: int) -> str: if 0 <= ascii < 32: return chr(ascii + 0x2400) elif 32 <= ascii < 127: return chr(ascii) elif ascii == 127: return chr(33 + 0x2400) # Rip 🂢 return "‧" def int_distance(lhs: int, rhs: int) -> int: if lhs == rhs: return 0 distance = 0 while lhs > 0 and rhs > 0: if lhs & 1 != rhs & 1: distance += 1 lhs >>= 1 rhs >>= 1 return distance def int_distance_sort_key(item: int, all_items: Iterable[int]) -> int: return sum( map( lambda i: int_distance(i, item), all_items ) )