Votre outil d'analyse de réseau est particulièrement difficile à saisir et se bloque immédiatement si vous lui fournissez une adresse IPv4 qui contient des caractères incorrects ou n'est pas correctement formatée.
Une adresse IPv4 est une adresse numérique 32 bits écrite en quatre nombres séparés par des points. Chaque nombre peut être compris entre zéro et 255 .
Nous devons écrire un outil pour pré-valider l'entrée pour éviter ces plantages, et notre outil spécifique est difficile: un format valide ressemblera à l' a.b.c.d
endroit où a, b, c et d:
- Peut être un
0
ou un nombre naturel sans zéros non significatifs . - Doit être compris entre 0 et 255 (inclus).
- Devrait pas contenir des symboles spéciaux comme
+
,-
,,
et d' autres. - Doit être décimal (base
10
)
Entrée : une chaîne
Sortie : valeur Truthy ou Falsey (valeurs arbitraires également acceptées)
Cas de test :
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)
Il s'agit de code-golf , donc le moins d'octets gagnera!
Remarque pour les utilisateurs - si vous souhaitez ajouter d'autres cas de test, vous êtes les bienvenus (en suggérant une modification). Mais assurez-vous que les cas de test ne se répètent pas! Merci
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
.Réponses:
Code machine X86_64:
1816 octetsEdit: Cette réponse ne fonctionne pas tout à fait, car
inet_pton
des bibliothèques C standard, ce qui signifie que j'ai besoin de l'extern. Je n'ai cependant pas inclus l'extern dans mon nombre d'octets.Et oui, le tout se fait à peu près par une fonction déjà écrite
Quoi qu'il en soit, c'est ce que j'ai obtenu:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Assemblée:
Explication:
Jetez un oeil à
inet_pton(3)
. Il prend une adresse IP de chaîne et la place dans un tampon que vous pouvez utiliser avecstruct sockaddr
. Il prend 3 arguments: la famille d'adresses (AF_INET
(ipv4), 2 ouAF_INET6
(ipv6), 10), la chaîne de l'adresse ip et un pointeur vers la sortie. Il renvoie 1 en cas de succès, 0 pour une adresse non valide ou -1 pour lorsque la famille d'adresses n'est ni l'unAF_INET
ni l'autreAF_INET6
(ce qui ne se produira jamais car je lui passe une constante).Je déplace donc simplement la chaîne vers le registre pour le deuxième argument, je mets le premier registre à 2 et je mets le troisième registre dans la zone rouge (128 octets en dessous du pointeur de pile) car je me fiche du résultat. Ensuite , je peux tout simplement
jmp
pourinet_pton
et laisser que le retour directement à l'appelant!J'ai fait tourner ce programme de test rapide pour tester vos cas:
Assemblez avec
nasm -felf64 assembly.asm
, compilez avecgcc -no-pie test.c assembly.o
, et vous obtiendrez:Je pourrais rendre cela beaucoup plus petit si l'appelant devait passer
AF_INET
ouAF_INET6
à la fonctionla source
e9 00 00 00 00
est unjmp near $+5
, pas unjmp inet_pton
. Si vous fournissez un opcode, vous devez inclure lainet_pton
partie incluse , ne pas laisser de blancJava (JDK) , 63 octets
Essayez-le en ligne!
Crédits
.1.1.1.1
.la source
.1.2.3.4
Output: 0 or 1
et Java n'a pas d'auto bool-> intJavaScript (Node.js) , 43 octets
Essayez-le en ligne!
JavaScript (Node.js) , 46 octets
Essayez-le en ligne!
utilisé la partie d'Arnauld
JavaScript (Node.js) ,
545351 octetsEssayez-le en ligne!
-2B pour
0+t<256
, -1B de Patrick Stephansen, + 1B pour éviter l'entrée1.1.1.1e-80
Solution RegExp
5854 octetsMerci Deadcode pour 3 octets
la source
0.0.0.0
. Tout le reste semble bien fonctionner.0.0.0.0
est ici vrai. Pourquoi l'injection SQL est là?0.0.0.0
est en effet véridique. Cela répondra aussi à ma réponse .. (Et que voulez-vous dire par injection SQL?: S Le lien est vers TIO avec TOUS les cas de test.)PHP ,
3936 octetsEssayez-le en ligne!
275 ressemble à la constante
FILTER_VALIDATE_IP
5 ** 9 est utilisé à la place de la constante
FILTER_FLAG_IPV4
. C'est suffisant, car5**9 & FILTER_FLAG_IPV4
c'est vrai, c'est exactement ce que fait PHP en arrière-plan, comme l'a souligné Benoit Esnard.Ici,
filter_var
renvoie le premier argument, s'il s'agit d'une adresse IPv4 valide, ou faux s'il ne l'est pas. Avec+!!
, nous produisons la sortie requise par le défi.la source
5**9
au lieu d'1048576
enregistrer 3 octets ici: PHP utilise&
pour tester les drapeaux IPv4 / IPv6 , donc tout nombre compris entre 1048576 et 2097151 est valide.PHP, 36 octets
ip2long
est une fonction intégrée bien connue .la source
Perl 6 ,
222120 octets-1 octet grâce à Phil H.
Essayez-le en ligne!
Explication
la source
%
modificateur existait. Je me demande s'il essaie de vérifier toutes les256**4
possibilités?<{^256}>
vous, vous pouvez simplement convertir la plage en un tableau@(^256)
pour -1 caractère TIO . En changeant le bloc de code en un tableau, cela devient également beaucoup plus rapide (0,4 s au lieu de> 30).$(^256)
mais maintenant je comprends pourquoi cela n'a pas fonctionné.05AB1E ,
2624232223 octets-1 octet grâce à @Emigna .
+1 octet pour le cas de test de correction de bogue
1.1.1.1E1
renvoyant incorrectement un résultat véridique.Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Ā
place de<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
et0.00.10.255
. (PS: j'ai corrigé le1.1.1.1E1
þ
DïþJsJQ
chèque oùï
jeter aux int pour enlever grands 0s, etþ
que les feuilles chiffres des choses comme la suppressionE
,-
etc. :) Le1š
est pour le cas de test0.00.10.255
, puisque00010255
et0010255
serait égale.PowerShell,
595149 octets-8 octets, merci @AdmBorkBork
-2 octets,
true
oufalse
autorisé par l'auteurScript de test:
Sortie:
Explication:
Le script essaie d'analyser une chaîne d'arguments pour construire un objet .NET, IPAddress .
$true
siobject
créé et l'argument chaîne est égal à une représentation sous forme de chaîne deobject
(adresse normalisée parobject.toString()
)$false
autrementPowerShell,
595654 octets, 'n'utilisez pas d'alternative .NET lib'-3 octets,
true
oufalse
autorisé par l'auteur-2 octets, merci à @ Deadcode pour la regexp cool.
Essayez-le en ligne!
Merci @ Olivier Grégoire pour l'expression régulière originale.
la source
|% t*g
car PowerShell convertira automatiquement le côté droit de-eq
sous forme de chaîne, car le côté gauche est une chaîne. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 octets
Essayez-le en ligne!
Fonctionne comme du code 64 bits sur TIO mais nécessite probablement cela
sizeof(int) == sizeof(char*)
sur d'autres plateformes.la source
-m32
).s
commechar*
(pas d'accès à un système ILP32 ici), et oui, je me mélangeais avecinet_aton()
.PHP 7+,
373532 octetsCela utilise la fonction intégrée
filter_var
, pour valider qu'il s'agit d'une adresse IPv4 .Pour que cela fonctionne, vous devez passer la clé
i
sur une demande GET.Ne produira rien (pour un
falsy
résultat) ou l'IP (pour untruthy
résultat), selon le résultat.Vous pouvez essayer ceci sur:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Cela utilise directement les valeurs suivantes:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Merci à Benoit Esnard pour cette astuce qui m'a fait économiser 1 octet!
Merci à Titus de m'avoir rappelé les changements apportés au défi.
J'ai cherché à utiliser la fonction
ip2long
, mais elle fonctionne avec des adresses IP non complètes.Les adresses IPv4 non complètes sont considérées comme non valides dans ce défi.
S'ils étaient autorisés, ce serait le code final (uniquement pour PHP 5.2.10):
Actuellement, il n'est pas explicite dans la documentation que cela cessera de fonctionner (en cas de passage d'une adresse IP incomplète) avec les versions PHP plus récentes.
Après les tests, a confirmé que c'était le cas.
Merci à nwellnhof pour le conseil!
la source
5**9
au lieu d'1<<20
enregistrer un octet ici: PHP utilise&
pour tester les drapeaux IPv4 / IPv6 , donc tout nombre compris entre 1048576 et 2097151 est valide.ip2long
n'autorise pas les adresses incomplètes.+!!
n'est pas requis; le PO accepte désormais des valeurs de vérité arbitraires.Python 3:
8178706966 octetsParcourez toutes les adresses IPv4 possibles, obtenez la représentation sous forme de chaîne et comparez-la à l'entrée. Ça prend du temps à courir.
EDIT: Suppression de 3 octets en passant du programme complet à la fonction anonyme.
EDIT2: Suppression de 8 octets avec l'aide de xnor
EDIT3: Suppression de 1 octet en utilisant une carte décompressée au lieu de la compréhension de la liste
EDIT4: Suppression de 3 octets en utilisant la compréhension de liste au lieu du
ipaddress
modulela source
[str(ip_address(x))for x in range(256**4)].count
. , Aussi256**4
peut être16**8
.C # (Visual C # Interactive Compiler) ,
847965 octetsEssayez-le en ligne!
-5 et -14 octets enregistrés grâce à @dana!
# C # (Visual C # Interactive Compiler) , 61 octetsEssayez-le en ligne!
Ceci est un travail en cours de réalisation. Le code utilise
System.Net
(+17 octets si vous le comptez). si vous vous demandez pourquoi je compte et analyse:la sourceComme l'a dit @milk en commentaire, il échouera en effet sur les zéros non significatifs. Ainsi, le 61 octets ne fonctionne pas.
la source
Python 2 ,
85 8281 octets-1 octet grâce à Kevin Cruijssen
Essayez-le en ligne!
La réponse à 113 octets est supprimée car elle échoue pour
1.1.1.1e-80
la source
print 1*r
au golfprint~~r
. +1 cependant, car il semble fonctionner pour tous les cas de test possibles suggérés jusqu'à présent . PS: Votre réponse de 113 octets échoue1.1.1.1e-80
.ipaddress
un module Python 3?Japt,
1715 octetsEssayez-le ou exécutez tous les cas de test ou vérifiez des cas de test supplémentaires à partir des commentaires de défi
Explication
Nous divisons en un tableau activé
.
, vérifions que la longueur de ce tableau est égale à4
ET que la longueur lorsque tous les éléments de la plage en["0","255"]
sont supprimés est falsey (0
).la source
Mathematica,
3931 octetsVersion originale:
Version modifiée (merci à Misha Lavrov)
qui retourne
True
si l'entrée est une adresse IP valide ( essayez-la ).Au cas où vous insisteriez pour obtenir
1
et à la0
place, 7 octets supplémentaires seraient nécessaires:la source
Interpreter["IPAddress"]
renvoie une chaîne pour une entrée valide et un objet d'échec compliqué pour une entrée non valide, nous pouvons tester les entrées valides avecAtomQ[Interpreter["IPAddress"][#]]&
, qui peuvent être encore raccourcies à la composition de la fonctionAtomQ@*Interpreter["IPAddress"]
. Essayez-le en ligne!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 octets
Renvoie une valeur booléenne.
Essayez-le en ligne!
la source
Python 2,
93896753 octetsEssayez-le en ligne!
Merci à Dennis d'avoir rasé encore 14 octets sur les comparaisons internes et le code de sortie.
Un merci spécial à Jonathan Allan pour le rasage de 22 octets et un correctif logique! Pesky essayer / sauf Begone!
Prendre des chaînes correctement formatées au lieu d'octets bruts rase 4 octets, merci Jo King.
la source
i==`int(i)&255`
. En outre, vous pouvez forcer une erreur avec[...]!=[1]*4>_
, car vous utilisez quand même des codes de sortie. Essayez-le en ligne!>_
fait. Le bit à bit et est assez ingénieux cependant ... Je n'ai pas réussi à les combiner moi-même.!=
renvoie False, Python court-circuite et rien ne se passe; l'interprète sort normalement. S'il renvoie True,>_
déclenche une erreur NameError, car la variable_
n'est pas définie.sfk , 176 octets
* était à l'origine Bash + SFK mais TIO a depuis ajouté un wrapper SFK approprié
Essayez-le en ligne!
la source
nc [addr] 1 -w1
raccourcie?nc
accepte les zéros de tête ainsi que les adresses IPv6, donc je devrais encore les gérer - et cela est plus destiné à unesfk
réponse qu'à une réponse shell de toute façon.Python3Bash * 60* Aussi d'autres coquilles. Toute personne pour laquelle le test de vérité / fausse passe sur un code de sortie de programme
Explication
Le problème avec une solution Python pure est qu'un crash de programme est considéré comme indéterminé. Nous pourrions utiliser un "lot" de code pour convertir une exception en une valeur vraie / fasly appropriée. Cependant, à un moment donné, l'interpréteur Python gère cette exception non interceptée et retourne un code de sortie non nul. Pour le faible coût de changement de langue vers votre shell Unix préféré, nous pouvons enregistrer un peu de code!
Bien sûr, cela est vulnérable aux attaques par injection ... Des entrées telles que
1.1.1.1'); print('Doing Something Evil
sont une menace non atténuée!la source
ECMAScript regex pur, 41 octets
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Essayez-le en ligne!
Essayez-le sur regex101
Je pense que la logique de ce regex parle d'elle-même, donc je vais simplement faire une jolie impression mais pas le commenter:
Cela peut être utilisé pour raser 2 octets des autres réponses suivantes:
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}$
la source
\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:
la source
Stax, 14 bytes
Run and debug it
Unpacked, ungolfed, and commented, it looks like this.
Run this one
la source
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.
la source
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!
la source
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:
la source
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:
la source
\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?
la source
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.
la source
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.
la source
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()
.la source