Last active
July 31, 2020 15:23
-
-
Save quassy/9e29a685f910572787d507819fe96f41 to your computer and use it in GitHub Desktop.
Various iterations inclunding benchmarks for getting the binary gap
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python3 | |
from time import time | |
def timeit(func): | |
"""Decorator to time execution of a function and print it out.""" | |
def timed(*args, **kw): | |
start = time() | |
result = func(*args, **kw) | |
end = time() | |
duration = end - start | |
print(f"{func.__name__}() took {duration} seconds") | |
return result | |
return timed | |
def get_binary_gap0(N): | |
# write your code in Python 3.6 | |
binary_integer_string = "{0:b}".format(N) | |
binary_gap = 0 | |
max_binary_gap = 0 | |
for char in binary_integer_string: | |
if char == "0": | |
binary_gap += 1 | |
else: | |
if binary_gap > max_binary_gap: | |
max_binary_gap = binary_gap | |
binary_gap = 0 | |
return max_binary_gap | |
def get_binary_gap1(n: int) -> int: | |
binary_integer_string: str = "{0:b}".format(n) | |
binary_gap: int = 0 | |
max_binary_gap: int = 0 | |
length: int = len(binary_integer_string) | |
# skip first char as it's always a 1 | |
for pos, char in enumerate(binary_integer_string[1:]): | |
if char == "0": | |
binary_gap += 1 | |
else: | |
if binary_gap > max_binary_gap: | |
max_binary_gap = binary_gap | |
# stop early if remaining length is not enough for new max | |
if binary_gap >= (length-pos-2): | |
return max_binary_gap | |
binary_gap = 0 | |
return max_binary_gap | |
def get_binary_gap2(n: int) -> int: | |
# convert to binary, remove trailing 0, remove leading & trailing 1 (always there), split by 1 | |
# 1612 -> 110010001100 -> 10010001 | |
return len(max("{0:b}".format(n).rstrip("0")[1:-1].split("1"))) | |
def get_binary_gap3(n: int) -> int: | |
# convert to binary, remove trailing 0, remove leading & trailing 1s (always there), split by 1 | |
# 1612 -> 110010001100 -> 001000 -> [00, 000] | |
return len(max("{0:b}".format(n).rstrip("0").strip("1").split("1"))) | |
def get_binary_gap4(n: int) -> int: | |
# convert to binary, remove trailing 0, remove leading & trailing 1s (always there), split by 1 | |
# 1612 -> 110010001100 -> 001000 -> [00, 000] | |
return len(max(bin(n).rstrip("0").strip("1").split("1"))) | |
@timeit | |
def main0(): | |
for i in range(1, 21474836): # 48 | |
get_binary_gap0(i) | |
@timeit | |
def main1(): | |
for i in range(1, 21474836): # 48 | |
get_binary_gap1(i) | |
@timeit | |
def main2(): | |
for i in range(1, 21474836): # 48 | |
get_binary_gap2(i) | |
@timeit | |
def main3(): | |
for i in range(1, 21474836): # 48 | |
get_binary_gap3(i) | |
@timeit | |
def main4(): | |
for i in range(1, 21474836): # 48 | |
get_binary_gap4(i) | |
if __name__ == '__main__': | |
main0() | |
main1() # enumerate is bad, hmkay | |
main2() | |
main3() | |
main4() | |
tests = { | |
0: 0, | |
1: 0, | |
32: 0, | |
1041: 5, | |
2146483647: 4, | |
0b10: 0, | |
0b101: 1, | |
0b10100: 1, | |
0b101001: 2, | |
0b100101: 2, | |
} | |
for num, gap in tests.items(): | |
assert gap == get_binary_gap2(num) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment