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

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

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

Из­вест­но, что в со­ста­ве сети, ко­то­рой при­над­ле­жит IP-⁠адрес 147.222.199.75, есть узел, в IP-⁠ад­ре­се ко­то­ро­го пер­вый байт сов­па­да­ет с четвёртым, а вто­рой  — с тре­тьим.

Ука­жи­те наи­мень­шее воз­мож­ное ко­ли­че­ство при­над­ле­жа­щих этой сети IP-⁠ад­ре­сов, в дво­ич­ной за­пи­си ко­то­рых ровно 14 еди­ниц.

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

Ре­ше­ние.

За­пи­шем вто­рой узел, в IP-⁠⁠ад­ре­се ко­то­ро­го пер­вый байт сов­па­да­ет с четвёртым, а вто­рой  — с тре­тьим: 147.222.222.147.

Вы­пи­шем дво­ич­ное пред­став­ле­ние IP-⁠ад­ре­сов:

147.222.199.75: 10010011.11011110.11000111.01001011,

147.222.222.147: 10010011.11011110.11011110.10010011.

За­ме­тим, что IP-⁠ад­ре­са раз­ли­ча­ют­ся в тре­тьем байте слева. От­ли­чие в 4 бите слева. Со­от­вет­ствен­но маска будет вы­гля­деть так:

255.255.224.0: 11111111.11111111.11100000.00000000.

В части IP-⁠ад­ре­сов, со­от­вет­ству­ю­щих 1 в маске со­дер­жит­ся 12 еди­ниц. По усло­вию за­да­чи, в дво­ич­ной за­пи­си IP-⁠ад­ре­сов долж­но быть ровно 14 еди­ниц. Сле­до­ва­тель­но, на остав­ши­е­ся 13 бит ад­ре­са (биты, со­от­вет­ству­ю­щие 0 в маске) долж­но при­хо­дить­ся 2 еди­ни­цы. Ко­ли­че­ство спо­со­бов рас­ста­вить 2 еди­ни­цы по 13 ме­стам равно:

 дробь: чис­ли­тель: 13 умно­жить на 12, зна­ме­на­тель: 2 конец дроби = 78.

Наи­мень­шее воз­мож­ное ко­ли­че­ство при­над­ле­жа­щих этой сети IP-⁠⁠ад­ре­сов, в дво­ич­ной за­пи­си ко­то­рых ровно 14 еди­ниц, равно 78.

 

Ответ: 78.

 

При­ме­ча­ние.

В маске после нуля идут толь­ко одни нули.

 

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

from ipaddress import *

ipu = '147.222.199.75'

ipu_m = ipu[0:8] + ipu[4:8] + ipu[0:3]

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

try:

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

c = 0

if ip_address(f'{ipu_m}') in net:

for ip in net:

ipb = f'{ip:b}'

if ipb.count('1') == 14:

c+=1

if c > 0:

print(c)

break

 

except:

break

 

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

from ipaddress import ip_network, ip_address

ipu = '147.222.199.75'

ipu_modified = '147.222.222.147'

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

network = ip_network(f'{ipu}/{mask}', 0)

count = 0

if ip_address(ipu_modified) in network:

for ip in network:

if bin(int(ip)).count('1') == 14:

count += 1

if count > 0:

print(count)

break

 

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

from itertools import product

s=product('01',repeat = 13)

k=0

for i in s:

if (12+i.count('1'))==14:

k+=1

print(k)

 

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

import ipaddress,math

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

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

for l in range(32):

if s1[l] != s2[l]: break # l - мак­си­маль­ная длина ад­ре­са сети (до пер­во­го не­сов­па­да­ю­ще­го бита)

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

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

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


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