# -*- coding: utf-8 -*-
"""
Задание 5.2a

Всё, как в задании 5.2, но, если пользователь ввел адрес хоста, а не адрес сети,
надо преобразовать адрес хоста в адрес сети и вывести адрес сети и маску,
как в задании 5.2.

Пример адреса сети (все биты хостовой части равны нулю):
* 10.0.1.0/24
* 190.1.0.0/16

Пример адреса хоста:
* 10.0.1.1/24 - хост из сети 10.0.1.0/24
* 10.0.5.195/28 - хост из сети 10.0.5.192/28

Если пользователь ввел адрес 10.0.1.1/24, вывод должен быть таким:

Network:
10        0         1         0
00001010  00000000  00000001  00000000

Mask:
/24
255       255       255       0
11111111  11111111  11111111  00000000


Проверить работу скрипта на разных комбинациях хост/маска, например:
    10.0.5.195/28, 10.0.1.1/24

Вывод сети и маски должен быть упорядочен также, как в примере:
- столбцами
- ширина столбца 10 символов (в двоичном формате
  надо добавить два пробела между столбцами
  для разделения октетов между собой)


Подсказка:
Есть адрес хоста в двоичном формате и маска сети 28. Адрес сети это первые 28 бит
адреса хоста + 4 ноля.
То есть, например, адрес хоста 10.1.1.195/28 в двоичном формате будет
bin_ip = "00001010000000010000000111000011"

А адрес сети будет первых 28 символов из bin_ip + 0000 (4 потому что всего
в адресе может быть 32 бита, а 32 - 28 = 4)
00001010000000010000000111000000

Ограничение: Все задания надо выполнять используя только пройденные темы.

"""

input_str = input('Введите IP-адрес сети и маску в формате 10.1.1.0/24: ')
ip_addr, mask_inp = input_str.split('/')
oct1, oct2, oct3, oct4 = ip_addr.split('.')
mask_inp = int(mask_inp)
bin_ip_addr = '{:08b}{:08b}{:08b}{:08b}'.format(int(oct1),int(oct2),int(oct3),int(oct4))
bin_netw_addr = bin_ip_addr[0:mask_inp]+'0'*(32-mask_inp)

out_template = '''
{0:<10}{1:<10}{2:<10}{3:<10}
{0:08b}  {1:08b}  {2:08b}  {3:08b}
'''
print ('\nNetwork: ' + out_template.format(int(bin_netw_addr[0:8],2), int(bin_netw_addr[8:16],2), int(bin_netw_addr[16:24],2), int(bin_netw_addr[24:32],2)))

mask = '1'*mask_inp +'0'*(32-mask_inp)
print ('\nMask: ' + '\n/' + str(mask_inp) + out_template.format(int(mask[0:8],2),int(mask[8:16],2),int(mask[16:24],2),int(mask[24:32],2)))