Sua ferramenta de digitalização em rede é irritantemente exigente quanto à entrada e falha imediatamente se você fornecer um endereço IPv4 que contenha caracteres incorretos ou não esteja formatado corretamente.
Um endereço IPv4 é um endereço numérico de 32 bits escrito como quatro números separados por pontos. Cada número pode ser de zero a 255 .
Precisamos escrever uma ferramenta para pré-validar a entrada para evitar essas falhas, e nossa ferramenta específica é exigente: Um formato válido será semelhante a a.b.c.d
onde a, b, c e d:
- Pode ser um
0
número natural ou sem zeros à esquerda . - Deve estar entre 0 e 255 (inclusive).
- Caso não contêm símbolos especiais, como
+
,-
,,
e outros. - Deve ser decimal (base
10
)
Entrada : uma sequência
Saída : valor Truthy ou Falsey (valores arbitrários também aceitos)
Casos de teste :
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)
Isso é código-golfe , e o menor número de bytes vencerá!
Nota para os usuários - se você quiser adicionar mais casos de teste, será bem-vindo (sugerindo uma edição). Mas, certifique-se de que os casos de teste não se repitam! obrigado
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
.Respostas:
Código da máquina X86_64:
1816 bytesEdit: Esta resposta não funciona muito bem, pois
inet_pton
as bibliotecas C padrão, o que significa que preciso do externo. Eu não incluí o extern na minha contagem de bytes.E sim, tudo está sendo feito por uma função já escrita
Enfim, é isso que eu tenho:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Montagem:
Explicação:
Dê uma olhada
inet_pton(3)
. Ele pega um endereço IP de string e o coloca em um buffer que você pode usarstruct sockaddr
. São necessários três argumentos: a família de endereços (AF_INET
(ipv4), 2 ouAF_INET6
(ipv6), 10), a cadeia de caracteres do endereço IP e um ponteiro para a saída. Retorna 1 em caso de sucesso, 0 para um endereço inválido ou -1 para quando a família de endereços não é nemAF_INET
ouAF_INET6
(o que nunca ocorrerá porque estou passando uma constante para ele).Então, eu simplesmente movo a string para o registrador do segundo argumento, defino o primeiro registrador como 2 e o terceiro para a zona vermelha (128 bytes abaixo do ponteiro da pilha), pois não me importo com o resultado. Então eu posso simplesmente
jmp
parainet_pton
e deixe que o retorno direto para o chamador!Eu desenvolvi este programa de teste rápido para testar seus casos:
Monte com
nasm -felf64 assembly.asm
, compile comgcc -no-pie test.c assembly.o
e você obterá:Eu poderia fazer isso muito menor se o chamador passasse
AF_INET
ouAF_INET6
para a funçãofonte
e9 00 00 00 00
é umjmp near $+5
, não umjmp inet_pton
. Se você fornecer código de operação, você deve incluir o incluindoinet_pton
parte, não deixar um espaço em brancoJava (JDK) , 63 bytes
Experimente online!
Créditos
.1.1.1.1
.fonte
.1.2.3.4
Output: 0 or 1
e Java não tem bool- auto> intJavaScript (Node.js) , 43 bytes
Experimente online!
JavaScript (Node.js) , 46 bytes
Experimente online!
parte usada de Arnauld
JavaScript (Node.js) ,
545351 bytesExperimente online!
-2B para
0+t<256
, -1B de Patrick Stephansen, + 1B para evitar entrada1.1.1.1e-80
Solução RegExp
5854 bytesObrigado Deadcode por 3 bytes
fonte
0.0.0.0
. Tudo o resto parece funcionar bem.0.0.0.0
é aqui um verdadeiro. Por que a injeção de SQL está aqui?0.0.0.0
é realmente verdade. Que o golfe vontade minha resposta, bem .. (? E o que você quer dizer com injeção de SQL: S O link é TIO com casos de teste TODOS.)PHP ,
3936 bytesExperimente online!
275 se assemelha à constante
FILTER_VALIDATE_IP
5 ** 9 está sendo usado em vez da constante
FILTER_FLAG_IPV4
. Isso é suficiente, porque5**9 & FILTER_FLAG_IPV4
é verdade, que é exatamente o que o PHP faz em segundo plano, como Benoit Esnard apontou.Aqui,
filter_var
retorna o primeiro argumento, se for um endereço IPv4 válido, ou falso, se não for. Com+!!
, produzimos a saída exigida pelo desafio.fonte
5**9
vez de1048576
salvar 3 bytes aqui: o PHP usa&
para testar os sinalizadores IPv4 / IPv6 , portanto, qualquer número entre 1048576 e 2097151 é válido.PHP, 36 bytes
ip2long
é um conhecido embutido função .fonte
Perl 6 ,
222120 bytes-1 byte graças a Phil H.
Experimente online!
Explicação
fonte
%
modificador. Gostaria de saber se ele tenta verificar todas as256**4
possibilidades?<{^256}>
você pode simplesmente converter o intervalo em uma matriz@(^256)
para -1 char TIO . Ao alterar o bloco de código para uma matriz, ele também fica muito mais rápido (0,4s em vez de> 30).$(^256)
mas agora percebo por que isso não funcionou.05AB1E ,
2624232223 bytes-1 byte graças a @Emigna .
+1 byte para correção de erros de caso de teste
1.1.1.1E1
retornando incorretamente um resultado verdadeiro.Experimente online ou verifique todos os casos de teste .
Explicação:
fonte
Ā
vez de<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, e0.00.10.255
. : (PS Eu fixou o1.1.1.1E1
adicionando oþ
ao juntar-and-igual cheque.)DïþJsJQ
cheque ondeï
lançá-lo para int para remover 0s principais, eþ
só deixa dígitos remover coisas comoE
,-
, etc. :) A1š
é para o caso de teste0.00.10.255
, uma vez00010255
e0010255
seriam iguais.PowerShell,
595149 bytes-8 bytes, obrigado @AdmBorkBork
-2 bytes,
true
oufalse
permitido pelo autorScript de teste:
Saída:
Explicação:
O script tenta analisar uma sequência de argumentos, para construir um objeto .NET, IPAddress .
$true
seobject
criado e a sequência de argumentos é igual a uma representação de sequência doobject
(endereço normalizado porobject.toString()
)$false
caso contrárioPowerShell,
595654 bytes, 'não use uma lib .NET'-3 bytes,
true
oufalse
permitido pelo autor-2 bytes, graças a @ Deadcode pelo regexp legal.
Experimente online!
Obrigado @ Olivier Grégoire pela expressão regular original.
fonte
|% t*g
pois o PowerShell converterá automaticamente o lado direito-eq
como uma sequência, porque o lado esquerdo é uma sequência. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 bytes
Experimente online!
Funciona como código de 64 bits no TIO, mas provavelmente exige isso
sizeof(int) == sizeof(char*)
em outras plataformas.fonte
-m32
).s
como umchar*
(sem acesso a um sistema ILP32 aqui), e sim, eu estava me misturandoinet_aton()
.PHP 7+,
37.3532 bytesIsso usa a função interna
filter_var
para validar que é um endereço IPv4 .Para que funcione, você precisa passar a chave
i
sobre uma solicitação GET.Não produzirá nada (para um
falsy
resultado) ou o IP (para umtruthy
resultado), dependendo do resultado.Você pode tentar isso em:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Isso usa os seguintes valores diretamente:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Obrigado a Benoit Esnard por esta dica que me salvou 1 byte!
Obrigado a Titus por me lembrar das mudanças no desafio.
Eu olhei para usar a função
ip2long
, mas funciona com endereços IP não completos.Endereços IPv4 não completos são considerados inválidos neste desafio.
Se eles fossem permitidos, este seria o código final (apenas para o PHP 5.2.10):
Atualmente, não está explícito na documentação que isso parará de funcionar (quando passou um ip incompleto) com as versões mais recentes do PHP.
Após o teste, confirmou que era esse o caso.
Obrigado ao nwellnhof pela dica!
fonte
5**9
instead of1<<20
saves one byte here: PHP uses&
to test the IPv4 / IPv6 flags, so any number between 1048576 and 2097151 is valid.ip2long
doesn't allow incomplete addresses.+!!
is not required; the OP now accepts arbitrary truthy values.Python 3:
8178706966 bytesLoop over all possible IPv4 addresses, get the string representation and compare it to the input. It uh... takes a while to run.
EDIT: Removed 3 bytes by switching from full program to anonymous function.
EDIT2: Removed 8 bytes with help from xnor
EDIT3: Removed 1 byte by using an unpacked map instead of list comprehension
EDIT4: Removed 3 bytes by using list comprehension instead of the
ipaddress
modulefonte
[str(ip_address(x))for x in range(256**4)].count
. Also,256**4
can be16**8
.C# (Visual C# Interactive Compiler),
847965 bytesTry it online!
-5 and -14 bytes saved thanks to @dana!
# C# (Visual C# Interactive Compiler), 61 bytesTry it online!
This is a work in progress. The code use
System.Net
(+17 bytes if you count it). if you wonder why I count and parse:sourceAs @milk said in comment, it will indeed fail on leading zeroes. So, the 61 bytes one is not working.
fonte
Python 2,
85 8281 bytes-1 byte thanks to Kevin Cruijssen
Try it online!
113 byte answer is deleted as it fails for
1.1.1.1e-80
fonte
print 1*r
toprint~~r
. +1 though, since it seem to work for all possible test cases suggested thus far. PS: Your 113 byte answer fails for1.1.1.1e-80
.ipaddress
a Python 3 module?Japt,
1715 bytesTry it or run all test cases or verify additional test cases from challenge comments
Explanation
We split to an array on
.
, check that the length of that array is equal to4
AND that the length when all elements in the range["0","255"]
are removed from it is falsey (0
).fonte
Mathematica,
3931 bytesOriginal version:
Modified version (thanks to Misha Lavrov)
which returns
True
if the input is a valid IP address (try it).In case you insist on getting
1
and0
instead, then an additional 7 bytes would be necessary:fonte
Interpreter["IPAddress"]
returns a string for valid input, and some complicated failure object for invalid input, we can test for valid inputs withAtomQ[Interpreter["IPAddress"][#]]&
, which can be further shortened to the function compositionAtomQ@*Interpreter["IPAddress"]
. Try it online!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 bytes
Returns a Boolean value.
Try it online!
fonte
Python 2,
93896753 bytesTry it online!
Thanks to Dennis for shaving another 14 bytes on the internal comparisons and exit code.
Special thanks to Jonathan Allan for shaving 22 bytes & a logic fix! Pesky try/except begone!
Taking properly formatted strings instead of raw bytes shaves off 4 bytes, thanks Jo King.
fonte
i==`int(i)&255`
. Also, you can force an error with[...]!=[1]*4>_
, since you're using exit codes anyway. Try it online!>_
does. The bitwise and is quite ingenious though... I was unsuccessful in combining those myself.!=
returns False, Python short-circuits and nothing happens; the interpreter exits normally. If it returns True,>_
raises a NameError, because the variable_
is undefined.sfk, 176 bytes
* was originally Bash + SFK but TIO has since added a proper SFK wrapper
Try it online!
fonte
nc [addr] 1 -w1
shorten this?nc
accepts leading zeroes as well as IPv6 addresses, so I'd still have to handle those - and this is intended more as asfk
answer than a shell answer anyway.Python3Bash* 60*Also other shells. Any one for which the truthy/falsy test passes on a program exit code
Explanation
The trouble with a pure Python solutions is that a program crashing is considered indeterminate. We could use a "lot" of code to convert an exception into a proper truthy/fasly value. However, at some point the Python interpreter handles this uncaught exception and returns a non-zero exit code. For the low-low cost of changing languages to your favourite Unix shell, we can save quite a bit of code!
Of course, this is vulnerable to injection attacks... Inputs such as
1.1.1.1'); print('Doing Something Evil
are an unmitigated threat!fonte
ECMAScript pure regex, 41 bytes
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Try it online!
Try it on regex101
I think the logic in this regex speaks for itself, so I will merely pretty-print but not comment it:
This can be used to shave 2 bytes off the following other answers:
Here is an alternative version that allows leading zeros, but does so consistently (octets may be represented by a maximum of 3 decimal digits):
^((2(?!5?[6-9])|1|0?)\d\d?\.?\b){4}$
Or allow any number of leading zeros:
^(0*(2(?!5?[6-9])|1?)\d\d?\.?\b){4}$
fonte
\b
and\B
... it's smart!(?!0\d)
instead, but I like\B
better!\.?\b
saved me a byte on my answer too, thanks!Red, 106 bytes
Try it online!
Returnd
true
orfalse
Explanation:
fonte
Stax, 14 bytes
Run and debug it
Unpacked, ungolfed, and commented, it looks like this.
Run this one
fonte
Python 3,
10993 bytesExplanation
Each octet can be 0 - 255 :
An octet can end with a (.) or just end, with the condition that it cannot do both , the negative lookahead
(?!$)
takes care of this caseThanks @Zachary for making me realize I can discard spaces (since it is code golf)
Thanks @DLosc for the improvements and making me realize my mistake, its been corrected now.
fonte
x: re.match
=>x:re.match
;, x
=>,x
, and) is
=>)is
should save 3 bytes. Also, in the regex, you can use\d
for each occurrence of[0-9]
, and[1]
=>1
. This seems like a great first post, though![1-9][0-9]|[0-9]
can become[1-9]\d|\d
(per Zacharý's advice), which can become[1-9]?\d
. Also, instead of testingre.match(...)is not None
, you can dobool(re.match(...))
since match objects are truthy andNone
is falsey. :)1.2.3.4.5
(and also1.2.3.4.
, which isn't in the official list of test cases), because it can match a period instead of end-of-string after the fourth number.Bash, 30 bytes
Try it online!
fonte
echo $(($?))
part is not needed since programs are allowed to output their result via exit code.Charcoal,
4521 bytesTry it online! Link is to verbose version of code. Edit: Saved 24 bytes by porting @Shaggy's Japt answer. Explanation:
fonte
123.-50.0.12
or1.1.1.-80
. Everything else seems to work fine. So the<256
check should bein [0,255]
instead.Retina,
4644 bytesPort of @OlivierGrégoire's Java answer, so make sure to upvote him!
-2 bytes thanks to @Neil.
Try it online.
Explanation:
fonte
\d
group optimisation, so you can save two bytes because you don't need theM
specification on the last line.Jelly, 11 bytes
A monadic link accepting a list of characters which yields1 if it's a valid address and 0 otherwise. Builds a list of all 2564=4294967296 addresses and then counts the number of occurrences of the input therein.
Here's similar @ Try it online! that uses16 (256 (
⁴
) rather than⁹
), since the method is so inefficient!How?
fonte
Retina,
4241 bytesTry it online! Based on a previous version of @nwellnhof's Perl 6 answer, but 1 byte saved by stealing the
\.?\b
trick from @Deadcode's answer. Explanation:Clear the work area.
Insert 255 characters.
Generate the range 0..255 separated with
|
s, prefixed with^((
, and suffixed with)\.?\b){4}$
, thus building the regular expression^((0|1|...255)\.?\b){4}$
.Evaluate that on the original input.
fonte
Pip,
2516 bytesTakes the candidate IP address as a command-line argument. Try it online! or Verify all test cases
Explanation
Regex solution, essentially a port of recursive's Stax answer.
fonte
JavaScript, 89 bytes
Try it online!
Create
RegExp
capture groups from indexes of an array havinglength
256
for range0-255
joined with|
and followed by escaped.
character (^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$
) repeated3
times closing with joined array followed by$
to match end of string, returntrue
orfalse
result of input passed toRegExp.prototype.test()
.fonte