Форум » Массивы, сортировка, работа с файлами » 26.5318_Про маски и ip » Ответить

26.5318_Про маски и ip

inkonstruktor@yandex: В задании у меня совпала первая часть ответа, а вторая нет: [pre2] ## uses school; function NetMask(ip:string):string; //255.255.224.0 //19 begin var b:=ip.Split('.'); var oct3:= bin(b[2].ToInteger); //3-й октет ip while oct3.Length<>8 do oct3:='0'+oct3; var tmp:=''; var s:=oct3[1:4]; // --> 111 if (s='000') then tmp:='00000000'; if (s='001') then tmp:='00100000'; if (s='010') then tmp:='01000000'; if (s='011') then tmp:='01100000'; if (s='100') then tmp:='10000000'; if (s='101') then tmp:='10100000'; if (s='110') then tmp:='11000000'; if (s='111') then tmp:='11100000'; Result:=dec(bin(b[0].ToInteger),2)+'.'+ dec(bin(b[1].ToInteger),2)+'.'+ dec(tmp,2)+'.'+'0'; end; var s:=ReadAllLines('26-88.txt'); var D:=new Dictionary<string,integer>; for var i:=1 to s.count-1 do begin var m:=NetMask(s[ i]); if d.ContainsKey(m) then d[m]:=d[m]+1 else d[m]:=1; end; d.OrderByDescending(x->x.Value).Take(10).Print(NewLine); [/pre2] У меня получилось: 28130320 26 22 vs 26 ?

Ответов - 5

Поляков: Как вы учитываете то, что один узел может отправить несколько запросов? В этом случае его нужно посчитать только 1 раз.

inkonstruktor@yandex: Спасибо за подсказку. Просто вывел уникальные значения и ответ совпал: 28.130.32.92 28.130.32.94 28.130.33.80 28.130.34.86 28.130.35.90 28.130.35.90 повтор 28.130.36.94 28.130.37.84 28.130.40.89 28.130.40.94 28.130.40.97 28.130.40.99 28.130.42.92 28.130.43.85 28.130.43.85 повтор 28.130.43.85 повтор 28.130.43.85 повтор 28.130.44.85 28.130.44.86 28.130.45.87 28.130.47.91 28.130.47.95 28.130.48.80 28.130.48.88 28.130.49.90 28.130.49.95

smekalin: Хм... А у меня программа, представленная ниже: [pre2] with open('26-88.txt', 'r') as f: addrs = [list(map(int, (f.readline().strip().split('.')))) for i in range(int(f.readline()))] addrs = sorted(addrs) addrs_subnets = [] addrs_subnets.append([addrs[0][0], addrs[0][1], (224 & addrs[0][2]), 0]) for n in range(1, len(addrs)): if addrs[n] != addrs[n - 1]: addrs_subnets.append([addrs[n][0], addrs[n][1], (224 & addrs[n][2]), 0]) ans = '' k = 0 mx = 0 for n in range(len(addrs_subnets)-1): if addrs_subnets[n] == addrs_subnets[n + 1]: k += 1 else: k += 1 if k > mx: mx = k ans = str(addrs_subnets[n][0]) + str(addrs_subnets[n][1]) + str(addrs_subnets[n][2]) + \ str(addrs_subnets[n][3]) + ' ' + str(mx) k = 0 print(ans) [/pre2] выдала такой ответ: 36138320 24 Сетей с таким количеством узлов несколько, программа выбрала наименьший. Проверяю. Адреса узлов, в найденной подсети 36.138.32.0: 36.138.32.87 36.138.32.93 36.138.32.97 36.138.35.83 36.138.35.95 36.138.36.80 36.138.37.80 36.138.37.99 36.138.37.99 повтор 36.138.38.85 36.138.39.94 36.138.40.85 36.138.41.93 36.138.42.83 36.138.42.87 36.138.42.87 повтор 36.138.42.97 36.138.44.85 36.138.44.88 36.138.44.93 36.138.44.95 36.138.46.87 36.138.46.98 36.138.48.83 36.138.48.87 36.138.48.98 Всего 26 адресов. Убираем повторяющиеся, получается 24 P.S. Проверил, на всякий случай, -- все найденные IP-адреса присутствуют в исходном файле.


ganilova: и у меня тоже ответ: 36138320 24 [pre2] f = open('26-88.txt') n = int(f.readline()) a = {} m = 224 s = set() # для отсечения повторяющихся узлов for i in range(n): p = f.readline() if p not in s: s.add(p) x1, x2, x3, x4 = p.split('.') x3 = str(m & int(x3)) x = x1 + x2 + x3 + '0' a[ x] = a.get(x, 0) + 1 k = 0 adres = '99999999' for i in a: if a[ i] > k: k = a[ i] adres = i elif a[ i] == k and i < adres: adres = i print(adres, k) [/pre2]

Поляков: smekalin пишет: выдала такой ответ: 36138320 24 Сетей с таким количеством узлов несколько, программа выбрала наименьший. Согласно условию, сравнение идет по количеству ЗАПРОСОВ. Следующие сети выдали по 26 запросов: 40.133.32.0 26 36.138.32.0 26 28.130.32.0 26 Минимальный из этих адресов - последний. В этой сети запросы приходили от 22 разных узлов, там есть 4 дубля. Ответ верный.



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