Twoje narzędzie do skanowania sieciowego jest denerwująco wybredne w zakresie wprowadzania danych i natychmiast ulega awarii, jeśli podasz mu adres IPv4, który zawiera nieprawidłowe znaki lub nie jest poprawnie sformatowany.
Adres IPv4 to 32-bitowy adres numeryczny zapisany jako cztery liczby oddzielone kropkami. Każda liczba może wynosić od zera do 255 .
Musimy napisać narzędzie, aby wstępnie sprawdzić poprawność danych wejściowych, aby uniknąć tych awarii, a nasze konkretne narzędzie jest wybredne: prawidłowy format będzie wyglądał tak, a.b.c.d
gdzie a, b, cid:
- Może być
0
liczbą naturalną lub bez zer wiodących . - Powinien wynosić od 0 do 255 (włącznie).
- Gdyby nie zawierają specjalne symbole, takie jak
+
,-
,,
i innych. - Powinien być dziesiętny (podstawa
10
)
Dane wejściowe : ciąg
Dane wyjściowe : wartość Truthy lub Falsey (akceptowane są również dowolne wartości)
Przypadki testowe :
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)
To jest golf golfowy , więc wygra najmniej bajtów!
Uwaga dla użytkowników - jeśli chcesz dodać więcej przypadków testowych, jesteś mile widziany (sugerując edycję). Ale upewnij się, że przypadki testowe się nie powtarzają! Dzięki
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
.Odpowiedzi:
Kod maszynowy X86_64:
1816 bajtówEdycja: Ta odpowiedź nie działa, jak
inet_pton
ze standardowych bibliotek C, co oznacza, że potrzebuję zewnętrznego. Nie uwzględniłem jednak zewnętrznego w mojej liczbie bajtów.I tak, cała ta sprawa jest wykonywana przez już napisaną funkcję
W każdym razie mam to:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Montaż:
Wyjaśnienie:
Spójrz na
inet_pton(3)
. Pobiera ciąg adresu IP i umieszcza go w buforze, którego można używaćstruct sockaddr
. Wymaga 3 argumentów: rodziny adresów (AF_INET
(ipv4), 2 lubAF_INET6
(ipv6), 10), ciągu adresu ip i wskaźnika na wynik. Zwraca 1 w przypadku sukcesu, 0 na nieprawidłowy adres, lub -1 gdy rodzina nie jest ani adresAF_INET
lubAF_INET6
(co nigdy nie nastąpi, bo jestem przechodzącej stałej do niego).Więc po prostu przenoszę ciąg do rejestru dla drugiego argumentu, ustawiam pierwszy rejestr na 2 i ustawiam trzeci rejestr na czerwoną strefę (128 bajtów poniżej wskaźnika stosu), ponieważ nie dbam o wynik. Wtedy mogę po prostu
jmp
sięinet_pton
i pozwól, że powrót do rozmówcy prosto!Uruchomiłem ten szybki program testowy, aby przetestować twoje przypadki:
Zbierz
nasm -felf64 assembly.asm
, skompiluj zgcc -no-pie test.c assembly.o
, a otrzymasz:Mógłbym to znacznie zmniejszyć, jeśli dzwoniący miałby przejść
AF_INET
lub przejśćAF_INET6
do funkcjiźródło
e9 00 00 00 00
jest, ajmp near $+5
niejmp inet_pton
. Jeśli podasz opcode, powinieneś dołączyćinet_pton
część zawierającą , a nie pozostawić pusteJava (JDK) , 63 bajty
Wypróbuj online!
Kredyty
.1.1.1.1
.źródło
.1.2.3.4
Output: 0 or 1
a Java nie ma auto bool-> intJavaScript (Node.js) , 43 bajty
Wypróbuj online!
JavaScript (Node.js) , 46 bajtów
Wypróbuj online!
wykorzystał część Arnaulda
JavaScript (Node.js) ,
545351 bajtówWypróbuj online!
-2B dla
0+t<256
, -1B od Patricka Stephansena, + 1B, aby uniknąć wkładu1.1.1.1e-80
Rozwiązanie RegExp
5854 bajtówDziękujemy Deadcode za 3 bajty
źródło
0.0.0.0
. Wszystko inne wydaje się działać dobrze.0.0.0.0
jest tutaj prawdziwy. Tylko dlaczego zastrzyk SQL jest tutaj?0.0.0.0
jest rzeczywiście prawdą. To też pomoże mojej odpowiedzi .. (A co masz na myśli przez zastrzyk SQL?: S Link jest do TIO ze WSZYSTKIMI testami.)PHP ,
3936 bajtówWypróbuj online!
275 przypomina stałą
FILTER_VALIDATE_IP
5 ** 9 jest używane zamiast stałej
FILTER_FLAG_IPV4
. Jest to wystarczające, ponieważ5**9 & FILTER_FLAG_IPV4
jest prawdą, co dokładnie robi PHP w tle, jak zauważył Benoit Esnard.Tu
filter_var
zwraca pierwszy argument, czy jest to prawidłowy adres IPv4 lub false, jeśli tak nie jest. Dzięki+!!
produkujemy dane wyjściowe wymagane przez wyzwanie.źródło
5**9
zamiast1048576
zapisywania 3 bajtów tutaj: PHP używa&
do testowania flag IPv4 / IPv6 , więc dowolna liczba między 1048576 a 2097151 jest poprawna.PHP, 36 bajtów
ip2long
jest dobrze znaną funkcją wbudowaną .źródło
Perl 6 ,
222120 bajtów-1 bajt dzięki Philowi H.
Wypróbuj online!
Wyjaśnienie
źródło
%
modyfikatora. Zastanawiam się, czy próbuje sprawdzić wszystkie256**4
możliwości?<{^256}>
możesz po prostu przekonwertować zakres na tablicę@(^256)
dla -1 znaków TIO . Zmieniając blok kodu na tablicę, staje się on niezwykle szybki (0,4 zamiast> 30).$(^256)
ale teraz zdaję sobie sprawę, dlaczego to nie zadziałało.05AB1E ,
2624232223 bajtów-1 bajt dzięki @Emigna .
+1 bajt dla przypadku testowego
1.1.1.1E1
naprawienia błędu niepoprawnie zwracającego prawdziwy wynik.Wypróbuj online lub sprawdź wszystkie przypadki testowe .
Wyjaśnienie:
źródło
Ā
zamiast<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, i0.00.10.255
. (PS: Naprawiłem1.1.1.1E1
, dodającþ
opcję łączenia i wyrównywania).DïþJsJQ
sprawdzić, gdzieï
oddanych do int usunąć wiodące 0s, aþ
tylko pozostawia cyfry usuwając takie rzeczyE
,-
itp :)1š
jest dla przypadku testowego0.00.10.255
, ponieważ00010255
i0010255
byłaby równa.PowerShell,
595149 bajtów-8 bajtów, dzięki @AdmBorkBork
-2 bajty
true
lubfalse
dozwolone przez autoraSkrypt testowy:
Wydajność:
Wyjaśnienie:
Skrypt próbuje przeanalizować ciąg argumentu, aby utworzyć obiekt .NET, adres IP .
$true
jeśli zostałobject
utworzony, a ciąg argumentu jest równy reprezentacji ciąguobject
(znormalizowanego adresu przezobject.toString()
)$false
przeciwnym razie zwróćPowerShell,
595654 bajtów, „nie używaj alternatywy .NET lib”-3 bajty
true
lubfalse
dozwolone przez autora-2 bajty, dzięki @ Deadcode dla fajnego wyrażenia regularnego .
Wypróbuj online!
Dzięki @ Olivier Grégoire za oryginalne wyrażenie regularne.
źródło
|% t*g
ponieważ PowerShell automatycznie rzuci prawą stronę-eq
jako ciąg, ponieważ lewa strona jest ciągiem. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 bajtów
Wypróbuj online!
Działa jako 64-bitowy kod w TIO, ale prawdopodobnie wymaga tego
sizeof(int) == sizeof(char*)
na innych platformach.źródło
-m32
).s
jakochar*
(nie ma tutaj dostępu do systemu ILP32) i tak, mieszałem sięinet_aton()
.PHP 7+,
373532 bajtyKorzysta z wbudowanej funkcji
filter_var
, aby sprawdzić, czy jest to adres IPv4 .Aby zadziałało, musisz przekazać klucz
i
nad żądaniem GET.Nie będzie generować niczego (dla
falsy
wyniku) ani adresu IP (dlatruthy
wyniku), w zależności od wyniku.Możesz to wypróbować na:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Wykorzystuje to bezpośrednio następujące wartości:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Dziękuję Benoit Esnard za tę wskazówkę, która pozwoliła mi zaoszczędzić 1 bajt!
Dziękuję Tytusowi za przypomnienie mi o zmianach w wyzwaniu.
Sprawdziłem użycie tej funkcji
ip2long
, ale działa ona z niepełnymi adresami IP.Niepełne adresy IPv4 są uważane za nieprawidłowe w tym wyzwaniu.
Gdyby były dozwolone, byłby to końcowy kod (tylko dla PHP 5.2.10):
Obecnie w dokumentacji nie jest wyraźnie zaznaczone, że przestanie to działać (po przejściu niekompletnego adresu IP) z nowszymi wersjami PHP.
Po testach potwierdzono, że tak było.
Dzięki nwellnhof za wskazówkę!
źródło
5**9
zamiast1<<20
zapisywania jednego bajtu tutaj: PHP używa&
do testowania flag IPv4 / IPv6 , więc dowolna liczba między 1048576 a 2097151 jest poprawna.ip2long
nie zezwala na niekompletne adresy.+!!
nie jest wymagany; PO akceptuje teraz arbitralne prawdziwe wartości.Python 3:
8178706966 bajtówZapętlaj wszystkie możliwe adresy IPv4, uzyskaj reprezentację ciągu i porównaj go z danymi wejściowymi. Uruchomienie zajmuje trochę czasu.
EDYCJA: Usunięto 3 bajty, przechodząc z pełnego programu do funkcji anonimowej.
EDYCJA 2: Usunięto 8 bajtów przy pomocy xnor
EDYCJA 3: Usunięto 1 bajt za pomocą rozpakowanej mapy zamiast zrozumienia listy
EDYCJA 4: Usunięto 3 bajty za pomocą funkcji porównywania list zamiast
ipaddress
modułuźródło
[str(ip_address(x))for x in range(256**4)].count
. Ponadto,256**4
może być16**8
.C # (interaktywny kompilator Visual C #) ,
847965 bajtówWypróbuj online!
-5 i -14 bajtów zapisanych dzięki @dana!
# C # (interaktywny kompilator Visual C #) , 61 bajtówWypróbuj online!
To jest praca w toku. Użyj kodu
System.Net
(+17 bajtów, jeśli go policzysz). jeśli zastanawiasz się, dlaczego liczę i analizuję:źródłoJak powiedział @milk w komentarzu, to rzeczywiście zawiedzie na zerach wiodących. Tak więc 61 bajtów nie działa.
źródło
Python 2 ,
85 8281 bajtów-1 bajt dzięki Kevin Cruijssen
Wypróbuj online!
113 bajtowa odpowiedź jest usuwana, ponieważ nie działa
1.1.1.1e-80
źródło
print 1*r
w golfaprint~~r
. +1, ponieważ wydaje się, że działa dla wszystkich sugerowanych dotychczas możliwych przypadków testowych . PS: Odpowiedź na 113 bajtów kończy się niepowodzeniem1.1.1.1e-80
.ipaddress
moduł Python 3?Japt,
1715 bajtówWypróbuj lub uruchom wszystkie przypadki testowe lub sprawdź dodatkowe przypadki testowe na podstawie komentarzy wyzwania
Wyjaśnienie
Dzielimy się na tablicę
.
, sprawdzamy, czy długość tej tablicy jest równa4
ORAZ i czy po["0","255"]
usunięciu z niej wszystkich elementów z zakresu jest falsey (0
).źródło
Mathematica,
3931 bajtówOrginalna wersja:
Wersja zmodyfikowana (dzięki Misha Lavrov)
który zwraca,
True
jeśli wejście jest prawidłowym adresem IP ( spróbuj ).W przypadku nalegania na uzyskanie
1
i0
zamiast tego konieczne byłoby dodatkowe 7 bajtów:źródło
Interpreter["IPAddress"]
zwraca ciąg znaków dla poprawnych danych wejściowych, a niektóre skomplikowane obiekty błędów dla nieprawidłowych danych wejściowych, możemy przetestować poprawne dane wejściowe za pomocąAtomQ[Interpreter["IPAddress"][#]]&
, które można dodatkowo skrócić do składu funkcjiAtomQ@*Interpreter["IPAddress"]
. Wypróbuj online!2001:0db8:85a3:0000:0000:8a2e:0370:7334
.JavaScript (ES6), 49 bajtów
Zwraca wartość logiczną.
Wypróbuj online!
źródło
Python 2,
93896753 bajtówWypróbuj online!
Dzięki Dennisowi za golenie kolejnych 14 bajtów na wewnętrznych porównaniach i kodzie wyjścia.
Specjalne podziękowania dla Jonathana Allana za golenie 22 bajtów i poprawkę logiki! Pesky spróbuj / z wyjątkiem Begone!
Biorąc odpowiednio sformatowane ciągi zamiast surowych bajtów, golisz 4 bajty, dzięki Jo King.
źródło
i==`int(i)&255`
. Możesz także wymusić błąd[...]!=[1]*4>_
, ponieważ i tak używasz kodów wyjścia. Wypróbuj online!>_
robi. Bitowe i dość pomysłowe ... Nie udało mi się jednak ich połączyć.!=
zwraca False, Python powoduje zwarcie i nic się nie dzieje; tłumacz ustnie. Jeśli zwraca wartość True,>_
wywołuje błąd NameError, ponieważ zmienna_
jest niezdefiniowana.sfk , 176 bajtów
* pierwotnie był Bash + SFK, ale od tego czasu TIO dodało odpowiednie opakowanie SFK
Wypróbuj online!
źródło
nc [addr] 1 -w1
skrócić?nc
akceptuje wiodące zera, a także adresy IPv6, więc nadal musiałbym sobie z nimi poradzić - i to i tak jest przeznaczone raczej jakosfk
odpowiedź niż odpowiedź powłoki.Python3Bash * 60* Również inne muszle. Każdy, dla którego test prawdziwości / fałszowania przechodzi na kod wyjścia programu
Wyjaśnienie
Problem z czystymi rozwiązaniami Pythona polega na tym, że awaria programu jest uważana za nieokreśloną. Przydałoby się „dużo” kodu, aby przekonwertować wyjątek na odpowiednią wartość prawdy / fascy. Jednak w pewnym momencie interpreter języka Python obsługuje ten nieprzechwycony wyjątek i zwraca niezerowy kod wyjścia. Za niski i niski koszt zmiany języków na ulubioną powłokę uniksową możemy zaoszczędzić sporo kodu!
Oczywiście jest to podatne na ataki iniekcyjne ... Dane wejściowe, takie jak
1.1.1.1'); print('Doing Something Evil
nielimitowane zagrożenie!źródło
ECMAScript czysty regex, 41 bajtów
^((2(?!5?[6-9])|1|(?!0\B))\d\d?\.?\b){4}$
Wypróbuj online!
Wypróbuj na regex101
Myślę, że logika tego wyrażenia regularnego mówi sama za siebie, więc po prostu wydrukuję dość ładnie, ale nie skomentuję tego:
Można to wykorzystać do ogolenia 2 bajtów z następujących innych odpowiedzi:
Oto alternatywna wersja, która pozwala na zera na początku, ale robi to konsekwentnie (oktety mogą być reprezentowane przez maksymalnie 3 cyfry dziesiętne):
^((2(?!5?[6-9])|1|0?)\d\d?\.?\b){4}$
Lub zezwól na dowolną liczbę zer wiodących:
^(0*(2(?!5?[6-9])|1?)\d\d?\.?\b){4}$
źródło
\b
i\B
... jest mądry!(?!0\d)
zamiast tego, ale lubię\B
lepiej!\.?\b
Zaoszczędziło mi bajt na moją odpowiedź też, dzięki!Czerwony , 106 bajtów
Wypróbuj online!
Powrotny
true
lubfalse
Wyjaśnienie:
źródło
Stax , 14 bajtów
Uruchom i debuguj
Rozpakowane, niepolowane i skomentowane, wygląda to tak.
Uruchom ten
źródło
Python 3,
10993 bajtyWyjaśnienie
Każdy oktet może mieć wartość 0–255:
Oktet może kończyć się znakiem (.) Lub po prostu, pod warunkiem, że nie będzie w stanie wykonać obu tych czynności, negatywny lookahead
(?!$)
zajmuje się tym przypadkiemDzięki @Zachary za uświadomienie mi, że mogę odrzucić spacje (ponieważ jest to kod golfowy).
Dzięki @DLosc za ulepszenia i uświadomienie sobie mojego błędu, który został teraz poprawiony.
źródło
x: re.match
=>x:re.match
;, x
=>,x
i) is
=>)is
powinny zapisać 3 bajty. Ponadto w wyrażeniu regularnym możesz użyć\d
dla każdego wystąpienia[0-9]
i[1]
=>1
. Wydaje się, że to świetny pierwszy post![1-9][0-9]|[0-9]
może stać się[1-9]\d|\d
(zgodnie z radą Zachariego), co może się stać[1-9]?\d
. Zamiast testowaniare.match(...)is not None
możesz to zrobić,bool(re.match(...))
ponieważ obiekty dopasowania są zgodne z prawdą iNone
falsey. :)1.2.3.4.5
(a także1.2.3.4.
, który nie znajduje się na oficjalnej liście przypadków testowych), ponieważ może pasować do kropki zamiast końca łańcucha po czwartej cyfrze.Bash , 30 bajtów
Wypróbuj online!
źródło
echo $(($?))
część nie jest potrzebna, ponieważ programy mogą wyświetlać swój wynik za pomocą kodu wyjścia.Węgiel drzewny ,
4521 bajtówWypróbuj online! Link jest do pełnej wersji kodu. Edycja: Zapisano 24 bajty, przenosząc odpowiedź @ Shaggy's Japt. Wyjaśnienie:
źródło
123.-50.0.12
lub1.1.1.-80
. Wszystko inne wydaje się działać dobrze. Więc<256
czek powinien byćin [0,255]
zamiast.Siatkówka ,
4644 bajtówPort odpowiedzi Javy @ OlivierGrégoire , więc pamiętaj, aby go zagłosować!
-2 bajty dzięki @Neil .
Wypróbuj online .
Wyjaśnienie:
źródło
\d
optymalizacji grupy, więc możesz zapisać dwa bajty, ponieważ nie potrzebujeszM
specyfikacji Ostatni wiersz.Galaretka , 11 bajtów
⁴
⁹
W jaki sposób?
źródło
Siatkówka ,
4241 bajtówWypróbuj online! Na podstawie poprzedniej wersji odpowiedzi Perla na @ nwellnhof 6, ale zapisano 1 bajt dzięki kradzieży
\.?\b
sztuczki z odpowiedzi @ Deadcode. Wyjaśnienie:Wyczyść obszar roboczy.
Wstaw 255 znaków.
Wygeneruj zakres 0..255 oddzielony
|
s, poprzedzony znakiem^((
i przyrostkiem)\.?\b){4}$
, tworząc w ten sposób wyrażenie regularne^((0|1|...255)\.?\b){4}$
.Oceń to na oryginalnym wejściu.
źródło
Pip ,
2516 bajtówPobiera kandydujący adres IP jako argument wiersza polecenia. Wypróbuj online! lub Zweryfikuj wszystkie przypadki testowe
Wyjaśnienie
Rozwiązanie Regex, zasadniczo port odpowiedzi na rekurencyjne rozwiązanie Stax .
źródło
JavaScript, 89 bajtów
Wypróbuj online!
Twórz
RegExp
grupy przechwytywania na podstawie indeksów tablicy,length
256
dla której zakres0-255
połączony z,|
a następnie.
znak ucieczki (^(0|1...|255)\.(0|1...|255)\.(0|1...|255)\.(0|1...|255)$
) powtarzają się3
razy zamykając z połączoną tablicą, po której następuje$
dopasowanie końca łańcucha, powrotutrue
lubfalse
wyniku przekazanego doRegExp.prototype.test()
.źródło