Ihr Netzwerk-Scan-Tool ist bei Eingaben ärgerlich wählerisch und stürzt sofort ab, wenn Sie eine IPv4-Adresse eingeben, die unzulässige Zeichen enthält oder nicht richtig formatiert ist.
Eine IPv4-Adresse ist eine numerische 32-Bit-Adresse, die als vier durch Punkte getrennte Zahlen geschrieben wird. Jede Zahl kann zwischen Null und 255 liegen .
Wir müssen ein Tool schreiben, um die Eingabe vorab zu validieren , um diese Abstürze zu vermeiden, und unser spezielles Tool ist wählerisch: Ein gültiges Format sieht wie folgt aus: a.b.c.d
a, b, c und d:
- Kann eine
0
oder eine natürliche Zahl ohne führende Nullen sein . - Sollte zwischen 0 und 255 (einschließlich) liegen.
- Sollte nicht enthalten spezielle Symbole wie
+
,-
,,
und andere. - Sollte dezimal sein (Basis
10
)
Eingabe : Eine Zeichenfolge
Ausgabe : Wahrheitswert oder falscher Wert (beliebige Werte werden ebenfalls akzeptiert)
Testfälle :
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)
Dies ist Code-Golf , so dass nur wenige Bytes gewinnen!
Hinweis für die Benutzer - Wenn Sie weitere Testfälle hinzufügen möchten, werden Sie begrüßt (indem Sie eine Bearbeitung vorschlagen). Achten Sie jedoch darauf, dass sich die Testfälle nicht wiederholen! Vielen Dank
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
.Antworten:
X86_64-Maschinencode:
1816 BytesBearbeiten: Diese Antwort funktioniert nicht ganz so
inet_pton
aus dem Standard C-Bibliotheken, was bedeutet, ich brauche die extern. Ich habe das Extern nicht in meine Byteanzahl aufgenommen.Und ja, das Ganze wird so ziemlich von einer bereits geschriebenen Funktion erledigt
Wie auch immer, das habe ich bekommen:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Versammlung:
Erläuterung:
Schauen Sie sich an
inet_pton(3)
. Es nimmt eine Zeichenfolge-IP-Adresse und legt sie in einem Puffer ab, den Sie verwenden könnenstruct sockaddr
. Es werden 3 Argumente benötigt: Die Adressfamilie (AF_INET
(ipv4), 2 oderAF_INET6
(ipv6), 10), die Zeichenfolge der IP-Adresse und ein Zeiger auf die Ausgabe. Bei Erfolg wird 1 zurückgegeben, 0 für eine ungültige Adresse oder -1, wenn die Adressfamilie keines von beiden istAF_INET
oderAF_INET6
(was niemals vorkommt, weil ich eine Konstante an sie übergebe).Also verschiebe ich einfach die Zeichenkette in das Register für das zweite Argument, setze das erste Register auf 2 und setze das dritte Register auf die rote Zone (128 Bytes unter dem Stapelzeiger), da mir das Ergebnis egal ist. Dann kann ich einfach
jmp
dazuinet_pton
und das direkt zum Anrufer zurückkehren lassen!Ich habe dieses Schnelltestprogramm gestartet, um Ihre Fälle zu testen:
Zusammenstellen mit
nasm -felf64 assembly.asm
, Kompilieren mitgcc -no-pie test.c assembly.o
und Sie erhalten:Ich könnte das viel kleiner machen, wenn der Anrufer
AF_INET
oderAF_INET6
die Funktion übergeben solltequelle
e9 00 00 00 00
ist ajmp near $+5
, nicht ajmp inet_pton
. Wenn Sie einen Opcodeinet_pton
Java (JDK) , 63 Byte
Probieren Sie es online!
Credits
.1.1.1.1
.quelle
.1.2.3.4
Output: 0 or 1
und Java hat kein Auto bool-> intJavaScript (Node.js) , 43 Byte
Probieren Sie es online!
JavaScript (Node.js) , 46 Byte
Probieren Sie es online!
benutzte Arnauld's Rolle
JavaScript (Node.js) ,
545351 BytesProbieren Sie es online!
-2B für
0+t<256
, -1B von Patrick Stephansen, + 1B, um Eingaben zu vermeiden1.1.1.1e-80
RegExp Lösung
5854 BytesVielen Deadcode für 3 Bytes
quelle
0.0.0.0
. Alles andere scheint gut zu funktionieren.0.0.0.0
ist hier wahr. Warum ist SQL Injection hier?0.0.0.0
ist in der Tat wahr. Das ist auch meine Antwort. (Und was meinen Sie mit SQL-Injection?)PHP ,
3936 BytesProbieren Sie es online!
275 ähnelt der Konstante
FILTER_VALIDATE_IP
5 ** 9 wird anstelle der Konstante verwendet
FILTER_FLAG_IPV4
. Dies ist ausreichend, weil5**9 & FILTER_FLAG_IPV4
es wahr ist, und genau das tut PHP im Hintergrund, wie Benoit Esnard betonte.Hier wird
filter_var
das erste Argument zurückgegeben, wenn es eine gültige IPv4-Adresse ist, oder false, wenn dies nicht der Fall ist. Mit+!!
erzeugen wir die Leistung, die für die Herausforderung erforderlich ist.quelle
5**9
statt1048576
hier 3 Byte zu speichern: PHP verwendet&
, um die IPv4 / IPv6-Flags zu testen , sodass jede Zahl zwischen 1048576 und 2097151 gültig ist.PHP, 36 Bytes
ip2long
ist eine bekannte eingebaute Funktion .quelle
Perl 6 ,
222120 Bytes-1 Byte dank Phil H.
Probieren Sie es online!
Erläuterung
quelle
%
Modifikator existiert. Ich frage mich, ob es versucht, alle256**4
Möglichkeiten zu überprüfen ?<{^256}>
können Sie den Bereich einfach in ein Array@(^256)
für -1 char TIO konvertieren . Durch die Änderung des Codeblocks in ein Array wird es auch enorm schneller (0,4s statt> 30).$(^256)
aber jetzt merke ich, warum das nicht funktioniert hat.05AB1E ,
2624232223 Byte-1 Byte dank @Emigna .
+1 Byte für den Bugfixing-Testfall, der
1.1.1.1E1
fälschlicherweise ein wahres Ergebnis zurückgibt.Probieren Sie es online aus oder überprüfen Sie alle Testfälle .
Erläuterung:
quelle
Ā
anstelle von<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, und0.00.10.255
. (PS: Ich habe das1.1.1.1E1
þ
DïþJsJQ
Scheck , woï
es zu gieße entfernen führenden 0s in int, undþ
nur Ziffern Blätter zu entfernen Dinge wieE
,-
etc. :) Die1š
für Testfall ist0.00.10.255
, da00010255
und0010255
gleich sein würden.PowerShell,
595149 Byte-8 Bytes, danke @AdmBorkBork
-2 Bytes
true
oderfalse
vom Autor erlaubtTestskript:
Ausgabe:
Erläuterung:
Das Skript versucht, eine Argumentzeichenfolge zu analysieren, um das .NET-Objekt IPAddress zu erstellen .
$true
wennobject
erstellt, und das Argument string entspricht einer Stringdarstellung derobject
(normalisierten Adresse vonobject.toString()
)$false
sonst zurückPowerShell,
595654 Byte, Alternative 'Keine .NET-Lib verwenden'-3 Bytes
true
oderfalse
vom Autor erlaubt-2 Bytes, danke an @ Deadcode für den coolen regulären Ausdruck.
Probieren Sie es online!
Vielen Dank an Olivier Grégoire für den ursprünglichen regulären Ausdruck.
quelle
|% t*g
da PowerShell die rechte Seite automatisch-eq
als Zeichenfolge umwandelt, da die linke Seite eine Zeichenfolge ist. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 Bytes
Probieren Sie es online!
Funktioniert unter TIO als 64-Bit-Code, erfordert dies jedoch wahrscheinlich
sizeof(int) == sizeof(char*)
auf anderen Plattformen.quelle
-m32
).s
alschar*
(kein Zugriff auf ein ILP32-System hier) übergeben habe, und ja, ich habe mich damit eingelasseninet_aton()
.PHP 7+,
373532 BytesHierbei wird mithilfe der integrierten Funktion überprüft
filter_var
, ob es sich um eine IPv4-Adresse handelt .Damit dies funktioniert, müssen Sie den Schlüssel
i
über eine GET-Anforderung übergeben.Gibt je nach Ergebnis nichts (für ein
falsy
Ergebnis) oder die IP (für eintruthy
Ergebnis) aus.Sie können dies anprobieren:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Dabei werden die folgenden Werte direkt verwendet:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Vielen Dank an Benoit Esnard für diesen Tipp, der mir 1 Byte erspart hat!
Vielen Dank an Titus , der mich an die Änderungen der Herausforderung erinnert hat.
Ich habe die Verwendung der Funktion in Betracht gezogen
ip2long
, aber sie funktioniert mit nicht vollständigen IP-Adressen.Nicht vollständige IPv4-Adressen gelten bei dieser Herausforderung als ungültig.
Wenn sie erlaubt wären, wäre dies der endgültige Code (nur für PHP 5.2.10):
Derzeit wird in der Dokumentation nicht ausdrücklich darauf hingewiesen, dass dies mit neueren PHP-Versionen nicht mehr funktioniert (wenn eine unvollständige IP-Adresse übergeben wird).
Nach dem Testen bestätigte sich, dass dies der Fall war.
Danke an nwellnhof für den Tipp!
quelle
5**9
statt1<<20
hier ein Byte zu speichern: PHP&
testet die IPv4 / IPv6-Flags , sodass jede Zahl zwischen 1048576 und 2097151 gültig ist.ip2long
keine unvollständigen Adressen.+!!
ist nicht nötig; Das OP akzeptiert nun beliebige Wahrheitswerte.Python 3:
8178706966 BytesDurchlaufen Sie alle möglichen IPv4-Adressen, rufen Sie die Zeichenfolgendarstellung ab und vergleichen Sie sie mit der Eingabe. Es dauert eine Weile zu rennen.
BEARBEITEN: 3 Bytes wurden entfernt, indem von der vollständigen Programmfunktion zur anonymen Funktion gewechselt wurde.
EDIT2: 8 Bytes mit Hilfe von xnor entfernt
EDIT3: 1 Byte wurde entfernt, indem eine entpackte Map anstelle des Listenverständnisses verwendet wurde
EDIT4: 3 Bytes wurden entfernt, indem das Listenverständnis anstelle des
ipaddress
Moduls verwendet wurdequelle
[str(ip_address(x))for x in range(256**4)].count
. Auch256**4
kann16**8
.C # (Visual C # Interactive Compiler) ,
847965 ByteProbieren Sie es online!
-5 und -14 Bytes gespart dank @dana!
# C # (Visual C # Interactive Compiler) , 61 ByteProbieren Sie es online!
Dies ist eine laufende Arbeit. Der Code verwenden
System.Net
(+17 Bytes, wenn Sie es zählen). Wenn Sie sich fragen, warum ich zähle und analysiere:QuelleWie @milk im Kommentar sagte, wird es in der Tat bei führenden Nullen scheitern. Die 61 Bytes funktionieren also nicht.
quelle
Python 2 ,
85 8281 Bytes-1 Byte dank Kevin Cruijssen
Probieren Sie es online!
Die 113-Byte-Antwort wird gelöscht, da dies fehlschlägt
1.1.1.1e-80
quelle
print 1*r
aufprint~~r
. +1 obwohl, da es für alle möglichen bisher vorgeschlagenen Testfälle zu funktionieren scheint . PS: Ihre 113-Byte-Antwort schlägt fehl1.1.1.1e-80
.ipaddress
ein Python 3-Modul?Japt,
1715 BytesProbieren Sie es aus oder führen Sie alle Testfälle aus oder überprüfen Sie zusätzliche Testfälle anhand von Challenge-Kommentaren
Erläuterung
Wir teilen uns in ein Array auf
.
, stellen sicher, dass die Länge dieses Arrays gleich ist4
UND dass die Länge, wenn alle Elemente im Bereich["0","255"]
entfernt werden, falsch ist (0
).quelle
Mathematica,
3931 BytesOriginalfassung:
Modifizierte Version (danke an Misha Lavrov)
die zurückgibt,
True
wenn die Eingabe eine gültige IP-Adresse ist ( versuchen Sie es ).Wenn Sie darauf bestehen,
1
und0
stattdessen zu erhalten, wären zusätzliche 7 Byte erforderlich:quelle
Interpreter["IPAddress"]
eine Zeichenfolge für eine gültige Eingabe und ein kompliziertes Fehlerobjekt für eine ungültige Eingabe zurückgegeben wird, können wir mit auf gültige Eingaben testenAtomQ[Interpreter["IPAddress"][#]]&
, die auf die Funktionszusammensetzung weiter verkürzt werden könnenAtomQ@*Interpreter["IPAddress"]
. Probieren Sie es online!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 Byte
Gibt einen Booleschen Wert zurück.
Probieren Sie es online!
quelle
Python 2,
93896753 BytesProbieren Sie es online!
Vielen Dank an Dennis für die weiteren 14 Bytes beim internen Vergleich und beim Exit-Code.
Besonderer Dank geht an Jonathan Allan für das Rasieren von 22 Bytes und eine logische Korrektur! Lästiger versuch / ausser begone!
Wenn Sie korrekt formatierte Zeichenfolgen anstelle von unformatierten Bytes verwenden, werden 4 Bytes gespart, danke Jo King.
quelle
i==`int(i)&255`
. Sie können auch einen Fehler mit erzwingen[...]!=[1]*4>_
, da Sie ohnehin Exit-Codes verwenden. Probieren Sie es online!>_
tut. Das Bitweise und ist allerdings ziemlich genial ... Ich war erfolglos darin, diese selbst zu kombinieren.!=
False zurückgegeben wird, schließt Python kurz und es passiert nichts. Der Interpreter wird normal beendet. Wenn True zurückgegeben wird, wird>_
ein NameError ausgelöst, da die Variable nicht_
definiert ist.SFK , 176 Bytes
* war ursprünglich Bash + SFK, aber TIO hat seitdem einen richtigen SFK-Wrapper hinzugefügt
Probieren Sie es online!
quelle
nc [addr] 1 -w1
abkürzen?nc
akzeptiert führende Nullen sowie IPv6-Adressen, sodass ich diese noch verarbeiten muss - und dies istsfk
sowieso eher als Antwort als als Shell-Antwort gedacht .Python3Bash * 60* Auch andere Muscheln. Jeder, für den der Truthy / Falsy- Test einen Programm-Exit-Code weitergibt
Erläuterung
Das Problem mit einer reinen Python-Lösung ist, dass ein Programmabsturz als unbestimmt gilt. Wir könnten eine "Menge" Code verwenden, um eine Ausnahme in einen richtigen Wahrheitswert umzuwandeln. Irgendwann behandelt der Python-Interpreter diese nicht erfasste Ausnahme und gibt einen Exit-Code ungleich Null zurück. Um die Kosten für das Ändern der Sprache in Ihre bevorzugte Unix-Shell möglichst gering zu halten, können wir eine ganze Menge Code sparen!
Natürlich ist dies anfällig für Injektionsangriffe ... Eingaben wie
1.1.1.1'); print('Doing Something Evil
sind eine uneingeschränkte Bedrohung!quelle
ECMAScript reiner regulärer Ausdruck, 41 Bytes
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Probieren Sie es online!
Probiere es auf regex101 aus
Ich denke, die Logik in diesem Regex spricht für sich selbst, also werde ich es nur hübsch drucken, aber nicht kommentieren:
Dies kann verwendet werden, um 2 Bytes von den folgenden anderen Antworten zu sparen:
Hier ist eine alternative Version, die führende Nullen zulässt, dies jedoch konsistent tut (Oktette können durch maximal 3 Dezimalstellen dargestellt werden):
^((2(?!5?[6-9])|1|0?)\d\d?\.?\b){4}$
Oder erlauben Sie eine beliebige Anzahl von führenden Nullen:
^(0*(2(?!5?[6-9])|1?)\d\d?\.?\b){4}$
quelle
\b
und\B
... es ist schlau!(?!0\d)
stattdessen benutzen können, aber es gefällt mir\B
besser!\.?\b
hat mir auch bei meiner Antwort ein Byte erspart, danke!Rot , 106 Bytes
Probieren Sie es online!
Rückkehr
true
oderfalse
Erläuterung:
quelle
Stax , 14 Bytes
Führen Sie es aus und debuggen Sie es
Ausgepackt, ungolfed und kommentiert sieht es so aus.
Führen Sie dieses aus
quelle
Python 3,
10993 BytesErläuterung
Jedes Oktett kann 0 - 255 sein:
Ein Oktett kann mit einem (.) Enden oder einfach enden, vorausgesetzt, es kann nicht beides, der negative Lookahead
(?!$)
kümmert sich um diesen FallVielen Dank an @Zachary , der mir klar gemacht hat, dass ich Leerzeichen verwerfen kann (da es sich um Code-Golf handelt).
Vielen Dank an @DLosc für die Verbesserungen und dafür, dass ich meinen Fehler erkannt habe, der jetzt korrigiert wurde.
quelle
x: re.match
=>x:re.match
;, x
=>,x
und) is
=>)is
sollten 3 Bytes speichern. Außerdem können Sie im regulären Ausdruck\d
für jedes Vorkommen von[0-9]
und[1]
=> verwenden1
. Dies scheint jedoch ein großartiger erster Beitrag zu sein![1-9][0-9]|[0-9]
werden kann[1-9]\d|\d
(nach Zacharýs Rat), was werden kann[1-9]?\d
. Auch anstatt zu testenre.match(...)is not None
, können Sie dies auch tun,bool(re.match(...))
da Übereinstimmungsobjekte wahr undNone
falsch sind. :)1.2.3.4.5
(und auch1.2.3.4.
nicht in der offiziellen Liste der Testfälle) fehl , da nach der vierten Zahl ein Punkt anstelle des Zeichenfolgenendes gefunden werden kann.Bash , 30 Bytes
Probieren Sie es online!
quelle
echo $(($?))
Teil wird nicht benötigt, da Programme ihr Ergebnis über den Exit-Code ausgeben dürfen .Holzkohle ,
4521 BytesProbieren Sie es online!Link ist eine ausführliche Version des Codes. Bearbeiten: 24 Byte durch Portierung von @ Shaggys Japt-Antwort gespeichert. Erläuterung:
quelle
123.-50.0.12
oder fehl1.1.1.-80
. Alles andere scheint gut zu funktionieren. Also sollte der<256
Scheckin [0,255]
stattdessen sein.Netzhaut ,
4644 BytesHafen von @ OlivierGrégoire ‚s Java Antwort , so stellensicherihn zu upvote!
-2 Bytes dank @Neil .
Probieren Sie es online aus .
Erläuterung:
quelle
\d
Gruppenoptimierung, sodass Sie zwei Bytes sparen können, weil Sie dieM
Angabe auf der nicht benötigen letzte Linie.Jelly , 11 Bytes
Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die sich ergibt1 wenn es eine gültige Adresse ist und 0 Andernfalls. Erstellt eine Liste aller2564= 4294967296 adressiert und zählt dann die Anzahl der Vorkommen der Eingabe darin.
Hier ist es ähnlich @ Probieren Sie es online! das nutzt16 ( 256 (
⁴
) statt⁹
), da die Methode so ineffizient ist!Wie?
quelle
Retina ,
4241 BytesProbieren Sie es online! Basierend auf einer früheren Version von @ nwellnhofs Perl 6-Antwort, aber 1 Byte gespart, indem der
\.?\b
Trick aus @ Deadcodes Antwort gestohlen wurde. Erläuterung:Arbeitsbereich räumen.
Fügen Sie 255 Zeichen ein.
Generieren Sie den Bereich 0..255, der durch
|
s getrennt, mit dem Präfix^((
und mit dem Suffix versehen ist)\.?\b){4}$
, um so den regulären Ausdruck zu erstellen^((0|1|...255)\.?\b){4}$
.Bewerten Sie das auf der ursprünglichen Eingabe.
quelle
Pip ,
2516 BytesNimmt die Kandidaten-IP-Adresse als Befehlszeilenargument. Probieren Sie es online! oder Überprüfen Sie alle Testfälle
Erläuterung
Regex-Lösung, im Wesentlichen eine Portierung der rekursiven Stax-Antwort .
quelle
JavaScript, 89 Bytes
Probieren Sie es online!
Erstellen
RegExp
capture Gruppen von Indizes eines Arrays mitlength
256
für Bereich0-255
verbunden mit|
und gefolgt von entkommen.
Zeichen (^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$
) wiederholte3
Male mit verbundenen Array Schließen gefolgt von$
zum Spiel Ende der Zeichenkette, Rückkehrtrue
oderfalse
aufgrund der Eingaben überRegExp.prototype.test()
.quelle