Advertisement
ForestFox

OBC (new)

Feb 15th, 2022 (edited)
619
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.54 KB | None | 0 0
  1. def check(mas):
  2.     mas = [str(mas[i]) for i in range(len(mas))]
  3.     if len(mas) == 4:
  4.         decimal, binary = 0, 0
  5.  
  6.         for i in range(len(mas)):
  7.             if not mas[i].isdigit():
  8.                 raise ValueError(f"В блоке {i + 1} введено не число")
  9.             if (mas[i].count("1") + mas[i].count("0")) == 8:
  10.                 binary += 1
  11.             elif 0 <= int(mas[i]) <= 255:
  12.                 decimal += 1
  13.                 mas[i] = int(mas[i])
  14.             else:
  15.                 raise ValueError(f"Число введенное в блоке {i + 1} неверное")
  16.  
  17.         if not (decimal == 4 or binary == 4):
  18.             raise ValueError(f"Числа в блоках в разных системах счисления")
  19.     else:
  20.         raise ValueError("Неправильный ввод - IP состоит из 4 блоков")
  21.     return True
  22.  
  23.  
  24. def is_binary(mas):
  25.     return len(str(mas[0])) == 8
  26.  
  27.  
  28. def transform(mas):
  29.     new = []
  30.     if check(mas):
  31.         if is_binary(mas):
  32.             for i in mas:
  33.                 if len(i) == 8:
  34.                     new += [int(i, 2)]
  35.         else:
  36.             for i in mas:
  37.                 j = bin(i)[2:]
  38.                 new += [(8 - len(j)) * "0" + j]
  39.  
  40.     return new
  41.  
  42.  
  43. def what_ip_class(mas):
  44.     if is_binary(mas):
  45.         mas = transform(mas)
  46.  
  47.     if mas[0] < 128:
  48.         return 'A'
  49.     elif mas[0] < 192:
  50.         return 'B'
  51.     elif mas[0] < 224:
  52.         return 'C'
  53.     elif mas[0] < 240:
  54.         return 'D'
  55.     elif mas[0] < 256:
  56.         return 'E'
  57.  
  58.  
  59. def step(k):
  60.     n = k
  61.     dv = 0
  62.     while n > 0:
  63.         n //= 2
  64.         dv += 1
  65.     return dv
  66.  
  67.  
  68. def mask(mas, pod_set = 0):
  69.     step_pod_set = step(pod_set)
  70.     cl = what_ip_class(mas)
  71.     new = ['0' * 8 for i in range(4)]
  72.     octet = ord(cl) - ord('A') + 1
  73.     for i in range(octet):
  74.         new[i] = '1' * 8
  75.     for i in range(octet, 4):
  76.         if step_pod_set == 0:
  77.             break
  78.         new[i] = step_pod_set * '1' + (8 - step_pod_set) * '0'
  79.         step_pod_set //= 8
  80.     return transform(new)
  81.  
  82.  
  83. def start_and_end(mas):
  84.     cl = what_ip_class(mas)
  85.     start = [0 for i in range(4)]
  86.     end = [255 for i in range(4)]
  87.     octet = ord(cl) - ord('A') + 1
  88.     for i in range(octet):
  89.         start[i] = mas[i]
  90.         end[i] = mas[i]
  91.     return start, end
  92.  
  93.  
  94. def adreses5(mas):
  95.     start, end = start_and_end(mas)
  96.     first_5 = [start[:3] + [start[-1] + i] for i in range(1, 6)]
  97.     last_of_us = [end[:3] + [end[-1] - i] for i in range(1, 6)]
  98.     return first_5, last_of_us
  99.  
  100.  
  101. def number_ip(mas, pod_set):
  102.     cl = what_ip_class(mas)
  103.     octet = ord(cl) - ord('A') + 1
  104.     return 2 ** (8 * (4 - octet)), 2 ** (8 * (4 - octet)) - pod_set * 2
  105.  
  106.  
  107. def norm_int(mas):
  108.     new = []
  109.     for i in mas:
  110.         new += [int(i)]
  111.     return new
  112.  
  113.  
  114. def inp():
  115.     print('Введите адрес сети')
  116.     ad = list(map(str, input().split(".")))
  117.     print('''Введите номер задания 4, 5 или 6''')
  118.     number = int(input())
  119.     pod_set, hosts = 0, 0
  120.     if number == 6:
  121.         print('Введите количество подсетей и хостов через пробел')
  122.         pod_set, hosts = map(int, input().split())
  123.         return ad, number, pod_set, hosts
  124.     if number not in (4, 5, 6):
  125.         raise ValueError('Введен неправильный номер задания')
  126.     return ad, number, pod_set, hosts
  127.  
  128.  
  129. def possibly(ad, c_p, c_h):
  130.     cl = what_ip_class(ad)
  131.     octet = 3 - ord(cl) + ord('A')
  132.     return step(c_h) + step(c_p) <= octet * 8
  133.  
  134.  
  135. def main(ad, number, pod_set, hosts):
  136.     if check(ad):
  137.         if number == 4:
  138.             return transform(ad)
  139.         elif number == 5 or number == 6:
  140.             if is_binary(ad):
  141.                 ad = transform(ad)
  142.             ad = norm_int(ad)
  143.             if what_ip_class(ad) in 'DE':
  144.                 return f'''Class: {what_ip_class(ad)}'''
  145.             if number == 5:
  146.                 return f'''Class: {what_ip_class(ad)}\nStart: {start_and_end(ad)[0]}\nEnd: {start_and_end(ad)[1]}\nMask: {mask(ad)}'''
  147.             elif number == 6:
  148.                 if possibly(ad, pod_set, hosts):
  149.                     return f'''Mask: {mask(ad, pod_set)}\nClass: {what_ip_class(ad)}\nStart: {start_and_end(ad)[0]}\nEnd: {start_and_end(ad)[1]}\nNumber IP: {number_ip(ad, pod_set)[0]}\nNumber IP for hosts: {number_ip(ad, pod_set)[1]}\nFirst 5: {adreses5(ad)[0]}\nLast of us: {adreses5(ad)[1]}'''
  150.  
  151.  
  152. ad, number, pod_set, hosts = inp()
  153. print(main(ad, number, pod_set, hosts))
  154.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement