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 mortonfox
def checkio(data):
def summarize(octets):
for shift in range(8):
mask = (0xFF << shift) & 0xFF
if len(set([octet & mask for octet in octets])) == 1:
return 8 - shift, octets[0] & mask
return (0, 0)
data_octets = [list(map(int, datum.split('.'))) for datum in data]
parts = []
bits = 0
after_diff = False
for i in range(4):
if after_diff:
parts.append(0)
else:
octet_column = [datum[i] for datum in data_octets]
if len(set(octet_column)) == 1:
summ_bits = 8
summ_octet = octet_column[0]
else:
summ_bits, summ_octet = summarize(octet_column)
after_diff = True
parts.append(summ_octet)
bits += summ_bits
return '%s/%d' % ('.'.join(map(str, parts)), bits)
#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"
Dec. 21, 2016