- 21, Oct 2024
- #1
Задача
Задача состоит в том, чтобы написать программу, которая превращает список адресов IPv6 в кратчайший список масок CIDR, чтобы сопоставлялось все, кроме этих IP-адресов.
CIDR-маски
Маска CIDR соответствует IP-адресам по префиксу.
dead::beef:1.2.3.4
matches all IPs whose first 19 bits are zero, i.e. ::
. Сходным образом, >>> 0000:0000:0000:0000:0000:0000:0000:0000
[128 masks]
>>> 0000:0000:0000:0000:0000:0000:0000:0000 0000:0000:0000:0000:0000:0000:0000:0001
[127 masks]
>>> ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff 0000:0000:0000:0000:0000:0000:0000:0000
[254 masks]
>>> 0000:0000:0000:0000:0000:0000:0000:ffff 0000:0000:0000:0000:0000:0000:0000:0000
[142 masks]
>>> 0123:4567:89ab:cdef:fedc:ba98:7654:3210 0246:8ace:1357:9bdf:0246:8ace:1357:9bdf
[248 masks]
>>> 0000:0000:0000:0000:0000:0000:0000:0000 0000:0000:0001:0000:0000:0000:0000:0000 0000:0000:0002:0000:0000:0000:0000:0000 0000:0000:0003:0000:0000:0000:0000:0000 0000:0000:0004:0000:0000:0000:0000:0000 < snip > 0000:0000:00ff:0000:0000:0000:0000:0000
(256 IPs)
[20520 masks]
>>> 0000:0000:0000:0000:0000:0000:0000:0000 0000:0000:0000:0000:0000:0000:0000:0001 0000:0000:0000:0000:0000:0000:0000:0002 0000:0000:0000:0000:0000:0000:0000:0003 0000:0000:0000:0000:0000:0000:0000:0004 < snip > 0000:0000:0000:0000:0000:0000:0000:0fff
(4096 IPs)
[116 masks]
matches all IPs that start with 243:f6a8:885a:308d:3131:98a2::/112
битовая последовательность, т.е. 0243:F6A8:885A:308D:3131:98A2:0000:0000/112
.А
/
always matches only one IP. A a-f
соответствует всем IP.
Вход
Ввод представляет собой список IP-адресов в полной форме: восемь 4-значных шестнадцатеричных групп, разделенных \0
in network order (most significant first). For example, 0000:0000:0000:0000:0000:0000:0000:0000
.
Вы можете выбрать любой символ-разделитель для списка ввода, будь то новая строка, пробел, запятая, :
, etc. You can also rely on /0
находясь в конкретном случае.
Выход
Выходные данные — это кратчайший список масок CIDR, охватывающий все IP-адреса, кроме тех, которые указаны во входных данных.
Опять же, вы можете выбрать любой символ-разделитель.
CIDR следует форматировать как любое представление IP-адреса, за которым следует /128
and amount of bits in the prefix (in decimal). For example, 55aa:*:*:*:*:*:*:*
.
Вам вообще не требуется сокращать IP-адрес, как в приведенном выше примере. Однако 0101010110101010
is not invalid.
Порядок масок не имеет значения. Если существует несколько представлений, использующих одинаковое количество масок, подойдет любое из них.
Примеры
Я не публикую полные выводы, так как придумать алгоритм — часть задачи :)
Вместо этого я указываю, сколько масок потребуется, по моим собственным расчетам. Если вы обнаружите ошибку или более короткий список масок, сообщите об этом.
55aa::/16
Подсчет очков
Количество символов в коде, символы UTF-8 при необходимости считаются за один.
Бонусные баллы
- -16 Рассмотрим случай пустого списка ввода.
- -32 Вывод сокращенных IP-адресов: удалить ведущие нули, заменить последовательные группы нулей на
0:0000-1fff:*:*:*:*:*:*
, etc. See эта статья в Википедии.- -32 Не используйте форму v4-in-v6 (
::/19
).
- -32 Не используйте форму v4-in-v6 (
- -64 Разрешить ввод сокращенных IP-адресов.
#код-вызов