Su herramienta de escaneo de red es irritantemente exigente con la entrada, e inmediatamente se bloquea si la alimenta con una dirección IPv4 que contiene caracteres incorrectos o no está formateada correctamente.
Una dirección IPv4 es una dirección numérica de 32 bits escrita como cuatro números separados por puntos. Cada número puede ser de cero a 255 .
Necesitamos escribir una herramienta para validar previamente la entrada para evitar esos bloqueos, y nuestra herramienta específica es exigente: se verá un formato válidoa.b.c.d
donde a, b, c y d:
- Puede ser un
0
número natural o sin ceros a la izquierda . - Debe estar entre 0 y 255 (inclusive).
- En caso de no incluir los símbolos especiales como
+
,-
,,
, y otros. - Debe ser decimal (base
10
)
Entrada : una cadena
Salida : valor de Verdad o Falsey (también se aceptan valores arbitrarios)
Casos de prueba :
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)
Este es el código de golf , ¡por lo que ganarán menos bytes!
Nota para los usuarios : si desea agregar más casos de prueba, será bienvenido (sugiriendo una edición). Pero, ¡asegúrese de que los casos de prueba no se repitan! Gracias
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
.Respuestas:
Código máquina X86_64:
18 años16 bytesEditar: esta respuesta no funciona, ya que
inet_pton
de las bibliotecas C estándar, lo que significa que necesito el externo. Sin embargo, no incluí el externo en mi recuento de bytes.Y sí, todo se está haciendo prácticamente por una función ya escrita
De todos modos, esto es lo que obtuve:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Montaje:
Explicación:
Echa un vistazo a
inet_pton(3)
. Toma una dirección IP de cadena y la coloca en un búfer con el que puede usarstruct sockaddr
. Toma 3 argumentos: la familia de direcciones (AF_INET
(ipv4), 2 oAF_INET6
(ipv6), 10), la cadena de la dirección ip y un puntero a la salida. Devuelve 1 en caso de éxito, 0 para una dirección no válida o -1 para cuando la familia de direcciones es ningunoAF_INET
oAF_INET6
(lo que nunca ocurrirá porque le estoy pasando una constante).Entonces, simplemente muevo la cadena al registro para el segundo argumento, establezco el primer registro en 2 y establezco el tercer registro en la zona roja (128 bytes debajo del puntero de la pila) ya que no me importa el resultado. Entonces puede simplemente
jmp
ainet_pton
y dejar que el regreso directamente a la persona que llama!Hice girar este programa de prueba rápida para probar sus casos:
Ensambla
nasm -felf64 assembly.asm
, compilagcc -no-pie test.c assembly.o
y obtendrás:Podría hacer esto mucho más pequeño si se supone que la persona que llama debe pasar
AF_INET
oAF_INET6
a la funciónfuente
e9 00 00 00 00
es unjmp near $+5
, no unjmp inet_pton
. Si proporciona código de operación, debe incluir lainet_pton
parte que incluye , no dejar un espacio en blancoJava (JDK) , 63 bytes
Pruébalo en línea!
Créditos
.1.1.1.1
.fuente
.1.2.3.4
Output: 0 or 1
y Java no tiene bool automático-> intJavaScript (Node.js) , 43 bytes
Pruébalo en línea!
JavaScript (Node.js) , 46 bytes
Pruébalo en línea!
utiliza la parte de Arnauld
JavaScript (Node.js) ,
545351 bytesPruébalo en línea!
-2B para
0+t<256
, -1B de Patrick Stephansen, + 1B para evitar la entrada1.1.1.1e-80
Solución RegExp
5854 bytesGracias Deadcode por 3 bytes
fuente
0.0.0.0
. Todo lo demás parece estar funcionando bien.0.0.0.0
es aquí una verdadera. ¿Por qué la inyección SQL está aquí?0.0.0.0
De hecho es verdad. Que el golf voluntad mi respuesta, así .. (? Y ¿qué es lo que entendemos por inyección de SQL: S El enlace es a TIO con casos de prueba de todo.)PHP ,
3936 bytesPruébalo en línea!
275 se asemeja a la constante
FILTER_VALIDATE_IP
Se está usando 5 ** 9 en lugar de la constante
FILTER_FLAG_IPV4
. Esto es suficiente, porque5**9 & FILTER_FLAG_IPV4
es verdad, que es exactamente lo que PHP hace en segundo plano, como señaló Benoit Esnard.Aquí,
filter_var
devuelve el primer argumento, si es una dirección IPv4 válida, o falso si no lo es. Con+!!
, producimos la salida requerida por el desafío.fuente
5**9
lugar de1048576
guardar 3 bytes aquí: PHP usa&
para probar los indicadores IPv4 / IPv6 , por lo que cualquier número entre 1048576 y 2097151 es válido.PHP, 36 bytes
ip2long
es una conocida función incorporada .fuente
Perl 6 ,
222120 bytes-1 byte gracias a Phil H.
Pruébalo en línea!
Explicación
fuente
%
modificador existía. Me pregunto si intenta comprobar todas las256**4
posibilidades.<{^256}>
eso, solo puede convertir el rango en una matriz@(^256)
para -1 char TIO . Al cambiar el bloque de código a una matriz, también se vuelve enormemente más rápido (0.4s en lugar de> 30).$(^256)
pero ahora me doy cuenta de por qué esto no funcionó.05AB1E ,
2624232223 bytes-1 byte gracias a @Emigna .
+1 byte para el caso de prueba de corrección de errores que
1.1.1.1E1
devuelve incorrectamente un resultado verdadero.Pruébelo en línea o verifique todos los casos de prueba .
Explicación:
fuente
Ā
lugar de<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, y0.00.10.255
. (PD: lo arreglé1.1.1.1E1
agregando elþ
al control deDïþJsJQ
cheque dondeï
echó a int para eliminar 0s principales, yþ
sólo las hojas dígitos quitando cosas comoE
,-
, etc. :) El1š
es para casos de prueba0.00.10.255
, puesto00010255
y0010255
sería igual.PowerShell,
595149 bytes-8 bytes, gracias @AdmBorkBork
-2 bytes,
true
ofalse
permitido por el autorScript de prueba:
Salida:
Explicación:
El script intenta analizar una cadena de argumento para construir un objeto .NET, IPAddress .
$true
si seobject
creó y la cadena de argumento es igual a una representación de cadena deobject
(dirección normalizada porobject.toString()
)$false
contrarioPowerShell,
595654 bytes, alternativa 'no use una lib .NET'-3 bytes,
true
ofalse
permitido por el autor-2 bytes, gracias a @ Deadcode por la genial expresión regular .
Pruébalo en línea!
Gracias @ Olivier Grégoire por la expresión regular original.
fuente
|% t*g
ya que PowerShell convertirá automáticamente el lado derecho de-eq
como una cadena, porque el lado izquierdo es una cadena. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 bytes
Pruébalo en línea!
Funciona como código de 64 bits en TIO, pero probablemente lo requiera
sizeof(int) == sizeof(char*)
en otras plataformas.fuente
-m32
).s
como unchar*
(sin acceso a un sistema ILP32 aquí), y sí, me estaba mezclandoinet_aton()
.PHP 7+,
373532 bytesEsto utiliza la función incorporada
filter_var
, para validar que es una dirección IPv4 .Para que funcione, debe pasar la clave
i
sobre una solicitud GET.No generará nada (para un
falsy
resultado) o la IP (para untruthy
resultado), dependiendo del resultado.Puedes probar esto en:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Esto usa los siguientes valores directamente:
1 << 20 = 1048576 = FILTER_FLAG_IPV4¡Gracias a Benoit Esnard por este consejo que me salvó 1 byte!
Gracias a Titus por recordarme los cambios al desafío.
He
ip2long
investigado el uso de la función , pero funciona con direcciones IP no completas.Las direcciones IPv4 no completas se consideran inválidas en este desafío.
Si se les permitiera, este sería el código final (solo para PHP 5.2.10):
Actualmente, no está explícito en la documentación que esto dejará de funcionar (cuando se pasa una IP incompleta) con las nuevas versiones de PHP.
Después de la prueba, confirmó que ese era el caso.
Gracias a nwellnhof por la informacion!
fuente
5**9
lugar de1<<20
guardar un byte aquí: PHP usa&
para probar los indicadores IPv4 / IPv6 , por lo que cualquier número entre 1048576 y 2097151 es válido.ip2long
no permite direcciones incompletas.+!!
no es requerido; el OP ahora acepta valores de verdad arbitrarios.Python 3:
8178706966 bytesRecorra todas las direcciones IPv4 posibles, obtenga la representación de cadena y compárela con la entrada. Es ... lleva un tiempo correr.
EDITAR: Se eliminaron 3 bytes al cambiar del programa completo a la función anónima.
EDIT2: eliminado 8 bytes con ayuda de xnor
EDITAR3: se eliminó 1 byte usando un mapa desempaquetado en lugar de la comprensión de la lista
EDIT4: se eliminaron 3 bytes mediante el uso de la comprensión de la lista en lugar del
ipaddress
módulofuente
[str(ip_address(x))for x in range(256**4)].count
. Además,256**4
puede ser16**8
.C # (compilador interactivo de Visual C #) ,
847965 bytesPruébalo en línea!
-5 y -14 bytes guardados gracias a @dana!
# C # (compilador interactivo de Visual C #) , 61 bytesPruébalo en línea!
Este es un trabajo en progreso. El uso del código
System.Net
(+17 bytes si lo cuenta). si te preguntas por qué cuento y analizo:fuenteComo @milk dijo en un comentario, fallará en ceros a la izquierda. Entonces, el de 61 bytes no está funcionando.
fuente
Python 2 ,
85 8281 bytes-1 byte gracias a Kevin Cruijssen
Pruébalo en línea!
La respuesta de 113 bytes se elimina porque falla
1.1.1.1e-80
fuente
print 1*r
al golfprint~~r
. Sin embargo, +1, ya que parece funcionar para todos los casos de prueba posibles sugeridos hasta ahora . PD: Su respuesta de 113 bytes falla1.1.1.1e-80
.ipaddress
un módulo Python 3?Japt,
1715 bytesPruébelo o ejecute todos los casos de prueba o verifique casos de prueba adicionales a partir de comentarios de desafío
Explicación
Nos dividimos en una matriz activada
.
, verificamos que la longitud de esa matriz sea igual a4
AND y que la longitud cuando["0","255"]
se eliminan todos los elementos del rango sea falsey (0
).fuente
Mathematica,
3931 bytesVersión original:
Versión modificada (gracias a Misha Lavrov)
que vuelve
True
si la entrada es una dirección IP válida ( pruébelo ).En caso de que insista en obtener
1
y0
, en cambio, serían necesarios 7 bytes adicionales:fuente
Interpreter["IPAddress"]
devuelve una cadena para una entrada válida, y algún objeto de falla complicado para una entrada no válida, podemos probar entradas válidas conAtomQ[Interpreter["IPAddress"][#]]&
, que se pueden acortar aún más a la composición de la funciónAtomQ@*Interpreter["IPAddress"]
. Pruébalo en línea!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 bytes
Devuelve un valor booleano.
Pruébalo en línea!
fuente
Python 2,
93896753 bytesPruébalo en línea!
Gracias a Dennis por reducir otros 14 bytes en las comparaciones internas y el código de salida.
¡Un agradecimiento especial a Jonathan Allan por reducir 22 bytes y una solución lógica! Intento molesto / excepto desaparecido!
Tomar cadenas formateadas correctamente en lugar de bytes sin formato elimina 4 bytes, gracias Jo King.
fuente
i==`int(i)&255`
. Además, puede forzar un error[...]!=[1]*4>_
, ya que de todos modos está utilizando códigos de salida. Pruébalo en línea!>_
hace. Sin embargo, es bastante ingenioso ... No tuve éxito en combinarlos yo mismo.!=
devuelve False, Python se cortocircuita y no pasa nada; El intérprete sale normalmente. Si devuelve True,>_
genera un NameError, porque la variable_
no está definida.sfk , 176 bytes
* originalmente era Bash + SFK, pero desde entonces TIO ha agregado un envoltorio SFK adecuado
Pruébalo en línea!
fuente
nc [addr] 1 -w1
acortaría esto?nc
acepta los ceros a la izquierda, así como las direcciones IPv6, por lo que todavía tendría que manejarlos, y desfk
todos modos esto se pretende más como una respuesta que como una respuesta de shell.Python3Bash * 60* También otras conchas. Cualquiera para el que la prueba de verdad / falsedad pase un código de salida del programa
Explicación
El problema con las soluciones puras de Python es que el bloqueo de un programa se considera indeterminado. Podríamos usar un "lote" de código para convertir una excepción en un valor verdadero / rápido apropiado. Sin embargo, en algún momento el intérprete de Python maneja esta excepción no detectada y devuelve un código de salida distinto de cero. ¡Por el bajo costo de cambiar los idiomas a su shell de Unix favorito, podemos ahorrar bastante código!
Por supuesto, esto es vulnerable a los ataques de inyección ... ¡Entradas como
1.1.1.1'); print('Doing Something Evil
una amenaza no mitigada!fuente
ECMAScript regex puro, 41 bytes
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Pruébalo en línea!
Pruébalo en regex101
Creo que la lógica en esta expresión regular habla por sí misma, por lo que simplemente imprimiré bonito pero no lo comentaré:
Esto se puede usar para eliminar 2 bytes de las siguientes otras respuestas:
Aquí hay una versión alternativa que permite los ceros a la izquierda, pero lo hace de manera consistente (los octetos pueden estar representados por un máximo de 3 dígitos decimales):
^((2(?!5?[6-9])|1|0?)\d\d?\.?\b){4}$
O permita cualquier número de ceros a la izquierda:
^(0*(2(?!5?[6-9])|1?)\d\d?\.?\b){4}$
fuente
\b
y\B
... es inteligente!(?!0\d)
lugar, ¡pero me gusta\B
más!\.?\b
me ahorró un byte en mi respuesta, ¡gracias!Rojo , 106 bytes
Pruébalo en línea!
Devolver
true
ofalse
Explicación:
fuente
Stax , 14 bytes
Ejecutar y depurarlo
Desempaquetado, sin golf y comentado, se ve así.
Ejecute este
fuente
Python 3,
10993 bytesExplicación
Cada octeto puede ser 0-255:
Un octeto puede terminar con un (.) O simplemente terminar, con la condición de que no pueda hacer las dos cosas, la anticipación negativa
(?!$)
se ocupa de este casoGracias @Zachary por hacerme darme cuenta de que puedo descartar espacios (ya que es un código de golf)
Gracias @DLosc por las mejoras y hacerme dar cuenta de mi error, ya se ha corregido.
fuente
x: re.match
=>x:re.match
;, x
=>,x
, y) is
=>)is
debería guardar 3 bytes. Además, en la expresión regular, puede usar\d
para cada aparición de[0-9]
, y[1]
=>1
. ¡Sin embargo, esta parece ser una excelente primera publicación![1-9][0-9]|[0-9]
puede convertirse[1-9]\d|\d
(según el consejo de Zacharý), que puede convertirse[1-9]?\d
. Además, en lugar de probarre.match(...)is not None
, puede hacerlobool(re.match(...))
ya que los objetos de coincidencia son verdaderos yNone
falsey. :)1.2.3.4.5
(y también1.2.3.4.
, que no está en la lista oficial de casos de prueba), porque puede coincidir con un punto en lugar del final de la cadena después del cuarto número.Bash , 30 bytes
Pruébalo en línea!
fuente
echo $(($?))
parte no es necesaria ya que los programas pueden emitir su resultado a través del código de salida.Carbón ,
4521 bytesPruébalo en línea! El enlace es a la versión detallada del código. Editar: Guardado 24 bytes al portar la respuesta de @ Shaggy's Japt. Explicación:
fuente
123.-50.0.12
o1.1.1.-80
. Todo lo demás parece estar funcionando bien. Entonces el<256
cheque debería serin [0,255]
en su lugar.Retina ,
4644 bytesPuerto de la respuesta Java de @ OlivierGrégoire , ¡así que asegúrese de votarlo!
-2 bytes gracias a @Neil .
Pruébalo en línea .
Explicación:
fuente
\d
optimización del grupo, por lo que puede guardar dos bytes porque no necesita laM
especificación en el Última línea.Jalea , 11 bytes
⁴
⁹
¿Cómo?
fuente
Retina ,
4241 bytesPruébalo en línea! Basado en una versión anterior de la respuesta de Perl 6 de @nwellnhof, pero se guardó 1 byte al robar el
\.?\b
truco de la respuesta de @ Deadcode. Explicación:Despeje el área de trabajo.
Insertar 255 caracteres.
Genere el rango 0..255 separado con
|
s, con el prefijo^((
y con el sufijo)\.?\b){4}$
, construyendo así la expresión regular^((0|1|...255)\.?\b){4}$
.Evalúe eso en la entrada original.
fuente
Pip ,
2516 bytesToma la dirección IP candidata como argumento de línea de comando. Pruébalo en línea! o Verificar todos los casos de prueba
Explicación
Solución Regex, esencialmente un puerto de respuesta Stax recursiva .
fuente
JavaScript, 89 bytes
Pruébalo en línea!
Cree
RegExp
grupos de captura a partir de índices de una matriz que tienelength
256
un rango0-255
unido con|
y seguido de un.
carácter escapado (^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$
) repetidas3
veces cerrando con una matriz unida seguido de$
para coincidir con el final de la cadena, el retornotrue
o elfalse
resultado de la entrada pasadaRegExp.prototype.test()
.fuente