Skip to content

Instantly share code, notes, and snippets.

@quassy
Last active July 31, 2020 15:23
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save quassy/9e29a685f910572787d507819fe96f41 to your computer and use it in GitHub Desktop.
Save quassy/9e29a685f910572787d507819fe96f41 to your computer and use it in GitHub Desktop.
Various iterations inclunding benchmarks for getting the binary gap
#!/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