IP-Adresse oder nicht?

25

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.da, b, c und d:

  • Kann eine 0oder 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 , 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

rv7
quelle
10
Vorschlagen Testfälle: 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.
Dienstag,
5
Fügen Sie die Testfälle "1.2.3.4.5" (um zu lange IPs auszuschließen) und "999.0.0.0" (um zu große IPs auszuschließen) hinzu.
Triggernometrie
5
Möglicherweise etwas wählerisch, aber Sie sollten sich wahrscheinlich eher auf "IPv4-Adressen" als auf "IP-Adressen" beziehen - oder zumindest irgendwo erwähnen, dass Sie nur IPv4-Adressen meinen - ansonsten sollte 1234: 5678 :: 1 eine gültige IP-Adresse sein (wohingegen Aus der Beschreibung ist klar, dass das nicht beabsichtigt ist :)
Psmears
3
@Criggie Die Prämisse nicht, ist eigentlich alle zu überprüfen echte IP4 Regeln (wie die , die Sie erwähnt haben ), ist es, sicherzustellen , dass die Eingabezeichenfolge nicht einige andere nicht abstürzen (vermutlich schlecht geschrieben) app , dass nur Eingang in einer ganz bestimmten Form erlaubt . Wir werden auch nicht die Regeln einer Herausforderung ändern, die bereits über 30 Antworten hat.
BradC
2
@Criggie Beachten Sie, dass der RFC "Adressen haben eine feste Länge von vier Oktetten" deklariert. Ich denke, die Randfälle, auf die Sie sich beziehen, sind spezialisierter als diese Herausforderung.
Poke

Antworten:

26

X86_64-Maschinencode: 18 16 Bytes

Bearbeiten: Diese Antwort funktioniert nicht ganz so

  1. Ich benutze inet_ptonaus dem Standard C-Bibliotheken, was bedeutet, ich brauche die extern. Ich habe das Extern nicht in meine Byteanzahl aufgenommen.
  2. Ich habe die rote Zone als Ergebnis für die tatsächliche Adresse verwendet, aber eine Funktion aufgerufen, die auch die rote Zone hätte verwenden können. Auf meinem Computer funktioniert es zum Glück nicht, aber es wird möglicherweise von einigen ungeraden Standardbibliotheks-Builds verwendet, was zu undefiniertem Verhalten führen kann.

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:

section .text
    extern inet_pton
    global ipIsValid

ipIsValid:
    mov rsi, rdi
    ;mov rdi, 2 ; change to 10 for ipv6
    push 2
    pop rdi ; thank you peter
    lea rdx, [rsp - 128]
    jmp inet_pton

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önnen struct sockaddr. Es werden 3 Argumente benötigt: Die Adressfamilie ( AF_INET(ipv4), 2 oder AF_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 ist AF_INEToder AF_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 jmpdazu inet_ptonund das direkt zum Anrufer zurückkehren lassen!

Ich habe dieses Schnelltestprogramm gestartet, um Ihre Fälle zu testen:

#include <stdio.h>
#include <arpa/inet.h>
#include <netinet/ip.h>

extern int ipIsValid(char *);

int main(){
    char *addresses[] = {
        "1.160.10.240",
        "192.001.32.47",
        "1.2.3.",
        "1.2.3",
        "0.00.10.255",
        "1.2.$.4",
        "255.160.0.34",
        ".1.1.1",
        "1..1.1.1",
        "1.1.1.-0",
        ".1.1.+1",
        "1 1 1 1",
        "1",
        "10.300.4.0",
        "10.4F.10.99",
        "fruit loops",
        "1.2.3.4.5",
        NULL
    };

    for(size_t i = 0; addresses[i] != NULL; ++i){
        printf("Address %s:\t%s\n", addresses[i],
            ipIsValid(addresses[i]) ? "true" : "false");
    }
    return 0;
}

Zusammenstellen mit nasm -felf64 assembly.asm, Kompilieren mit gcc -no-pie test.c assembly.ound Sie erhalten:

Address 1.160.10.240:   true
Address 192.001.32.47:  false
Address 1.2.3.: false
Address 1.2.3:  false
Address 0.00.10.255:    false
Address 1.2.$.4:    false
Address 255.160.0.34:   true
Address .1.1.1: false
Address 1..1.1.1:   false
Address 1.1.1.-0:   false
Address .1.1.+1:    false
Address 1 1 1 1:    false
Address 1:  false
Address 10.300.4.0: false
Address 10.4F.10.99:    false
Address fruit loops:    false
Address 1.2.3.4.5:  false

Ich könnte das viel kleiner machen, wenn der Anrufer AF_INEToder AF_INET6die Funktion übergeben sollte

user233009
quelle
4
Ich liebe es, dass du das in asm getan hast. Und die Tatsache, dass Sie es denjenigen erklärt haben, die es möglicherweise nicht verstehen (und auch den Testcode), ist noch besser. Das heißt nicht, dass ich es in asm hätte tun können; Es sind viel zu viele Jahre vergangen, aber ich erinnere mich noch gut genug, um genau zu sehen, was Ihre Erklärung (und daher der Prozess) sagt (tut). Gute Arbeit.
Pryftan
4
e9 00 00 00 00ist a jmp near $+5, nicht a jmp inet_pton. Wenn Sie einen Opcode inet_pton
angeben
1
15-Byte-TIO 32 - Bit-x86
Logern
3
Sie sollten das Externe in den Antworttitel aufnehmen, da das Programm es erfordert und es nicht auf allen Plattformen verfügbar ist.
Qwr
1
Das "mov rdi, 2" kann "push 2 / pop rdi" für -2 Bytes sein. Beachten Sie auch, dass die Demontage falsch ist oder der Code falsch ist. Es ist entweder "mov edi" (nicht rdi) oder es fehlt ein Präfix.
Peter Ferrie
13

Java (JDK) , 63 Byte

s->("."+s).matches("(\\.(25[0-5]|(2[0-4]|1\\d|[1-9])?\\d)){4}")

Probieren Sie es online!

Credits

Olivier Grégoire
quelle
Sie haben vergessen, das nachgestellte Semikolon zu entfernen. ;) Und ich kann überprüfen, ob es für alle Testfälle funktioniert, auch für die in den Kommentaren. Mal sehen, ob ich ein paar Sachen zum Golfen sehe.
Kevin Cruijssen
3
Fehlgeschlagen am.1.2.3.4
l4m2
Darf man Boolean verwenden, wenn explizit 0/1 benötigt wird?
l4m2
1
@ l4m2 Die ursprüngliche Frage hatte Valid / Invalid. Daher gehe ich davon aus, dass jeder wahrheitsgemäße / falsche Wert hier akzeptabel ist.
Kevin Cruijssen
Output: 0 or 1und Java hat kein Auto bool-> int
l4m2
12

JavaScript (Node.js) , 43 Byte

x=>x.split`.`.map(t=>[t&255]==t&&[])==`,,,`

Probieren Sie es online!

JavaScript (Node.js) , 46 Byte

x=>x.split`.`.every(t=>k--&&[t&255]==t,k=4)*!k

Probieren Sie es online!

benutzte Arnauld's Rolle

JavaScript (Node.js) , 54 53 51 Bytes

x=>x.split`.`.every(t=>k--*0+t<256&[~~t]==t,k=4)*!k

Probieren 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 58 54 Bytes

s=>/^((2(?!5?[6-9])|1|(?!0\d))\d\d?\.?\b){4}$/.test(s)

Vielen Deadcode für 3 Bytes

l4m2
quelle
Ich habe einige Testfälle hinzugefügt!
rv7
Das gibt Wahrheit für 0.0.0.0. Alles andere scheint gut zu funktionieren.
Kevin Cruijssen
1
@ KevinCruijssen 0.0.0.0ist hier wahr. Warum ist SQL Injection hier?
14 m²,
Ah, warte, ich habe den Satz in der Herausforderungsbeschreibung falsch interpretiert. 0.0.0.0ist in der Tat wahr. Das ist auch meine Antwort. (Und was meinen Sie mit SQL-Injection?)
Kevin Cruijssen
1
@ l4m2 Ich habe es hinzugefügt, da wir einige Testfälle benötigen, die nicht einmal wie eine IP-Adresse aussehen.
Dienstag,
11

PHP , 39 36 Bytes

<?=+!!filter_var($argv[1],275,5**9);

Probieren Sie es online!

275 ähnelt der Konstante FILTER_VALIDATE_IP

5 ** 9 wird anstelle der Konstante verwendet FILTER_FLAG_IPV4. Dies ist ausreichend, weil 5**9 & FILTER_FLAG_IPV4es wahr ist, und genau das tut PHP im Hintergrund, wie Benoit Esnard betonte.

Hier wird filter_vardas 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.

oktupol
quelle
3
Verwenden von 5**9statt 1048576hier 3 Byte zu speichern: PHP verwendet &, um die IPv4 / IPv6-Flags zu testen , sodass jede Zahl zwischen 1048576 und 2097151 gültig ist.
Benoit Esnard
I downvote hiermit Ihre Antwort ist (im Grunde) meine Antwort: codegolf.stackexchange.com/a/174470/14732 , die bei 2018.10.22 09 geschrieben wurde: 17: 34UTC während Ihr auf 2018.10.22 09 geschrieben wurde: 21: 55UTC. Auch wenn ich die 1-Byte-Optimierung von @BenoitEsnard zurücksetze, entspricht meine Antwort genau Ihrer in Bezug auf die Funktionalität.
Ismael Miguel
2
Ich muss mich entschuldigen, ich habe Ihre Antwort nicht gesehen, obwohl zu der Zeit, als ich sie verfasst habe, keine Einreichung in PHP zu dieser Frage vorlag (wie Sie sagten, der Zeitunterschied beträgt weniger als fünf Minuten).
Oktupol
Ich weiß und ich verstehe es. Ich habe gerade erst deine bemerkt. Ich kann meine zurücksetzen, und Sie behalten die Optimierung bei. Aber ich weiß nicht, ob sich die Antworten dadurch voneinander unterscheiden.
Ismael Miguel
17
@IsmaelMiguel Ich würde niemanden dafür herabstufen, wenn es plausibel wäre, dass deins nicht da war, als sie angefangen haben. Mit einem Unterschied von 5 Minuten ist dies nicht nur plausibel, es ist mit ziemlicher Sicherheit auch der Fall, was offensichtlich ist, ohne dass der Autor dies selbst sagt.
Duncan X Simpson
11

PHP, 36 Bytes

echo(ip2long($argv[1])===false?0:1);

ip2longist eine bekannte eingebaute Funktion .

rexkogitans
quelle
3
29 Bytes
Nwellnhof
Dies scheint nicht dokumentierte Funktionen zu verwenden, die in neueren Versionen vorhanden sind (ich nehme an, es ist von PHP7 +). Beachten Sie, dass dies für PHP 4 und 5 unvollständige IPs akzeptiert.
Ismael Miguel
27 Bytes
Mark
1
Dies gibt Erfolg, wenn Sie eine ganze Zahl wie 1, 2 usw. eingeben. Denken Sie nicht, dass dies der Fall sein sollte. Und auch, wenn Sie es etwas wie 100.100.100 füttern
nl-x
10

Perl 6 , 22 21 20 Bytes

-1 Byte dank Phil H.

{?/^@(^256)**4%\.$/}

Probieren Sie es online!

Erläuterung

{                  }  # Anonymous Block
  /               /   # Regex match
   ^             $    # Anchor to start/end
    @(    )           # Interpolate
      ^256            #   range 0..255,
                      #   effectively like (0|1|2|...|255)
           **4        # Repeated four times
              %\.     # Separated by dot
 ?                    # Convert match result to Bool
nwellnhof
quelle
3
Mann, ich muss mehr Zeit damit verbringen, die regulären Ausdrücke von Perl 6 herauszufinden. Ich hatte weder den %Modifikator existiert. Ich frage mich, ob es versucht, alle 256**4Möglichkeiten zu überprüfen ?
Jo King
1
Stattdessen <{^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).
Phil H
@ PhilH Cool, danke. Ich habe es versucht, $(^256)aber jetzt merke ich, warum das nicht funktioniert hat.
Nwellnhof
9

05AB1E , 26 24 23 22 23 Byte

'.¡©g4Q₅Ý®å`®1šDïþJsJQP

-1 Byte dank @Emigna .
+1 Byte für den Bugfixing-Testfall, der 1.1.1.1E1fälschlicherweise ein wahres Ergebnis zurückgibt.

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

'.¡              '# Split the (implicit) input by "."
   ©              # Save it in the register (without popping)
    g4Q           # Check that there are exactly 4 numbers
    ₅Ý®å          # Check for each of the numbers that they are in the range [0,255],
        `         # and push the result for each number separated onto the stack
    ®1šDïþJsJQ    # Check that each number does NOT start with a "0" (excluding 0s itself),
                  # and that they consist of digits only
              P   # Check if all values on the stack are truthy (and output implicitly)
Kevin Cruijssen
quelle
1
Sie sollten in der Lage sein, Āanstelle von<d
Emigna
@MagicOctopusUrn ich Angst habe versagt es 1.1.1.1E1, 1..1.1.1, 1.1.1.1., 192.00.0.255, und 0.00.10.255. (PS: Ich habe das 1.1.1.1E1þ
Problem
Fair genug, dachte ich hätte etwas verpasst.
Magische Krakenurne
@MagicOctopusUrn Das Hauptproblem ist, dass 05AB1E Zahlen mit führenden Nullen gleich denen ohne sieht, auch als Zeichenfolge. Welches ist , warum ich die Verwendung DïþJsJQScheck , wo ïes zu gieße entfernen führenden 0s in int, und þnur Ziffern Blätter zu entfernen Dinge wie E, -etc. :) Die für Testfall ist 0.00.10.255, da 00010255und 0010255gleich sein würden.
Kevin Cruijssen
Ja, ich habe den gleichen Unsinn durchgemacht, die Umkehrung aller Zahlen hat jedoch ziemlich gut funktioniert, mit Ausnahme dieser Fälle. Interessant, wenn Features, die für einige Probleme von Vorteil sind, für andere fast fehlerhaft werden.
Magic Octopus Urn
6

PowerShell, 59 51 49 Byte

-8 Bytes, danke @AdmBorkBork

-2 Bytes trueoder falsevom Autor erlaubt

try{"$args"-eq[IPAddress]::Parse($args)}catch{!1}

Testskript:

$f = {

try{"$args"-eq[IPAddress]::Parse($args)}catch{!1}

}

@(
    ,("1.160.10.240" , $true)
    ,("192.001.32.47" , $false)
    ,("1.2.3." , $false)
    ,("1.2.3" , $false)
    ,("0.00.10.255" , $false)
    ,("192.168.1.1" , $true)
    ,("1.2.$.4" , $false)
    ,("255.160.0.34" , $true)
    ,(".1.1.1" , $false)
    ,("1..1.1.1" , $false)
    ,("1.1.1.-0" , $false)
    ,("1.1.1.+1" , $false)
    ,("1 1 1 1" , $false)
    ,("1"            ,$false)
    ,("10.300.4.0"   ,$false)
    ,("10.4F.10.99"  ,$false)
    ,("fruit loops"  ,$false)
    ,("1.2.3.4.5"    ,$false)

) | % {
    $s,$expected = $_
    $result = &$f $s
    "$($result-eq$expected): $result : $s"
}

Ausgabe:

True: True : 1.160.10.240
True: False : 192.001.32.47
True: False : 1.2.3.
True: False : 1.2.3
True: False : 0.00.10.255
True: True : 192.168.1.1
True: False : 1.2.$.4
True: True : 255.160.0.34
True: False : .1.1.1
True: False : 1..1.1.1
True: False : 1.1.1.-0
True: False : 1.1.1.+1
True: False : 1 1 1 1
True: False : 1
True: False : 10.300.4.0
True: False : 10.4F.10.99
True: False : fruit loops
True: False : 1.2.3.4.5

Erläuterung:

Das Skript versucht, eine Argumentzeichenfolge zu analysieren, um das .NET-Objekt IPAddress zu erstellen .

  • Rückgabe, $truewenn objecterstellt, und das Argument string entspricht einer Stringdarstellung der object(normalisierten Adresse vonobject.toString() )
  • kehre $falsesonst zurück

PowerShell, 59 56 54 Byte, Alternative 'Keine .NET-Lib verwenden'

-3 Bytes trueoder falsevom Autor erlaubt

-2 Bytes, danke an @ Deadcode für den coolen regulären Ausdruck.

".$args"-match'^(\.(2(?!5?[6-9])|1|(?!0\B))\d\d?){4}$'

Probieren Sie es online!

Vielen Dank an Olivier Grégoire für den ursprünglichen regulären Ausdruck.

mazzy
quelle
1
Sie brauchen nicht anzurufen, |% t*gda PowerShell die rechte Seite automatisch -eqals Zeichenfolge umwandelt, da die linke Seite eine Zeichenfolge ist. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
AdmBorkBork
Sie können 2 Bytes aus der "Keine .NET lib verwenden" -Version mit meinem regulären Ausdruck (angepasst an den Einfüge-Punkt-Trick, der natürlich nicht in meiner Version enthalten ist, da es sich um einen reinen regulären Ausdruck handelt) schneiden: tio.run/…
Deadcode
5

C (gcc) / POSIX, 26 Bytes

f(s){s=inet_pton(2,s,&s);}

Probieren Sie es online!

Funktioniert unter TIO als 64-Bit-Code, erfordert dies jedoch wahrscheinlich sizeof(int) == sizeof(char*)auf anderen Plattformen.

nwellnhof
quelle
@TobySpeight Ja, wenn Sie auf x86 sind, sollten Sie es wahrscheinlich im 32-Bit-Modus versuchen ( -m32).
Nwellnhof
Ich habe es zum Laufen gebracht, indem ich sals char*(kein Zugriff auf ein ILP32-System hier) übergeben habe, und ja, ich habe mich damit eingelassen inet_aton().
Toby Speight
5

PHP 7+, 37 35 32 Bytes

Hierbei 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.

<?=filter_var($_GET[i],275,5**9);

Gibt je nach Ergebnis nichts (für ein falsyErgebnis) oder die IP (für ein truthyErgebnis) aus.

Sie können dies anprobieren: http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68e http://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4


Dabei werden die folgenden Werte direkt verwendet:

  • 275 = FILTER_VALIDATE_IP
  • 1 << 20 = 1048576 = FILTER_FLAG_IPV4
  • 5 ** 9 = 1953125 (mit dem erforderlichen Bit "1" für 1048576)

Vielen 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):

<?=ip2long($_GET[i]);

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!

Ismael Miguel
quelle
Verwenden 5**9statt 1<<20hier ein Byte zu speichern: PHP& testet die IPv4 / IPv6-Flags , sodass jede Zahl zwischen 1048576 und 2097151 gültig ist.
Benoit Esnard
Erlaubt in neueren PHP-Versionen ip2longkeine unvollständigen Adressen.
Nwellnhof
@BenoitEsnard Danke! Ich habe es der Antwort hinzugefügt
Ismael Miguel
@nwellnhof Nach dem Testen bestätige ich, dass dies der Fall ist. Ich halte es jedoch nicht für eine gute Idee, es zu verwenden, da es nicht explizit dokumentiert ist.
Ismael Miguel
+!!ist nicht nötig; Das OP akzeptiert nun beliebige Wahrheitswerte.
Titus
5

Python 3: 81 78 70 69 66 Bytes

['%d.%d.%d.%d'%(*x.to_bytes(4,'big'),)for x in range(16**8)].count

Durchlaufen 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 ipaddressModuls verwendet wurde

mypetlion
quelle
2
Ich denke deine anonyme Funktion kann einfach sein [str(ip_address(x))for x in range(256**4)].count. Auch 256**4kann 16**8.
xnor
5

C # (Visual C # Interactive Compiler) , 84 79 65 Byte

s=>s.Split('.').Sum(t=>byte.TryParse(t,out var b)&t==b+""?1:5)==4

Probieren Sie es online!

-5 und -14 Bytes gespart dank @dana!

# C # (Visual C # Interactive Compiler) , 61 Byte

s=>s.Count(c=>c==46)==3&IPAddress.TryParse(s,out IPAddress i)

Probieren 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:

Die Einschränkung bei der Methode IPAddress.TryParse besteht darin, dass überprüft wird, ob eine Zeichenfolge in eine IP-Adresse konvertiert werden kann. Wenn sie also mit einem Zeichenfolgenwert wie "5" versehen wird, wird sie als "0.0.0.5" betrachtet.

Quelle

Wie @milk im Kommentar sagte, wird es in der Tat bei führenden Nullen scheitern. Die 61 Bytes funktionieren also nicht.

aloisdg sagt Reinstate Monica
quelle
1
@ Dana großartig. Schön gemacht! Noch vier und es wird die 61-Byte-Lösungen schlagen!
Aloisdg sagt Reinstate Monica
4

Python 2 , 85 82 81 Bytes

-1 Byte dank Kevin Cruijssen

from ipaddress import*
I=input()
try:r=I==str(IPv4Address(I))
except:r=0
print~~r

Probieren Sie es online!

Die 113-Byte-Antwort wird gelöscht, da dies fehlschlägt1.1.1.1e-80

Totes Opossum
quelle
1
Sie können Golf print 1*rauf print~~r. +1 obwohl, da es für alle möglichen bisher vorgeschlagenen Testfälle zu funktionieren scheint . PS: Ihre 113-Byte-Antwort schlägt fehl 1.1.1.1e-80.
Kevin Cruijssen
@ KevinCruijssen Danke! Ich habe nicht über eine solche Notation von Zahlen
nachgedacht
Ist das nicht ipaddressein Python 3-Modul?
Farhan.K
@ Farhan.K Keine Ahnung, aber es funktioniert in TIO
Dead Possum
4

Japt, 17 15 Bytes

q.
ʶ4«Uk#ÿòs)Ê

Probieren 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 ist 4UND dass die Länge, wenn alle Elemente im Bereich ["0","255"]entfernt werden, falsch ist ( 0).

                 :Implicit input of string U
q.               :Split on "."
\n               :Reassign resulting array to U
Ê                :Length of U
 ¶4              :Equals 4?
   «             :&&!
    Uk           :Remove from U
      #ÿ         :  255
        ò        :  Range [0,255]
         s       :  Convert each to a string
          )      :End removal
           Ê     :Length of resulting array
Zottelig
quelle
Gute Antwort. Auch für alle bisher vorgeschlagenen Testfälle verifiziert . Neugierig auf diese Erklärung.
Kevin Cruijssen
2
@ KevinCruijssen, Erklärung hinzugefügt. Danke für die zusätzlichen Testfälle.
Shaggy
3

Mathematica, 39 31 Bytes

Originalfassung:

¬FailureQ[Interpreter["IPAddress"][#]]&

Modifizierte Version (danke an Misha Lavrov)

 AtomQ@*Interpreter["IPAddress"]

die zurückgibt, Truewenn die Eingabe eine gültige IP-Adresse ist ( versuchen Sie es ).

Wenn Sie darauf bestehen, 1und 0stattdessen zu erhalten, wären zusätzliche 7 Byte erforderlich:

Boole/@AtomQ@*Interpreter["IPAddress"]
Polfosol ఠ_ఠ
quelle
Da 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 testen AtomQ[Interpreter["IPAddress"][#]]&, die auf die Funktionszusammensetzung weiter verkürzt werden können AtomQ@*Interpreter["IPAddress"]. Probieren Sie es online!
Mischa Lawrow
Scheitert an einer IPv6-Adresse wie 2001:0db8:85a3:0000:0000:8a2e:0370:7334.
Lirtosiast
3

JavaScript (ES6), 49 Byte

Gibt einen Booleschen Wert zurück.

s=>[0,1,2,3].map(i=>s.split`.`[i]&255).join`.`==s

Probieren Sie es online!

Arnauld
quelle
3

Python 2, 93 89 67 53 Bytes

[i==`int(i)&255`for i in input().split('.')]!=[1]*4>_

Probieren 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.

TemporalWolf
quelle
Ihr Scheck kann an Golf gespielt werden i==`int(i)&255` . Sie können auch einen Fehler mit erzwingen [...]!=[1]*4>_, da Sie ohnehin Exit-Codes verwenden. Probieren Sie es online!
Dennis
@ Tennis Ich verstehe nicht, was >_tut. Das Bitweise und ist allerdings ziemlich genial ... Ich war erfolglos darin, diese selbst zu kombinieren.
TemporalWolf
2
Wenn !=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.
Dennis
Zahlen Ich kette Vergleiche in meiner Antwort und verpasse dann das offensichtliche Ergebnis in Ihrem Kommentar. Danke für die Erklärung.
TemporalWolf
3

SFK , 176 Bytes

* war ursprünglich Bash + SFK, aber TIO hat seitdem einen richtigen SFK-Wrapper hinzugefügt

xex -i "_[lstart][1.3 digits].[1.3 digits].[1.3 digits].[1.3 digits][lend]_[part2]\n[part4]\n[part6]\n[part8]_" +xed _[lstart]0[digit]_999_ +hex +linelen +filt -+1 -+2 +linelen

Probieren Sie es online!

Οurous
quelle
Würde zuerst die Überprüfung des Fehlerausdrucks nc [addr] 1 -w1abkürzen?
@Rogem ncakzeptiert führende Nullen sowie IPv6-Adressen, sodass ich diese noch verarbeiten muss - und dies ist sfksowieso eher als Antwort als als Shell-Antwort gedacht .
Οurous
3

Python3 Bash * 60

* Auch andere Muscheln. Jeder, für den der Truthy / Falsy- Test einen Programm-Exit-Code weitergibt

read I
python3 -c "from ipaddress import*;IPv4Address('$I')"

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 Evilsind eine uneingeschränkte Bedrohung!

Sompom
quelle
( Erklärung ist es (nicht Erklärung ).)
Peter Mortensen
@PeterMortensen Huch. Es war sogar rot unterstrichen. Mein Browser hat versucht, mich zu retten, aber ich habe nicht zugehört. Danke, dass du das verstanden hast!
Sompom
Vollprogramme erlaubt die Ausgabe über Exit - Codes, daher könnte dies 43 Bytes .
5.
@BMO Interessant. Vielen Dank für den Hinweis! Ich denke, die Problemdefinition hat sich von "Truthy / Falsy" dahingehend geändert, dass auch willkürliche Ausgaben möglich sind, seit ich dies gepostet habe, aber ich hätte es einfach nicht bemerkt :)
Sompom
3

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:

^
(
    (
        2(?!5?[6-9])
    |
        1
    |
        (?!0\B)
    )
    \d\d?
    \.?\b
){4}
$

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}$

Deadcode
quelle
1
\bund \B... es ist schlau!
mazzy
1
@mazzy Ja, die beiden sind wirklich praktisch! Ich hätte es (?!0\d)stattdessen benutzen können, aber es gefällt mir \Bbesser!
Deadcode
Die Powershell-Antwort wird mit Ihrem regulären Ausdruck nicht kürzer. Es tut mir Leid. Anführungszeichen sind erforderlich, um ein Array in eine Zeichenfolge zu konvertieren.Probieren Sie es online!
mazzy
1
Das \.?\b hat mir auch bei meiner Antwort ein Byte erspart, danke!
Neil
1
3 Bytes gespart thx
l4m2
2

Rot , 106 Bytes

func[s][if error? try[t: load s][return off]if 4 <> length? t[return off]s =
form as-ipv4 t/1 t/2 t/3 t/4]

Probieren Sie es online!

Rückkehr true oderfalse

Erläuterung:

f: func [ s ] [
    if error? try [                  ; checks if the execution of the next block result in an error
        t: load s                    ; loading a string separated by '.' gives a tuple   
    ] [                              ; each part of which must be in the range 0..255
        return off                   ; if there's an error, return 'false' 
    ]
    if 4 <> length? t [              ; if the tuple doesn't have exactly 4 parts
        return off                   ; return 'false'  
    ]
    s = form as-ipv4 t/1 t/2 t/3 t/4 ; is the input equal to its parts converted to an IP adress
]
Galen Ivanov
quelle
2

Stax , 14 Bytes

∞n·Θ3ª&JH‼∙*~Γ

Führen Sie es aus und debuggen Sie es

Ausgepackt, ungolfed und kommentiert sieht es so aus.

VB      constant 256
r       [0 .. 255]
'|*     coerce and string-join with "|"; i.e. "0|1|2|3 ... 254|255"
:{      parenthesize to "(0|1|2|3 ... 254|255)"
]4*     make 4-length array of number pattern
.\.*    string join with "\\."; this forms the complete regex
|Q      is the input a complete match for the regex?

Führen Sie dieses aus

rekursiv
quelle
Überrascht zu wissen, dass Sie die Sprache Stax gemacht haben! es funktioniert gut
rv7
Vielen Dank! Der Raum für Golfsprachen ist überraschend voll, und ich bin mir nicht sicher, ob Stax seine eigene Existenz nach seinen Vorzügen rechtfertigen kann, aber mein Hauptziel war nur zu sehen, ob ich es schaffen und vielleicht etwas lernen kann. Es hat mehr Spaß gemacht als erwartet.
rekursiver
2

Python 3, 109 93 Bytes

import re
lambda x:bool(re.match(r'^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)(\.(?!$)|$)){4}$',x))

Erläuterung

Jedes Oktett kann 0 - 255 sein:

  • beginnt mit 25 und hat 0-5 als letzte Ziffer
  • Beginnen Sie mit 2, hat 0-4 als zweite Ziffer und eine beliebige Ziffer am Ende
  • beginnt mit 1 und 00 - 99 als Restziffern
  • hat nur 2 Ziffern - 1-9 ist die erste und danach eine beliebige Ziffer
  • oder nur eine Ziffer

Ein Oktett kann mit einem (.) Enden oder einfach enden, vorausgesetzt, es kann nicht beides, der negative Lookahead (?!$)kümmert sich um diesen Fall

Vielen 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.

Alpheus
quelle
2
Eine Erklärung dafür könnte hilfreich sein.
Nissa
x: re.match=> x:re.match; , x=> ,xund ) is=> )issollten 3 Bytes speichern. Außerdem können Sie im regulären Ausdruck \dfür jedes Vorkommen von [0-9]und [1]=> verwenden 1. Dies scheint jedoch ein großartiger erster Beitrag zu sein!
Zacharý
[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 und Nonefalsch sind. :)
DLosc
Hmm. Tatsächlich schlägt dies im Testfall 1.2.3.4.5(und auch 1.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.
DLosc
2

Bash , 30 Bytes

ipcalc -c `cat`;echo $(($?^1))

Probieren Sie es online!

Logern
quelle
Der echo $(($?))Teil wird nicht benötigt, da Programme ihr Ergebnis über den Exit-Code ausgeben dürfen .
ბიმო
2

Holzkohle , 45 21 Bytes

I∧⁼№θ.³¬Φ⪪θ.¬№E²⁵⁶Iλι

Probieren Sie es online!Link ist eine ausführliche Version des Codes. Bearbeiten: 24 Byte durch Portierung von @ Shaggys Japt-Antwort gespeichert. Erläuterung:

    θ                   Input string
   №                    Count occurrences of
     .                  Literal `.`
  ⁼                     Equal to
      ³                 Literal 3
 ∧                      Logical And
       ¬                Logical Not
          θ             Input string
         ⪪              Split on
           .            Literal `.`
        Φ               Filter by
            ¬           Logical Not
               ²⁵⁶      Literal 256
              E         Map over implicit range
                   λ    Map value
                  I     Cast to string
             №          Count occurrences of
                    ι   Filter value
I                       Cast to string
                        Implicitly print
Neil
quelle
Schlägt für Testfälle mit negativen ganzen Zahlen wie 123.-50.0.12oder fehl 1.1.1.-80. Alles andere scheint gut zu funktionieren. Also sollte der <256Scheck in [0,255]stattdessen sein.
Kevin Cruijssen
@KevinCruijssen Eigentlich hat der Code zum Herausfiltern ungültiger Zeichen nicht funktioniert, weil ich vergessen habe, die Variable in der inneren Schleife zu ändern. Sollte jetzt behoben sein.
Neil
2

Netzhaut , 46 44 Bytes

^
.
^(\.(25[0-5]|(2[0-4]|1\d|[1-9])?\d)){4}$

Hafen von @ OlivierGrégoire ‚s Java Antwort , so stellensicherihn zu upvote!
-2 Bytes dank @Neil .

Probieren Sie es online aus .

Erläuterung:

^
.                           # Prepend a dot "." before the (implicit) input
^...$                       # Check if the entire string matches the following regex
                            # exactly, resulting in 1/0 as truthy/falsey:
 (                          #  Open a capture group
  \.                        #   A dot "."
    (25[0-5]                #   Followed by a number in the range [250,255]
    |(2[0-4]|         ) \d) #   or by a number in the range [200,249]
    |(      |1\d|     ) \d) #   or by a number in the range [100,199]
    |(          |[1-9]) \d) #   or by a number in the range [10,99]
    |(                )?\d) #   or by a number in the range [0,9]
 )                          #  Close capture group
  {4}                       #  This capture group should match 4 times after each other
Kevin Cruijssen
quelle
Mein Versuch (den ich nicht gepostet habe, weil die Frage zu diesem Zeitpunkt zurückgestellt wurde) war gleich lang, hatte aber keine \dGruppenoptimierung, sodass Sie zwei Bytes sparen können, weil Sie die MAngabe auf der nicht benötigen letzte Linie.
Neil
Ich habe es geschafft, die Retina durch Portierung der Perl 6-Antwort auf 42 Byte zu reduzieren, aber diese Antwort funktioniert auch in 0.8.2, was mein Port nicht tut.
Neil
2

Jelly , 11 Bytes

⁹ḶṾ€ṗ4j€”.ċ

Ein monadischer Link, der eine Liste von Zeichen akzeptiert, die sich ergibt 1 wenn es eine gültige Adresse ist und 0Andernfalls. 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( ) statt256( ), da die Methode so ineffizient ist!

Wie?

⁹ḶṾ€ṗ4j€”.ċ - Link: list of characters, S
⁹           - literal 256
 Ḷ          - lowered range = [0,1,2,...,254,255]
  Ṿ€        - unevaluate €ach = ['0','1',...,['2','5','4'],['2','5','5']]
    ṗ4      - 4th Cartesian power = ALL 256^4 lists of 4 of them
            -               (e.g.: ['0',['2','5','5'],'9',['1','0']])
        ”.  - literal '.' character
      j€    - join for €ach (e.g. ['0','.','2','5','5','.','9','.','1','0'] = "0.255.9.10")
          ċ - count occurrences of right (S) in left (that big list)
Jonathan Allan
quelle
Warum dauert die Version mit 65.536 IPs 1,8 Sekunden? o_O
Dennis
2

Retina , 42 41 Bytes

~(K`

255*
["^(("|'|]")\.?\b){4}$"L$`
$.`

Probieren Sie es online! Basierend auf einer früheren Version von @ nwellnhofs Perl 6-Antwort, aber 1 Byte gespart, indem der \.?\bTrick aus @ Deadcodes Antwort gestohlen wurde. Erläuterung:

K`

Arbeitsbereich räumen.

255*

Fügen Sie 255 Zeichen ein.

["^(("|'|]")\.?\b){4}$"L$`
$.`

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.

Neil
quelle
1

Pip , 25 16 Bytes

a~=X,256RL4J"\."

Nimmt 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 .

                  a is 1st cmdline arg (implicit)
    ,256          Range(256), i.e. [0 1 2 ... 255]
   X              To regex: creates a regex that matches any item from that list
                  i.e. essentially `(0|1|2|...|255)`
        RL4       Create a list with 4 copies of that regex
           J"\."  Join on this string
 ~=               Regex full-match
a                 against the input
DLosc
quelle
1

JavaScript, 89 Bytes

(_,r=`(${[...Array(256).keys()].join`|`})`)=>RegExp(`^${(r+'\\.').repeat(3)+r}$`).test(_)

Probieren Sie es online!

Erstellen RegExpcapture Gruppen von Indizes eines Arrays mit length 256für Bereich 0-255verbunden mit |und gefolgt von entkommen .Zeichen ( ^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$) wiederholte 3Male mit verbundenen Array Schließen gefolgt von $zum Spiel Ende der Zeichenkette, Rückkehr trueoder falseaufgrund der Eingaben über RegExp.prototype.test().

guest271314
quelle