Форум » Массивы, сортировка, работа с файлами » № 5318 - не сходится ответ » Ответить

№ 5318 - не сходится ответ

Alex_R: [pre2]def get_adress(ip, msk): if len(ip) == len(msk) == 4: return tuple(ip[ i] & msk[ i] for i in range(4)) else: return 0, 0, 0, 0 with open('26-88.txt') as f: data = [tuple(int(x) for x in ip.split('.')) for ip in f.readlines()[1:]] mask = (255, 255, 224, 0) adress_dic = {} for d in data: adress = get_adress(d, mask) if adress in adress_dic.keys(): adress_dic[adress].append(d) else: adress_dic[adress] = [d] max_adress = {} max_adress_counter = 0 for k in adress_dic.keys(): count = len(adress_dic[k]) if count > max_adress_counter: max_adress_counter = count max_adress = {k: adress_dic[k]} elif count == max_adress_counter: max_adress[k] = adress_dic[k] print(''.join(tuple(str(x) for x in min(max_adress.keys()))), max_adress_counter)[/pre2] В результате работы данного алгоритма получаю: 28130320 26 А в ответах: 28130320 22

Ответов - 8

Поляков: Это задача 26-88 из основного сборника. На этой странице есть файл с решениями всех 26-х задач.

Alex_R: Забыл в итоговом подсчете удалить дубликаты при помощи set. Ответ сошелся - 22. Благодарю.

Alex_R: На случай если кому-то будет интересно мое решение: [pre2]# Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и его маске def get_adress(ip, msk): if len(ip) == len(msk) == 4: return tuple(ip & msk for i in range(4)) else: return 0, 0, 0, 0 with open('26-88.txt') as f: # Список ip-адресов data = [tuple(int(x) for x in ip.split('.')) for ip in f.readlines()[1:]] # Маска сети mask = (255, 255, 224, 0) # Словарь адресов сети adress_dic = {} # Распределение ip-адресов по адресам сети for d in data: adress = get_adress(d, mask) if adress in adress_dic.keys(): adress_dic[adress].append(d) else: adress_dic[adress] = [d] # Адреса сети, из которой отправлено максимальное количество запросов adress_max_call = {} # Максимальное количество запросов max_call_count = 0 # Наполнение max_adress for k in adress_dic.keys(): count = len(adress_dic[k]) # количество запросов по адресу сети # Если больше, то обновить максимум if count > max_call_count: max_call_count = count adress_max_call = {k: adress_dic[k]} # Если равно, то добавить к имеющимся elif count == max_call_count: adress_max_call[k] = adress_dic[k] # Минимальный адрес сети среди адресов сети, из которой отправлено максимальное количество запросов min_adress = min(adress_max_call.keys()) # Вывод минимального адреса сети и количества различных ip-адресов print(''.join(tuple(str(x) for x in min_adress)), len(set(adress_max_call[min_adress])))[/pre2]


Mathew131: f = open('26.txt') n = int(f.readline()) d = {} mask = [255, 255, 224, 0] imask = [0, 0, 63, 255] s = set() for i in range(n): ip = list(map(int, f.readline().split('.'))) aset = [] ausla = [] for j in range(4): aset.append(mask[j] & ip[j]) ausla.append(imask[j] & ip[j]) aset = tuple(aset) if aset == (28, 130, 32, 0): s.add(tuple(ausla)) d[aset] = d.get(aset, 0) + 1 print(max(d, key = d.get), len(s))

Mathew131: Адрес сети получается в результате применения поразрядной конъюнкции к айпи адресу и маске или к адресу узла и маске? Как найти адрес узла?

Mathew131: Почему табуляция не сохраняется?

Ж: Почему табуляция не сохраняется? см. выше в желтой рамке: Программы "заворачивайте" в тэг [ pre2]...[ /pre2], при этом сохраняются все отступы и применяется моноширинный шрифт. Если у вас используется сочетание "[ i]" для обозначения элемента массива или строки, ставьте пробел после открывающей скобки. Иначе система выделит все дальнейшее курсивом.

Ж: вариант кода: [pre2] #перевод адреса в двоичный код def binip(s): return ''.join([ bin(int(ip))[2::].zfill(8) for ip in s.strip().split('.')]) #перевод 32-битнгого двоичного адреса в десятичный код из 4 чисел def intip(s): return '.'.join([str(int(s[:8],2)),str(int(s[8:16],2)),str(int(s[16:24],2)),str(int(s[24:],2))]) #определение количества 1 в маске mask=binip('255.255.224.0').count('1') #инициализация словаря для поступающих запросов zapros={} f=open('d:/26-88.txt'); n=f.readline() # создание списка данных, хранящего отдельно для каждого запроса: адрес сети и адрес узла data=[(binip(c)[:mask]+'0'*(32-mask),binip(c)[mask-32::]) for c in f.readlines()] for c in data: # забавление новых запросов в списко zapros[c[0]]=zapros[c[0]]+[c[1]] if c[0] in zapros else [c[1]] # обрабока данных: подсчет для каждой сети: общего числа узлов, числа уникальных узлов, перевод адреса сети из двоичного кода в десятичный zapros=[ ( len(zapros[c]), len(set(zapros[c]) ), intip(c) ) for c in zapros] # ответ print(*min( [ c for c in zapros if c[0]==max(zapros)[0]] )[::-1][:2]) [/pre2]



полная версия страницы