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

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

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

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

Из­вест­но, что для узла 130.0.5.80 ко­ли­че­ство еди­ниц в дво­ич­ной за­пи­си ад­ре­са сети равно ко­ли­че­ству еди­ниц в дво­ич­ной за­пи­си но­ме­ра узла в пре­де­лах сети.

Какое наи­боль­шее число узлов, ад­ре­са ко­то­рых об­ла­да­ют тем же свой­ством (вклю­чая уже на­зван­ный), может быть в этой сети?

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

Ре­ше­ние.

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

from math import *

for i in range(32):

ip = (130 << 24) | (0 << 16) | (5 << 8) | (80 << 0)

mask = (2**i - 1) << (32 - i)

if f'{ip & mask:b}'.count('1') == f'{ip & (2**(32 - i) - 1):b}'.count('1'):

print(comb(32 - i, f'{ip & mask:b}'.count('1')))

Ответ: 120.

 

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

from itertools import product

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

k=0

for i in s:

if i.count('1')==3:

k+=1

print(k)

 

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

Ip-адрес в дво­ич­ном пред­став­ле­нии со­дер­жит шесть еди­ниц и вы­гля­дит так:

10000010000000000000010101010000

Разо­бьем его на две части по три еди­ни­цы в каж­дой так, чтобы пра­вая часть была мак­си­маль­но длин­ной:

1000001000000000000001_0101010000

Пра­вая часть имеет длину 10.

Число спо­со­бов рас­ста­вить три еди­ни­цы на 10 мест - это число со­че­та­ний из 10 по 3.

10*9*8/(1*2*3)=120.

 

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

import ipaddress,math

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

num = s.count('1')//2 # По­ло­ви­на ко­ли­че­ства еди­ниц в ip-ад­ре­се

for l in range(32):

if s[:l].count('1') == num: break # l - ми­ни­маль­ная длина стро­ки с по­ло­вин­ным ко­ли­че­ством еди­ниц

print(math.comb(32-l,num)) # Число спо­со­бов рас­ста­вить num еди­ниц в поле но­ме­ра узла