Иногда, когда я набираю адрес IPv4, я получаю все цифры правильно, но я забываю ввести один или несколько периодов. Я хотел бы иметь программу (или функцию), которая берет мой сломанный адрес IPv4 и выводит все возможные допустимые размещения пропущенных периодов.
вход
Входными данными всегда будет строка, представляющая собой преобразование действительного адреса IPv4 (подробности см. Ниже). Он всегда будет преобразован исключительно путем удаления одного или нескольких символов периода.
Ваша заявка не должна обрабатывать ввод за пределами этого формата.
Выход
Коллекция или список, без определенного порядка или формата, строк, представляющих все действительные адреса IPv4, которые могут быть созданы из входных данных путем вставки символов периода во входные данные.
- Вывод может быть списком родного языка или другим упорядоченным или неупорядоченным типом коллекции.
- В качестве альтернативы, это может быть последовательность строк адреса IPv4, определенная каким-либо четким образом.
- Если вы используете для разделения строки односимвольный разделитель, точки и цифры не допускаются в качестве этого разделителя. Я понимаю, что, в отличие от чисел, периоды в качестве разделителей не являются неоднозначными (поскольку каждый четвертый период обязательно будет разделителем), но для удобства чтения я запрещаю это.
Формат адреса IPv4
Хотя IPv4-адреса на самом деле представляют собой последовательность из четырех двоичных октетов, в этом вызове используется ограниченный десятичный формат с точками.
- Адрес IPv4 - это четыре десятичных значения, разделенных тремя периодами.
- Каждое из четырех значений находится в диапазоне
0
до255
включительно. - Ведущие нули не допускаются ни при каких числовых значениях. (Изолированный из одного символа
0
допускаются; любое другое число , начиная с нулем не является:052
,00
и т.д.)
Тестовые случаи
Входные данные находятся в первой строке, выходные - во второй строке (здесь, структурированный как разделенный запятыми список строк в кавычках, разделенных запятыми, окруженный [
]
, но вы можете использовать любой разумный формат или структуру, как указано выше). Некоторые примеры имеют примечания в третьей строке, чтобы выделить применение определенного правила.
192.168.1234
["192.168.1.234", "192.168.12.34", "192.168.123.4"]
192.1681234
["192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]
(Note: 192.1681.2.34 (etc.) is illegal because 1681 is greater than 255)
1921681.234
["19.216.81.234", "192.16.81.234", "192.168.1.234"]
1921681234
["19.216.81.234", "192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]
192.168.1204
["192.168.1.204", "192.168.120.4"]
(Note: 192.168.12.04 is illegal because of leading zero)
192.168.123
["1.92.168.123", "19.2.168.123", "192.1.68.123", "192.16.8.123", "192.168.1.23", "192.168.12.3"]
192.168.256
["192.168.2.56", "192.168.25.6"]
(Note: Any combination that would leave 256 intact is illegal)
120345
["1.20.3.45", "1.20.34.5", "1.203.4.5", "12.0.3.45", "12.0.34.5", "120.3.4.5"]
(Note: 12.03.4.5 (etc.) is illegal due to leading zero.)
012345
["0.1.23.45", "0.1.234.5", "0.12.3.45", "0.12.34.5", "0.123.4.5"]
(Note: the first segment must be 0, because `01` or `012` would be illegal.)
000123
["0.0.0.123"]
(Я сделал эти примеры вручную, поэтому, пожалуйста, предупредите меня о любых ошибках, которые вы можете найти.)
источник
Ответы:
Pyth, 24 байта
Попробуйте онлайн
Как это работает
Pyth, 17 байт, очень медленный
Предупреждение. Не беги. Требуется около 553 ГБ ОЗУ.
Как это работает
источник
1.9.2.1.6.8.1.2
и19.2.1.6.8.1.2
т. Д. (Но тогда, очевидно, все недействительные отфильтровываются)C (gcc / linux),
125121 байтПеребирает все возможные адреса IPv4 и выполняет пользовательское сравнение, которое пропускает лишние точки в сгенерированном IP-адресе (но не в основном адресе сравнения), чтобы решить, печатать или нет. Очень медленно, но должно закончиться в течение 1 часа на разумном ПК .
источник
i=0;
.i
сноваPerl 5, 91 байт
Программа ожидает одну строку одного ввода и выводит разделенный пробелами список кандидатов.
объяснение
Программа использует функцию обратного отслеживания в regex для обхода всех возможностей формирования действительного IPv4-адреса из входной строки.
Регулярное выражение IPv4 с необязательным
.
, ничего особенного здесь нет.Выражение оценки кода, которое печатает содержимое групп захвата.
Сделать матч не удастся и заставить отступить.
Пример запуска
источник
JavaScript (ES6),
147141135 байтРедактировать: сохранено 6 байтов благодаря @apsillers. Сохраните еще 6 байтов, скопировав тест достоверности @ YOU.
источник
.
который бросил бы тест, но я думаю, что эта версия в порядке.0
есть$
. (Это также не хватает^
, так что спасибо, что обратили на это мое внимание.)splice
не работает так, он изменяет массив и возвращает все удаленные элементы.Python 3, 232 байта
Довольно просто: мы размещаем периоды везде и печатаем, если IP-адрес с установленными периодами действителен. Мы проверяем действительность IP-адресов с помощью (ab)
ipaddress.ip_address
, что вызывает исключение, если ввод не является действительным IP-адресом. Задача определяет некоторые дополнительные правила, которыеip_address
не обрабатываются (а именно, что не может быть начальных нулей), поэтому мы проверяем их также с помощью регулярного выражения, а затем печатаем.Выводит каждое решение на новой строке, смешанной с произвольным количеством пустых строк.
Пример выполнения:
Вот мое старое 248-байтовое решение Python 2. Второй и третий уровни отступа
\t
(необработанная вкладка) и\t
(необработанная вкладка плюс пробел) соответственно. Это играет очень плохо с Markdown, так что выступы были заменены двумя пробелами.
Требуется ввод, заключенный в кавычки (например,
"123.456.789"
). Выводит каждый сгенерированный IP-адрес на новую строку.Сохранено 9 байтов благодаря @grawity!
источник
ipaddress.ip_address()
короче чем aton + ручная проверка?Brachylog , 110 байт
Попробуйте онлайн!
источник
Python 3,
262260 байтБиблиотеки не используются, но поздно и дольше, может быть, мне не хватает некоторых очевидных техник игры в гольф.
Результаты все равно.
источник
or
предложения?