Задания
Версия для печати и копирования в MS Word
Тип 13 № 73839
i

В тер­ми­но­ло­гии сетей TCP/IP мас­кой сети на­зы­ва­ет­ся дво­ич­ное число, опре­де­ля­ю­щее, какая часть IP-ад­ре­са узла сети от­но­сит­ся к ад­ре­су сети, а какая  — к ад­ре­су са­мо­го узла в этой сети. При этом в маске сна­ча­ла (в стар­ших раз­ря­дах) стоят еди­ни­цы, а затем с не­ко­то­ро­го места  — нули.

Адрес сети по­лу­ча­ет­ся в ре­зуль­та­те при­ме­не­ния по­раз­ряд­ной конъ­юнк­ции к за­дан­но­му IP-ад­ре­су узла и маске.

На­при­мер, если IP⁠-⁠адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.

Узлы с IP⁠-⁠ад­ре­са­ми 157.220.185.237 и 157.220.184.230 при­над­ле­жат одной сети. Какое наи­мень­шее ко­ли­че­ство IP⁠-⁠ад­ре­сов, в дво­ич­ной за­пи­си ко­то­рых ровно 15 еди­ниц, может со­дер­жать­ся в этой сети?

Спрятать решение

Ре­ше­ние.

При­ведём ре­ше­ние на языке Python.

from ipaddress import *

ip1 = ip_address('157.220.185.237')

ip2 = ip_address('157.220.184.230')

otv = []

for mask in range(15,33):

net = ip_network(f'157.220.185.237/{mask}', 0)

if (ip1 in net) and (ip2 in net):

count = 0

for ip in net:

if f'{ip:b}'.count('1') == 15:

count += 1

otv.append(count)

print(min(otv))

 

Ответ: 9.

 

При­ведём ре­ше­ние Да­ни­ла Шар­ло­ва на языке Python.

from ipaddress import ip_network, ip_address

ip_b = ip_address('157.220.184.230')

for mask in range(32, -1, -1):

net = ip_network(f'157.220.185.237/{mask}',0)

if ip_b in net:

print(sum(bin(int(ip)).count('1')==15 for ip in net))

break

 

 

При­ведём ана­ли­ти­че­ское ре­ше­ние Юрия Кра­силь­ни­ко­ва.

Ip-ад­ре­са из усло­вия вы­гля­дят так:

10011101110111001011100111101101

10011101110111001011100011100110

11111111111111111111111000000000

Под ад­ре­са­ми - маска с мак­си­маль­но воз­мож­ной дли­ной ад­ре­са сети (до пер­во­го раз­ли­ча­ю­ще­го­ся бита). Длина но­ме­ра узла (ко­ли­че­ство нулей) в этой маске равно 9.

Число еди­ниц в поле ад­ре­са сети - 14. Сле­до­ва­тель­но, поле но­ме­ра узла долж­но со­дер­жать одну еди­ни­цу. Число спо­со­бов по­ста­вить еди­ни­цу на одно из 9 мест - 9.

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

import ipaddress,math

s1 = bin(int(ipaddress.ip_address('157.220.185.237')))[2:].zfill(32) # Дво­ич­ное пред­став­ле­ние ад­ре­са сети 1

s2 = bin(int(ipaddress.ip_address('157.220.184.230')))[2:].zfill(32) # Дво­ич­ное пред­став­ле­ние ад­ре­са сети 2

for l in range(32):

if s1[l] != s2[l]: break # l - мак­си­маль­ная длина ад­ре­са сети

num = 32-l # длина но­ме­ра узла

k = 15-s1[:l].count('1') # ко­ли­че­ство еди­ниц в но­ме­ре узла

print(math.comb(num,k)) # число со­че­та­ний


Аналоги к заданию № 73839: 73868 Все