Às vezes, quando digito um endereço IPv4, acerto todos os números, mas esqueço de digitar um ou mais períodos. Eu gostaria de ter um programa (ou função) que aceite meu endereço IPv4 quebrado e produza todas as veiculações válidas possíveis dos períodos ausentes.
Entrada
A entrada sempre será uma sequência que é uma transformação de um endereço IPv4 válido (consulte os detalhes abaixo). Ele sempre será transformado exclusivamente pela eliminação de um ou mais caracteres de ponto final.
Seu envio não precisa manipular entradas fora deste formato.
Saída
Uma coleção ou lista, em nenhuma ordem ou formato específico, de cadeias que representam todos os endereços IPv4 válidos que podem ser criados a partir da entrada pela inserção de caracteres de ponto na entrada.
- A saída pode ser uma lista nativa do idioma ou outro tipo de coleção ordenada ou não ordenada.
- Como alternativa, pode ser uma sequência de cadeias de endereços IPv4 delimitada de alguma maneira clara.
- Se você usar um delimitador de caractere único para delimitar sua sequência, pontos e dígitos não serão permitidos como esse delimitador de caractere único. Percebo que, diferentemente dos números, os períodos como delimitadores não são ambíguos (uma vez que cada quarto período seria necessariamente um delimitador), mas por uma questão de legibilidade, eu o estou desaprovando.
Formato de endereço IPv4
Embora os endereços IPv4 sejam realmente apenas uma sequência de quatro octetos binários, esse desafio usa um formato decimal pontilhado restrito.
- Um endereço IPv4 é um quatro valores decimais separados por três períodos.
- Cada um dos quatro valores está no intervalo
0
de255
, inclusive. - Zeros à esquerda não são permitidos em nenhum valor numérico. (Standalone de um caracter
0
é permitido; qualquer outro número começando com um zero não é:052
,00
, etc.)
Casos de teste
A entrada está na primeira linha, a saída na segunda linha (aqui, estruturada como uma lista separada por vírgula de seqüências de caracteres entre aspas, separada por vírgulas, entre elas [
]
, mas você pode usar qualquer formato ou estrutura razoável, conforme especificado acima). Alguns exemplos têm anotações em uma terceira linha para destacar a aplicação de uma regra específica.
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"]
(Eu fiz esses exemplos manualmente, então me avise sobre quaisquer erros que você possa encontrar.)
fonte
Respostas:
Pitão, 24 bytes
Experimente online
Como funciona
Pitão, 17 bytes, muito lento
Atenção. Não corra. Requer aproximadamente 553 GiB de RAM.
Como funciona
fonte
1.9.2.1.6.8.1.2
e19.2.1.6.8.1.2
etc.? (Mas, então, obviamente, todos os inválidos são filtrados para fora)C (gcc / linux),
125121 bytesFaz um loop em todos os endereços IPv4 possíveis e faz uma comparação personalizada que pula pontos extras no endereço IP gerado (mas não no endereço de comparação principal) para decidir se deseja imprimir ou não. Muito lento, mas deve terminar dentro de 1 hora em um PC razoável .
fonte
i=0;
.i
é 0 novamente ...Perl 5, 91 bytes
O programa espera uma única linha de uma única entrada e gera uma lista de candidatos delimitada por espaço.
Explicação
O programa explora o recurso de retorno do regex para fazer um loop em todas as possibilidades de formar um endereço IPv4 válido a partir da sequência de entrada.
O regex IPv4 com opcional
.
, nada de importante aqui.Uma expressão de avaliação de código que imprime o conteúdo dos grupos de captura.
Faça a partida falhar e force o retorno.
Exemplo de execução
fonte
JavaScript (ES6),
147141135 bytesEditar: salvou 6 bytes graças a @apsillers. Economizou outros 6 bytes copiando o teste de validade de @ YOU.
fonte
.
que lançaria o teste, mas acho que esta versão está correta.0
tem um$
. (Também está faltando um^
, por isso obrigado por chamar minha atenção para ele.)splice
, não funciona assim, modifica a matriz e retorna todos os elementos removidos.Python 3, 232 bytes
Bem simples: colocamos períodos em todos os lugares e imprimimos se o endereço IP com os períodos colocados é válido. Verificamos a validade dos endereços IP usando (ab) usando
ipaddress.ip_address
, o que gera uma exceção se a entrada não for um endereço IP válido. O desafio define algumas regras adicionais queip_address
não tratam (ou seja, que não pode haver zeros à esquerda), portanto, verificamos essas também com uma expressão regular e depois imprimimos.Produz cada solução em uma nova linha, combinada com um número arbitrário de linhas em branco.
Exemplo de execução:
Aqui está minha solução Python 2 mais antiga de 248 bytes. Os segundo e terceiro níveis de recuo são
\t
(guia bruta) e\t
(guia bruta mais espaço), respectivamente. Isso funciona muito mal com o Markdown, então as guias foram substituídas por dois espaços.
Requer a entrada entre aspas (por exemplo
"123.456.789"
). Produz cada endereço IP gerado em uma nova linha.Guardado 9 bytes graças a @grawity!
fonte
ipaddress.ip_address()
mais curto que o aton + verificação manual?Braquilog , 110 bytes
Experimente online!
fonte
Python 3,
262260 bytesNenhuma biblioteca usada, mas tarde e mais, pode estar faltando algumas técnicas óbvias de golfe.
Resultados de qualquer maneira.
fonte
or
cláusula.