В ознаменование годовщины Всемирного дня IPv6 , Internet Society опубликовало кампанию « Выключить IPv4 6 июня 2014 года на один день» .
Адреса IPv6 могут быть представлены в их длинной форме в виде восьми 16-битных шестнадцатеричных значений, разделенных двоеточиями. В зависимости от адреса, они также могут быть сокращены, как описано в пункте 2 раздела 2.2. Текстовое представление адресов RFC 3513 :
Чтобы упростить запись адресов, содержащих нулевые биты, имеется специальный синтаксис для сжатия нулей. Использование «::» указывает одну или несколько групп из 16 битов нулей. «::» может появляться только один раз в адресе. «::» также можно использовать для сжатия начальных или конечных нулей в адресе.
Записи на этот вызов будет программы , которые принимают ровно один IPv6 - адрес , отформатированный в длинной или укороченной формате, и будет отображать один и тот же адрес в обоих длинных и коротких форматов, в таком порядке.
Входные данные могут поступать из аргументов командной строки, STDIN или любого другого входного источника, который соответствует вашему выбору языка.
Библиотеки или утилиты, специально предназначенные для анализа адресов IPv6, запрещены (например, inet_ {ntop, pton} () ).
Если входной адрес недействителен, вывод будет пустым (или выдается какое-то подходящее сообщение об ошибке, указывающее, что адрес недействителен )
В тех случаях, когда
::
происходит сокращение, для данного адреса может выполняться только одна операция сокращения. Если для данного адреса существует более одной потенциальной операции сокращения, должна использоваться операция, которая дает общий кратчайший адрес. Если в этом отношении есть связь, будет использоваться первая операция. Это показано на примерах ниже.
Примеры:
Input Output
1080:0:0:0:8:800:200C:417A 1080:0:0:0:8:800:200C:417A
1080::8:800:200C:417A
FF01::101 FF01:0:0:0:0:0:0:101
FF01::101
0:0:0:0:0:0:0:1 0:0:0:0:0:0:0:1
::1
:: 0:0:0:0:0:0:0:0
::
1:0:0:2:0:0:0:3 1:0:0:2:0:0:0:3
1:0:0:2::3
1:0:0:8:8:0:0:3 1:0:0:8:8:0:0:3
1::8:8:0:0:3
1:2:3:4:5:6:7:8 1:2:3:4:5:6:7:8
1:2:3:4:5:6:7:8
ABCD:1234 <Invalid address format - no output>
ABCDE::1234 <Invalid address format - no output>
1:2:3:4:5:6:7:8:9 <Invalid address format - no output>
:::1 <Invalid address format - no output>
codegolf puzzle <Invalid address format - no output>
Это Codegolf , поэтому самый короткий ответ в байтах 6 июня 2014 года будет принят победителем.
источник
1:0:0:2:2::3
. Будет ли сокращенный результат идентичным этому или1::2:2:0:0:3
? То же самое для неоптимально сокращенного ввода.1::2:0:0:0:3
ввод?Ответы:
JavaScript (ES6) -
198,183,180,188, 187 байтИ, немного длиннее, интерактивная версия с несколькими всплывающими окнами (203 байта):
Ungolfed:
Объяснение:
Чтобы рассчитать длинную версию адреса IPv6:
8 - str.split(/:+/).length % 9
- подсчитайте, сколько нулей нам нужно вставить. Их 8 - количество шестнадцатеричных значений. Здесь% 9 - защита, поэтому она никогда не будет отрицательным числом.replace('::', ':0'.repeat(zeros || 1) + ':')
- заменить "::" нулями, разделенными двоеточиями. Если нет нулей для добавления, он все равно добавляет один, поэтому адрес не будет действительным в концеreplace(/^:0|0:$/g, zeros ? '0:0' : '0')
- это касается особого случая, когда адрес начинается или заканчивается на «::», так какsplit
функция добавляет 1 к числу шестнадцатеричных значений (:: 1 -> ["», "1"])Это оно! Теперь давайте посчитаем краткую форму:
replace(/(\b0(:0)*)(?!.*\1:0)/,':')
- заменить самый длинный ряд нулей на двоеточие (не важно, сколько).replace(/::+/,'::')
- удалите лишние двоеточия, если таковые имеютсяreturn /^(:[\da-f]{1,4}){8}$/i.test(':'+longIP) && [longIP, shortIP];
- проверить, является ли длинная версия действительным IPv6, и вернуть обе версии илиfalse
если тест не пройден.Тесты в Firefox:
источник
1:2:3:4::a:b:c:d
Javascript (E6) 246
305 284 292 319Сильно пересмотренный Особый случай для :: специально обработанной фазы сжатия позволяет избежать цикла for (но на самом деле не очень короче)
Я уверен, что окончательная фаза сжатия может быть сделана короче. Во всяком случае, не сейчасБлагодаря Nderscore
Как программа
Ввод и вывод с использованием js popup, в основном:
p=prompt,p(F(p()))
перезапись с помощью popup и без определения функции, количество символов должно быть меньше 260Ungolfed и прокомментировал немного
Тест In console
Тестовый вывод
источник
prompt()
. Вот некоторые оптимизации, которые довели его до 290: pastie.org/private/3ccpinzqrvvliu9nkccygPerl - 204
176 190 191 197(202 символа + 2 за
-p
флаг)Пример:
Объяснение:
источник
die
на тихий выход.1:2:3:4::a:b:c:d
. Это раздражающий особый случай, потому что большинство адресов из восьми двоеточий являются недействительными, но::2:3:4:a:b:c:d
и1:2:3:4:a:b:c::
оба действительныСед, 276
У меня есть 275 байт в ipshorten.sed, плюс 1 байт для
-r
включенияsed -rf
использования расширенных регулярных выражений. Я использовал OpenBSD sed (1) .Использование:
echo ::2:3:4:a:b:c:d | sed -rf ipshorten.sed
Я использую 22 регулярных выражения, так как sed не может сравнивать числа или составлять массивы. Для каждой строки ввода sed выполняет команды и печатает строку. Во время тестирования я поместил несколько строк предполагаемых IP-адресов в файл и передал этот файл в sed. Ссылка на расширенные регулярные выражения находится в re_format (7) .
s/^/:/
добавляет дополнительный двоеточие в начало строки. Я использую это дополнительное двоеточие для игры в гольф следующих двух команд./^(:[0-9A-Fa-f]{0,4})*$/!d
проверяет, соответствует ли вся строка нулю или более группам двоеточий, за которыми следуют от нуля до четырех шестнадцатеричных цифр.!
отменяет проверку, поэтомуd
удаляет строки со слишком большими шестнадцатеричными числами или с недопустимыми символами. Когдаd
удаляется строка, sed не запускает больше команд в этой строке.s/:0*([^:])/:\1/g
удаляет первые 0 из каждого числа. Это изменило бы:0000:0000:
на:0:0:
. Я должен сделать это, потому что мой цикл сжатия работает только с однозначными нулями.s/://
удаляет лишнее двоеточие. Удаляет только первый двоеточие.s/::/:=/
меняет первый::
на:=
. Это так, позже команды могут совпадать,=
а не::
, и так=
не считается двоеточием. Если нет::
, эта замена безопасно ничего не делает.::
нужно сделать хотя бы один 0, но есть три разных случая для размещения этого 0.s/(.:=)(.)/\10:\2/
это первый случай. Если::
был между двумя другими персонажами, то:=
становится:=0:
. Это единственный случай, который добавляет двоеточие.s/^:=/0&/
это второй случай. Если::
был в начале строки, тогда поставьте 0 там.s/=$/&0/
это третий случай, для::
в конце строки.:E
это метка для цикла расширения./(.*:){7}/!{/=/!d
начинается условный блок, если в строке меньше 7 двоеточий./=/!d
удаляет строки, у которых нет::
и не хватает двоеточий.s//=0:/
добавляет одну двоеточие. Пустой//
повторяет последнее регулярное выражение, так что это действительно такs/=/=0:/
.bE
ветви, чтобы:E
продолжить цикл.}
закрывает блок Теперь в линии есть как минимум семь двоеточий.s/=//
удаляет=
./^:|::|:$|(.*:){8}/d
это окончательная проверка после расширения. Он удаляет строки с начальным двоеточием, дополнительный,::
который не был расширен, завершающий двоеточие или восемь или более двоеточий.p
печатает строку, которая является IP-адресом в полной форме.s/.*/:&:/
оборачивает адрес в дополнительные двоеточия.:0:0:0:
, и заключить ее в::
.s/:((0:)+)/:<\1>/g
кушает каждую группу 0s, так:0:0:0:
бы и стало:<0:0:0:>
.:C
является меткой для петли сжатия.s/0:>/>0:/g
перемещает один 0 из каждого рта, так:<0:0:0:>
стало бы:<0:0:>0:
./<0/{s/<>//g
открывает условный блок, если какой-либо рот не пуст.s/<>//g
удаляет все пустые рты, потому что эти группы слишком короткие.bC
продолжает цикл сокращения.}
закрывает блок Теперь любой рот пуст и отмечает самую длинную группу 0.s/<>(0:)+/:/
контракты самая длинная группа, так:<>0:0:0:
станет::
. В галстуке он выбирает пустой рот слева.s/<>//g
удаляет любые другие пустые рты./^::/!s/://
удаляет первое лишнее двоеточие, если оно не является частью::
./::$/!s/:$//
делает это для последнего лишнего двоеточия. Затем sed печатает IP-адрес в краткой форме.источник
Python 3: 387 символов
Даже работает с неправильно укороченным вводом.
Двойная замена на «
':::'
на'::'
ощупь» выглядит очень плохо, но не уверен, как правильно справиться с самой длинной строкой 0, когда она упирается в один или оба конца.Заменить финал
pass
с ,raise
чтобы увидеть , как этосбойзащиты от некорректного ввода.источник
1:2:3:4::a:b:c:d
но отклонена::2:3:4:a:b:c:d
и1:2:3:4:a:b:c::
. Я считаю, что это было неправильно все три раза.