A veces, cuando escribo una dirección IPv4, obtengo todos los números correctos, pero olvido escribir uno o más puntos. Me gustaría tener un programa (o función) que tome mi dirección IPv4 rota y muestre todas las ubicaciones válidas posibles de los períodos faltantes.
Entrada
La entrada siempre será una cadena que es una transformación de una dirección IPv4 válida (ver detalles a continuación). Siempre se habrá transformado únicamente por la eliminación de uno o más caracteres de punto.
Su envío no necesita manejar entradas fuera de este formato.
Salida
Una colección o lista, en ningún orden o formato particular, de cadenas que representan todas las direcciones IPv4 válidas que se pueden crear a partir de la entrada mediante la inserción de caracteres de punto en la entrada.
- La salida puede ser una lista nativa del idioma u otro tipo de colección ordenada o no ordenada.
- Alternativamente, puede ser una secuencia de cadena de dirección IPv4 delimitada de alguna manera clara.
- Si usa un delimitador de un solo carácter para delimitar su cadena, no se permiten puntos ni dígitos como ese delimitador de un solo carácter. Me doy cuenta de que, a diferencia de los números, los períodos como delimitadores no son ambiguos (ya que cada cuarto período necesariamente sería un delimitador), pero en aras de la legibilidad, lo estoy rechazando.
Formato de dirección IPv4
Si bien las direcciones IPv4 son realmente solo una secuencia de cuatro octetos binarios, este desafío utiliza un formato decimal con puntos restringido.
- Una dirección IPv4 son cuatro valores decimales separados por tres puntos.
- Cada uno de los cuatro valores está en el rango
0
de255
, inclusive. - Los ceros iniciales no están permitidos en ningún valor numérico. (Independiente de un solo carácter
0
se permite; cualquier otro número que empieza con un cero no es:052
,00
, etc.)
Casos de prueba
La entrada está en la primera línea, la salida en la segunda línea (aquí, estructurada como una lista separada por comas de cadenas entre comillas, separadas por comas, rodeadas por [
]
, pero puede usar cualquier formato o estructura razonable, como se especificó anteriormente). Algunos ejemplos tienen notas en una tercera línea para resaltar la aplicación de una regla particular.
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"]
(Hice estos ejemplos a mano, así que avíseme de cualquier error que pueda encontrar).
fuente
Respuestas:
Pyth, 24 bytes
Pruébalo en línea
Cómo funciona
Pyth, 17 bytes, muy lento
Advertencia. No corras. Requiere aproximadamente 553 GiB de RAM.
Cómo funciona
fuente
1.9.2.1.6.8.1.2
y19.2.1.6.8.1.2
etc.? (Pero obviamente, todos los inválidos se filtran)C (gcc / linux),
125121 bytesRecorre todas las direcciones IPv4 posibles y realiza una comparación personalizada que omite puntos adicionales en la dirección IP generada (pero no en la dirección de comparación principal) para decidir si se imprime o no. Muy lento, pero debe terminar dentro de 1 hora en una PC razonable .
fuente
i=0;
.i
vuelva a ser 0 ...Perl 5, 91 bytes
El programa espera una sola línea de una sola entrada y genera una lista de candidatos delimitada por espacios.
Explicación
El programa explota la función de retroceso de regex para recorrer todas las posibilidades de formar una dirección IPv4 válida a partir de la cadena de entrada.
La expresión regular IPv4 con opcional
.
, nada de nota aquí.Una expresión de evaluación de código que imprime el contenido de los grupos de captura.
Hacer que el partido falle y forzar el retroceso.
Ejecución de ejemplo
fuente
JavaScript (ES6),
147141135 bytesEditar: guardado 6 bytes gracias a @apsillers. Ahorró otros 6 bytes copiando la prueba de validez de @ YOU.
fuente
.
que arrojaría la prueba, pero creo que esta versión está bien.0
tiene un$
. (También le falta un^
, así que gracias por llamar mi atención).splice
no funciona así, modifica la matriz y devuelve los elementos eliminados.Python 3, 232 bytes
Bastante simple: colocamos puntos en todas partes e imprimimos si la dirección IP con los puntos colocados es válida. Verificamos la validez de las direcciones IP mediante (ab) utilizando
ipaddress.ip_address
, lo que genera una excepción si la entrada no es una dirección IP válida. El desafío define algunas reglas adicionales queip_address
no manejan (es decir, que no puede haber ceros a la izquierda), por lo que también las verificamos con una expresión regular y luego imprimimos.Emite cada solución en una nueva línea, mezclada con un número arbitrario de líneas en blanco.
Ejemplo de ejecución:
Aquí está mi solución anterior de Python 2 de 248 bytes. Los niveles de sangría segundo y tercero son
\t
(pestaña sin procesar) y\t
(pestaña sin procesar más espacio) respectivamente. Esto juega muy mal con Markdown, por lo que las pestañas han sido reemplazadas por dos espacios.
Requiere la entrada rodeada de comillas (por ejemplo
"123.456.789"
). Emite cada dirección IP generada en una nueva línea.¡Guardado 9 bytes gracias a @grawity!
fuente
ipaddress.ip_address()
Sería más corto que el control manual de aton +?Brachylog , 110 bytes
Pruébalo en línea!
fuente
Python 3,
262260 bytesNo se utilizan bibliotecas, pero tarde y más tiempo, es posible que me falten algunas técnicas de golf obvias.
Resultados de todos modos.
fuente
or
cláusula.