Enable Javascript in your browser and then refresh this page, for a much enhanced experience.
First solution in Clear category for IP Network: Route Summarization by Nakkiy
def checkio(data):
SubNetMask = get_SubNetMask(data)
return "/".join([get_subnet_ip(data[0], SubNetMask),str(SubNetMask)])
def get_SubNetMask(a_data):
SubNetMask = 32
if len(a_data) <= 1:
return SubNetMask
current_ip = a_data.pop(0)
for check_ip in a_data:
SubNetMask = min(comp_ip(current_ip, check_ip), SubNetMask)
return min(get_SubNetMask(a_data), SubNetMask)
def get_ip_binary(ip_address):
ip_binary_list = []
splited_ip = ip_address.split(".")
for current in splited_ip:
ip_binary_list.append("{0:0>8b}".format(int(current)))
return "".join(ip_binary_list)
def comp_ip(a_ip_1, a_ip_2):
ip_1_binary = get_ip_binary(a_ip_1)
ip_2_binary = get_ip_binary(a_ip_2)
same_count = 0
for (char_1, char_2) in zip(ip_1_binary, ip_2_binary):
if char_1 != char_2:
return same_count
same_count += 1
return 32
def get_subnet_ip(a_ip_address, a_SubNetMask):
ip_binary = get_ip_binary(a_ip_address)
subnet_ip = ip_binary[:a_SubNetMask]
subnet_ip = "{0:0<32}".format(subnet_ip)
subnet_ip_list = []
for i in range(4):
subnet_ip_list.append(str(int(subnet_ip[(i*8):((i*8)+8)],2)))
return ".".join(subnet_ip_list)
#These "asserts" using only for self-checking and not necessary for auto-testing
if __name__ == '__main__':
assert (checkio(["172.16.12.0", "172.16.13.0", "172.16.14.0", "172.16.15.0"]) == "172.16.12.0/22"), "First Test"
assert (checkio(["172.16.12.0", "172.16.13.0", "172.155.43.9"]) == "172.0.0.0/8"), "Second Test"
assert (checkio(["172.16.12.0", "172.16.13.0", "172.155.43.9", "146.11.2.2"]) == "128.0.0.0/2"), "Third Test"
March 19, 2016