Ваш инструмент сканирования сети раздражающе разборчив в вводе данных и сразу падает, если вы передаете ему IPv4-адрес, который содержит неправильные символы или неправильно отформатирован.
Адрес IPv4 - это 32-разрядный числовой адрес, записанный в виде четырех чисел, разделенных точками. Каждое число может быть от нуля до 255 .
Нам нужно написать инструмент для предварительной проверки ввода, чтобы избежать этих сбоев, и наш конкретный инструмент требователен: допустимый формат будет выглядеть так, a.b.c.d
где a, b, c и d:
- Может быть
0
или натуральным числом без начальных нулей . - Должно быть между 0 - 255 (включительно).
- Если не содержат специальные символы , такие как
+
,-
,,
и другие. - Должен быть десятичным (базовым
10
)
Ввод : строка
Вывод : значение «истина» или «ложь» (произвольные значения также принимаются)
Тестовые случаи :
Input | Output | Reason
| |
- 1.160.10.240 | true |
- 192.001.32.47 | false | (leading zeros present)
- 1.2.3. | false | (only three digits)
- 1.2.3 | false | (only three digits)
- 0.00.10.255 | false | (leading zeros present)
- 1.2.$.4 | false | (only three digits and a special symbol present)
- 255.160.0.34 | true |
- .1.1.1 | false | (only three digits)
- 1..1.1.1 | false | (more than three periods)
- 1.1.1.-0 | false | (special symbol present)
- .1.1.+1 | false | (special symbol present)
- 1 1 1 1 | false | (no periods)
- 1 | false | (only one digit)
- 10.300.4.0 | false | (value over 255)
- 10.4F.10.99 | false | (invalid characters)
- fruit loops | false | (umm...)
- 1.2.3.4.5 | false | (too many periods/numbers)
- 0.0.0.0 | true |
- 0.0 0.0. | false | (periods misplaced)
- 1.23..4 | false | (a typo of 1.2.3.4)
- 1:1:1:1:1:1:1:1| false | (an IPv6 address, not IPv4)
Это код-гольф , поэтому выиграет меньше байтов!
Примечание для пользователей - если вы хотите добавить еще несколько тест-кейсов, добро пожаловать (предлагая редактирование). Но, пожалуйста, убедитесь, что тесты не повторяются! Благодарность
1.1.1.1.1
,1.1.1.1.
,.1.1.1
,1..1.1
,1..1.1.1
,1.1.1.0
,1.1.1.-0
,1.1.1.+1
,1.1.1.1E1
,1.1.1.256
,1.1.1.0x1
,255.255.255.255
,0.0.0.0
,'or 1=1--
,<empty string>
,1 1 1 1
,1,1,1,1
.Ответы:
Машинный код X86_64:
1816 байтИзменить: этот ответ не совсем работает, так как
inet_pton
из стандартных библиотек C, что означает, что мне нужно extern. Я не включил extern в мой счетчик байтов.И да, все это в значительной степени делается уже написанной функцией
Во всяком случае, это то, что я получил:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Монтаж:
Объяснение:
Посмотрите на
inet_pton(3)
. Он берет строковый IP-адрес и помещает его в буфер, который вы можете использоватьstruct sockaddr
. Он принимает 3 аргумента: семейство адресов (AF_INET
(ipv4), 2 илиAF_INET6
(ipv6), 10), строку адреса ip и указатель на вывод. Он возвращает 1 в случае успеха, 0 для недопустимого адреса или -1 в случае, когда семейство адресов отсутствуетAF_INET
илиAF_INET6
(что никогда не произойдет, потому что я передаю ему константу).Поэтому я просто перемещаю строку в регистр для второго аргумента, устанавливаю первый регистр в 2 и устанавливаю третий регистр в красную зону (128 байтов ниже указателя стека), так как мне плевать на результат. Тогда я могу просто
jmp
кinet_pton
и пусть , что возвращение прямо к абоненту!Я включил эту программу быстрого тестирования, чтобы проверить ваши случаи:
Соберите с
nasm -felf64 assembly.asm
, скомпилируйтеgcc -no-pie test.c assembly.o
, и вы получите:Я мог бы сделать это намного меньше, если бы вызывающий должен был передать
AF_INET
илиAF_INET6
функциюисточник
e9 00 00 00 00
этоjmp near $+5
, а неjmp inet_pton
. Если вы предоставляете код операции, вы должны включить включающуюinet_pton
часть, а не оставлять пустымJava (JDK) , 63 байта
Попробуйте онлайн!
кредиты
.1.1.1.1
.источник
.1.2.3.4
Output: 0 or 1
и у Java нет автоматического bool-> intJavaScript (Node.js) , 43 байта
Попробуйте онлайн!
JavaScript (Node.js) , 46 байт
Попробуйте онлайн!
часть Арно
JavaScript (Node.js) ,
545351 байтПопробуйте онлайн!
-2B для
0+t<256
, -1B от Патрика Стефансена, + 1B, чтобы избежать ввода1.1.1.1e-80
Решение RegExp
5854 байтаСпасибо Deadcode за 3 байта
источник
0.0.0.0
. Все остальное вроде работает нормально.0.0.0.0
здесь правда. Почему SQL-инъекция здесь?0.0.0.0
это действительно правда. Это также повлияет на мой ответ .. (И что вы подразумеваете под SQL-инъекцией?: S Ссылка на TIO со ВСЕМИ тестовыми случаями.)PHP ,
3936 байтПопробуйте онлайн!
275 напоминает постоянную
FILTER_VALIDATE_IP
5 ** 9 используется вместо константы
FILTER_FLAG_IPV4
. Этого достаточно, потому что5**9 & FILTER_FLAG_IPV4
это правда, что именно то, что PHP делает в фоновом режиме, как отметил Бенуа Эснард.Здесь
filter_var
возвращает первый аргумент, если это действительный адрес IPv4, или false, если это не так. С помощью+!!
мы производим выходные данные, необходимые для вызова.источник
5**9
вместо1048576
сохранения 3 байта: PHP использует&
для проверки флагов IPv4 / IPv6 , поэтому допустимо любое число от 1048576 до 2097151.PHP, 36 байт
ip2long
это хорошо известная встроенная функция .источник
Perl 6 ,
222120 байт-1 байт благодаря Филу Х.
Попробуйте онлайн!
объяснение
источник
%
модификатора. Интересно, пытается ли он проверить все256**4
возможности?<{^256}>
вы можете просто преобразовать диапазон в массив@(^256)
за -1 символ TIO . Изменяя блок кода на массив, он также становится намного быстрее (0,4 с вместо 30).$(^256)
но теперь я понимаю, почему это не сработало.05AB1E ,
2624232223 байта-1 байт благодаря @Emigna .
+1 байт для
1.1.1.1E1
исправления ошибки в тесте, возвращающем неверный результат.Попробуйте онлайн или проверьте все контрольные примеры .
Объяснение:
источник
Ā
вместо<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, и0.00.10.255
. (PS: я исправил1.1.1.1E1
, добавивþ
проверку на объединение и равенство.)DïþJsJQ
проверку, гдеï
приводим его к int, чтобы удалить начальные 0, иþ
оставляем только цифры, удаляя такие вещи, какE
,-
и т. Д. :) Это1š
для тестового примера0.00.10.255
, так как00010255
и0010255
будет равно.PowerShell,
595149 байт-8 байт, спасибо @AdmBorkBork
-2 байта,
true
илиfalse
разрешено авторомТестовый скрипт:
Выход:
Объяснение:
Сценарий пытается проанализировать строку аргумента, чтобы создать объект .NET, IPAddress .
$true
еслиobject
создан, и строка аргумента равна строковому представлениюobject
(нормализованный адрес поobject.toString()
)$false
иначеPowerShell,
595654 байта, альтернатива «не использовать .NET lib»-3 байта,
true
илиfalse
разрешено автором-2 байта, спасибо @ Deadcode за классное регулярное выражение.
Попробуйте онлайн!
Спасибо Оливье Грегуар за оригинальное регулярное выражение.
источник
|% t*g
поскольку PowerShell автоматически приведёт правую часть-eq
строки как строку, потому что левая часть - это строка. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 байтов
Попробуйте онлайн!
Работает как 64-битный код на TIO, но, вероятно, требует этого
sizeof(int) == sizeof(char*)
на других платформах.источник
-m32
).s
какchar*
(нет доступа к системе ILP32 здесь), и да, я смешивалсяinet_aton()
.PHP 7+,
373532 байтаПри этом используется встроенная функция
filter_var
для проверки того, что это адрес IPv4 .Чтобы это работало, вам нужно передать ключ
i
через запрос GET.Ничего не выводит (для
falsy
результата) или IP (дляtruthy
результата), в зависимости от результата.Вы можете примерить это на:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4При этом используются следующие значения напрямую:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Спасибо Бенуа Эснарду за этот совет, который спас мне 1 байт!
Спасибо Титу за напоминание об изменениях в конкурсе.
Я рассмотрел использование этой функции
ip2long
, но она работает с неполными IP-адресами.Неполные адреса IPv4 считаются недопустимыми в этом вызове.
Если бы они были разрешены, это был бы окончательный код (только для PHP 5.2.10):
В настоящее время в документации не указано, что это перестанет работать (при передаче неполного ip) с более новыми версиями PHP.
После тестирования подтвердил, что это так.
Спасибо nwellnhof за отзыв!
источник
5**9
вместо1<<20
сохранения один байт: PHP использует&
для проверки флагов IPv4 / IPv6 , поэтому допустимо любое число от 1048576 до 2097151.ip2long
не допускает неполных адресов.+!!
не требуется; ОП теперь принимает произвольные истинные значения.Python 3:
8178706966 байтПереберите все возможные адреса IPv4, получите строковое представление и сравните его с входными данными. Эээээээ ... Бегает некоторое время.
РЕДАКТИРОВАТЬ: Удалено 3 байта путем перехода от полной программы к анонимной функции.
EDIT2: удалено 8 байт с помощью xnor
EDIT3: удален 1 байт с использованием распакованной карты вместо понимания списка
EDIT4: удалены 3 байта, используя понимание списка вместо
ipaddress
модуляисточник
[str(ip_address(x))for x in range(256**4)].count
. Также256**4
может быть16**8
.C # (интерактивный компилятор Visual C #) ,
847965 байтПопробуйте онлайн!
-5 и -14 байтов сохранено благодаря @dana!
# C # (интерактивный компилятор Visual C #) , 61 байтПопробуйте онлайн!
Работа в процессе. Используйте код
System.Net
(+17 байт, если вы считаете его). если вам интересно почему я считаю и разбираюисточникКак сказал @milk в комментарии, он действительно не справится с ведущими нулями. Итак, 61 байт один не работает.
источник
Python 2 ,
85 8281 байт-1 байт благодаря Кевину Круйссену
Попробуйте онлайн!
113-байтовый ответ удаляется, так как
1.1.1.1e-80
источник
print 1*r
в гольф наprint~~r
. +1, хотя, так как, кажется, работает для всех возможных тестовых случаев, предложенных до сих пор . PS: Ваш 113-байтовый ответ не подходит для1.1.1.1e-80
.ipaddress
модуль Python 3?Japt,
1715 байтПопробуйте или выполните все контрольные примеры или проверьте дополнительные контрольные примеры из комментариев
объяснение
Мы разделяем массив на
.
, проверяем, что длина этого массива равна4
AND, что длина, когда["0","255"]
из него удаляются все элементы в диапазоне , равна falsey (0
).источник
Mathematica,
3931 байтОригинальная версия:
Модифицированная версия (спасибо Мише Лаврову)
который возвращает,
True
если вход является действительным IP-адресом ( попробуйте ).Если вы настаиваете на получении
1
и0
вместо этого, тогда потребуются дополнительные 7 байтов:источник
Interpreter["IPAddress"]
возвращает строку для правильного ввода и некоторый сложный объект сбоя для неверного ввода, мы можем проверить на допустимые входы с помощьюAtomQ[Interpreter["IPAddress"][#]]&
, который может быть далее сокращен до композиции функцииAtomQ@*Interpreter["IPAddress"]
. Попробуйте онлайн!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 байт
Возвращает логическое значение.
Попробуйте онлайн!
источник
Python 2,
93896753 байтаПопробуйте онлайн!
Спасибо Деннису за бритье другого 14 байтов на внутренних сравнениях и коде выхода.
Отдельное спасибо Джонатану Аллану за бритье 22 байта и исправление логики! Надоедливая попытка / кроме никого!
Благодаря правильному форматированию строк вместо необработанных байтов, Джо Кинг сбрасывает 4 байта.
источник
i==`int(i)&255`
. Кроме того, вы можете вызвать ошибку[...]!=[1]*4>_
, так как вы все равно используете коды выхода. Попробуйте онлайн!>_
делает. Битовый и довольно гениальный, хотя ... Я не смог объединить их сам.!=
возвращается False, Python закорачивается и ничего не происходит; переводчик выходит нормально. Если он возвращает True,>_
возникает ошибка NameError, потому что переменная_
не определена.СФК , 176 байт
* изначально был Bash + SFK, но с тех пор TIO добавил правильную оболочку SFK
Попробуйте онлайн!
источник
nc [addr] 1 -w1
сократить это?nc
принимает как начальные нули, так и IPv6-адреса, поэтому мне все равно придется с ними справляться - и это все равно скорееsfk
ответ, чем ответ оболочки.python3Bash * 60* Также другие снаряды. Любой, для которого проверка на правдивость / ложность проходит код завершения программы
объяснение
Проблема с чисто Python-решениями заключается в том, что сбой программы считается неопределенным. Мы могли бы использовать «много» кода для преобразования исключения в правильное истинное значение. Однако в какой-то момент интерпретатор Python обрабатывает это необработанное исключение и возвращает ненулевой код завершения. Из-за низкой стоимости смены языков на вашу любимую оболочку Unix мы можем сэкономить немало кода!
Конечно, это уязвимо для инъекционных атак ... Входные данные, такие как,
1.1.1.1'); print('Doing Something Evil
являются прямой угрозой!источник
ECMAScript чистое регулярное выражение, 41 байт
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Попробуйте онлайн!
Попробуйте это на regex101
Я думаю, что логика в этом регулярном выражении говорит сама за себя, поэтому я просто напечатаю, но не буду комментировать это:
Это может быть использовано для сброса 2 байтов следующих ответов:
Вот альтернативная версия, которая допускает начальные нули, но делает это последовательно (октеты могут быть представлены максимум 3 десятичными цифрами):
^((2(?!5?[6-9])|1|0?)\d\d?\.?\b){4}$
Или разрешить любое количество ведущих нулей:
^(0*(2(?!5?[6-9])|1?)\d\d?\.?\b){4}$
источник
\b
и\B
... это умно!(?!0\d)
вместо этого, но мне нравится\B
лучше!\.?\b
Спас меня байт на мой ответ тоже, спасибо!Красный , 106 байт
Попробуйте онлайн!
Returnd
true
илиfalse
Объяснение:
источник
Stax , 14 байт
Запустите и отладьте его
Распакованный, размазанный и прокомментированный, это выглядит так.
Запустите этот
источник
Python 3,
10993 байтаобъяснение
Каждый октет может быть 0 - 255:
Октет может заканчиваться символом (.) Или просто заканчиваться, при условии, что он не может сделать оба, отрицательный взгляд
(?!$)
заботится об этом случаеСпасибо @Zachary за то, что заставил меня понять, что я могу отбросить пробелы (так как это кодовый гольф).
Спасибо @DLosc за улучшения и заставить меня осознать мою ошибку, теперь она исправлена.
источник
x: re.match
=>x:re.match
;, x
=>,x
и) is
=>)is
должны сохранить 3 байта. Кроме того, в регулярном выражении вы можете использовать\d
для каждого случая[0-9]
, и[1]
=>1
. Это похоже на отличный первый пост, хотя![1-9][0-9]|[0-9]
может стать[1-9]\d|\d
(согласно совету Захари), который может стать[1-9]?\d
. Кроме того, вместо тестированияre.match(...)is not None
вы можете сделать это,bool(re.match(...))
так как совпадающие объекты являются правдивыми иNone
ложными. :)1.2.3.4.5
(а также1.2.3.4.
, которого нет в официальном списке тестовых случаев), потому что он может совпадать с точкой вместо конца строки после четвертого числа.Баш , 30 байт
Попробуйте онлайн!
источник
echo $(($?))
часть не нужна, поскольку программам разрешено выводить свой результат через код завершения.Древесный уголь ,
4521 байтПопробуйте онлайн! Ссылка на подробную версию кода. Редактировать: 24 байта сохранены путем переноса ответа Япта @ Шегги. Объяснение:
источник
123.-50.0.12
или1.1.1.-80
. Все остальное вроде работает нормально. Таким образом,<256
проверка должна бытьin [0,255]
вместо.Сетчатка ,
4644 байтаПорт Java-ответа @ OlivierGrégoire , так что не забудьте его поддержать!
-2 байта благодаря @Neil .
Попробуйте онлайн .
Объяснение:
источник
\d
оптимизации группы, поэтому вы можете сохранить два байта, потому что вам не нужнаM
спецификация для Последняя линия.Желе , 11 байт
Монадическая ссылка, принимающая список символов, который дает1 если это правильный адрес и 0 иначе. Строит список всех2564= 4294967296 адреса, а затем подсчитывает количество вхождений входа в него.
Вот похоже @ Попробуйте онлайн! который использует16 ( 256 (
⁴
) а не⁹
), так как метод неэффективен!Как?
источник
Retina ,
4241 байтПопробуйте онлайн! На основании предыдущей версии ответа @ nwellnhof на Perl 6, но 1 байт был сохранен путем кражи
\.?\b
уловки из ответа @ Deadcode. Объяснение:Очистить рабочую зону.
Вставьте 255 символов.
Создайте диапазон 0..255, разделенный
|
s, с префиксом^((
и суффиксом)\.?\b){4}$
, таким образом, создавая регулярное выражение^((0|1|...255)\.?\b){4}$
.Оцените это на исходном входе.
источник
Пип ,
2516 байтПринимает IP-адрес кандидата в качестве аргумента командной строки. Попробуйте онлайн! или проверить все контрольные примеры
объяснение
Решение Regex, по сути порт рекурсивного ответа Stax .
источник
JavaScript, 89 байт
Попробуйте онлайн!
Создайте
RegExp
группы захвата из индексов массива,length
256
для которого диапазон0-255
объединен с|
последующим повторяющимся.
символом (^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$
), повторяется несколько3
раз, закрывается соединенным массивом, за которым$
следует совпадение конца строки, возвратаtrue
илиfalse
результата переданного вводаRegExp.prototype.test()
.источник