Alat pemindaian jaringan Anda sangat pemilih dalam hal input, dan segera macet jika Anda memasukkannya ke alamat IPv4 yang berisi karakter yang tidak pantas atau tidak diformat dengan benar.
Alamat IPv4 adalah alamat numerik 32-bit yang ditulis sebagai empat angka yang dipisahkan oleh titik. Setiap angka bisa nol hingga 255 .
Kita perlu menulis alat untuk memvalidasi input sebelum menghindari crash itu, dan alat khusus kita pilih-pilih: Format yang valid akan terlihat seperti di a.b.c.d
mana a, b, c dan d:
- Dapat berupa
0
angka alami atau tanpa nol di depan . - Harus antara 0 - 255 (inklusif).
- Harus tidak mengandung simbol-simbol khusus seperti
+
,-
,,
, dan lain-lain. - Harus berupa desimal (basis
10
)
Input : String
Output : Nilai Truthy atau Falsey (nilai arbitrer juga diterima)
Kasus uji :
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)
Ini adalah kode-golf , sehingga byte paling sedikit akan menang!
Catatan untuk pengguna - jika Anda ingin menambahkan beberapa lagi kasus uji, Anda disambut (dengan menyarankan edit). Tapi, tolong pastikan bahwa test case tidak terulang! Terima kasih
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
.Jawaban:
Kode mesin X86_64:
1816 byteSunting: Jawaban ini tidak cukup berhasil, karena
inet_pton
dari pustaka C standar, yang berarti saya perlu eksternal. Saya tidak memasukkan extern dalam hitungan byte saya.Dan ya, semuanya cukup banyak dilakukan oleh fungsi yang sudah ditulis
Bagaimanapun, inilah yang saya dapat:
48 89 fe 6a 02 5f 48 8d 54 24 80 e9 00 00 00 00
Majelis:
Penjelasan:
Lihatlah
inet_pton(3)
. Dibutuhkan alamat IP string dan memasukkannya ke dalam buffer yang dapat Anda gunakanstruct sockaddr
. Dibutuhkan 3 argumen: keluarga alamat (AF_INET
(ipv4), 2, atauAF_INET6
(ipv6), 10), string alamat ip, dan pointer ke output. Ini mengembalikan 1 pada keberhasilan, 0 untuk alamat yang tidak valid, atau -1 untuk ketika keluarga alamat tidakAF_INET
atauAF_INET6
(yang tidak akan pernah terjadi karena saya memberikan konstanta untuk itu).Jadi saya cukup memindahkan string ke register untuk argumen kedua, mengatur register pertama ke 2, dan mengatur register ketiga ke zona merah (128 byte di bawah stack pointer) karena saya tidak peduli dengan hasilnya. Maka saya bisa langsung
jmp
keinet_pton
dan membiarkan itu kembali langsung ke penelepon!Saya memutar program uji cepat ini untuk menguji kasus Anda:
Berkumpul dengan
nasm -felf64 assembly.asm
, kompilasi dengangcc -no-pie test.c assembly.o
, dan Anda akan mendapatkan:Saya bisa membuat ini jauh lebih kecil jika penelepon seharusnya lulus
AF_INET
atauAF_INET6
ke fungsisumber
e9 00 00 00 00
adalah ajmp near $+5
, bukan ajmp inet_pton
. Jika Anda memberikan opcode, Anda harus memasukkan bagian yang disertakaninet_pton
, jangan biarkan kosongJava (JDK) , 63 byte
Cobalah online!
Kredit
.1.1.1.1
.sumber
.1.2.3.4
Output: 0 or 1
dan Java tidak memiliki auto bool-> intJavaScript (Node.js) , 43 byte
Cobalah online!
JavaScript (Node.js) , 46 byte
Cobalah online!
menggunakan bagian Arnauld
JavaScript (Node.js) ,
545351 byteCobalah online!
-2B untuk
0+t<256
, -1B dari Patrick Stephansen, + 1B untuk menghindari input1.1.1.1e-80
Solusi RegExp
5854 byteTerima Deadcode selama 3 byte
sumber
0.0.0.0
. Segala sesuatu yang lain tampaknya bekerja dengan baik.0.0.0.0
ada di sini yang benar. Kenapa injeksi SQL ada di sini?0.0.0.0
memang benar. Itu kehendak golf jawaban saya juga .. (? Dan apa yang Anda maksud dengan SQL injection: S link adalah untuk TIO dengan SEMUA uji kasus.)PHP ,
3936 byteCobalah online!
275 menyerupai konstanta
FILTER_VALIDATE_IP
5 ** 9 digunakan sebagai pengganti konstanta
FILTER_FLAG_IPV4
. Ini sudah cukup, karena5**9 & FILTER_FLAG_IPV4
ini benar, yang persis seperti yang dilakukan PHP di latar belakang, seperti yang ditunjukkan Benoit Esnard.Di sini,
filter_var
kembalikan argumen pertama, apakah itu alamat IPv4 yang valid, atau salah jika tidak. Dengan+!!
, kami menghasilkan output yang dibutuhkan oleh tantangan.sumber
5**9
alih-alih1048576
menyimpan 3 byte di sini: PHP digunakan&
untuk menguji flag IPv4 / IPv6 , sehingga angka apa pun antara 1048576 dan 2097151 valid.PHP, 36 Bytes
ip2long
adalah terkenal built-in fungsi .sumber
Perl 6 ,
222120 byte-1 byte terima kasih kepada Phil H.
Cobalah online!
Penjelasan
sumber
%
modifikator. Saya ingin tahu apakah ia mencoba memeriksa semua256**4
kemungkinan?<{^256}>
Anda cukup mengonversi rentang ke array@(^256)
untuk -1 char TIO . Dengan mengubah blok kode menjadi sebuah array, ia juga menjadi jauh lebih cepat (0,4 detik daripada> 30).$(^256)
tetapi sekarang saya menyadari mengapa ini tidak berhasil.05AB1E ,
2624232223 byte-1 byte terima kasih kepada @Emigna .
+1 byte untuk kasus uji perbaikan bug
1.1.1.1E1
salah mengembalikan hasil yang benar.Cobalah online atau verifikasi semua kasus uji .
Penjelasan:
sumber
Ā
sebagai gantinya<d
1.1.1.1E1
,1..1.1.1
,1.1.1.1.
,192.00.0.255
, dan0.00.10.255
. (PS: Saya sudah memperbaikinya1.1.1.1E1
dengan menambahkanþ
cek bergabung-dan-sama.)DïþJsJQ
cek manaï
dilemparkan ke int untuk menghapus 0s terkemuka, danþ
hanya daun digit menghapus hal-hal sepertiE
,-
, dll :) The1š
adalah untuk kasus uji0.00.10.255
, karena00010255
dan0010255
akan sama.PowerShell,
595149 byte-8 byte, terima kasih @AdmBorkBork
-2 byte,
true
ataufalse
diizinkan oleh penulisSkrip uji:
Keluaran:
Penjelasan:
Script mencoba mengurai string argumen, untuk membangun objek .NET, IPAddress .
$true
jikaobject
dibuat dan argumen string sama dengan representasi string dariobject
(alamat dinormalisasi olehobject.toString()
)$false
sebaliknyaPowerShell,
595654 byte, 'jangan gunakan alternatif .NET lib'-3 byte,
true
ataufalse
diizinkan oleh penulis-2 byte, terima kasih kepada @ Deadcode untuk regexp keren.
Cobalah online!
Terima kasih @ Olivier Grégoire untuk ekspresi reguler yang asli.
sumber
|% t*g
karena PowerShell akan secara otomatis memasukkan sisi kanan-eq
sebagai string, karena sisi kiri adalah string. -try{+("$args"-eq[IPAddress]::Parse($args))}catch{0}
C (gcc) / POSIX, 26 byte
Cobalah online!
Bekerja sebagai kode 64-bit pada TIO tetapi mungkin mengharuskannya
sizeof(int) == sizeof(char*)
pada platform lain.sumber
-m32
).s
sebagaichar*
(tidak ada akses ke sistem ILP32 di sini), dan ya, saya bergaul denganinet_aton()
.PHP 7+,
373532 byteIni menggunakan fungsi builtin
filter_var
, untuk memvalidasi bahwa itu adalah alamat IPv4 .Agar bisa berfungsi, Anda harus melewati kunci
i
atas permintaan GET.Akan menghasilkan apa-apa (untuk
falsy
hasil) atau IP (untuktruthy
hasil), tergantung pada hasilnya.Anda dapat mencoba ini di:
http://sandbox.onlinephpfunctions.com/code/639c22281ea3ba753cf7431281486d8e6e66f68ehttp://sandbox.onlinephpfunctions.com/code/ff6aaeb2b2d0e0ac43f48125de0549320bc071b4Ini menggunakan nilai berikut secara langsung:
1 << 20 = 1048576 = FILTER_FLAG_IPV4Terima kasih untuk Benoit Esnard atas tip ini yang menyelamatkan saya 1 byte!
Terima kasih kepada Titus karena mengingatkan saya tentang perubahan tantangan.
Saya sudah melihat ke dalam menggunakan fungsi
ip2long
, tetapi berfungsi dengan alamat IP yang tidak lengkap.Alamat IPv4 yang tidak lengkap dianggap tidak valid dalam tantangan ini.
Jika diizinkan, ini akan menjadi kode final (hanya untuk PHP 5.2.10):
Saat ini, dalam dokumentasi tidak eksplisit bahwa ini akan berhenti berfungsi (ketika melewati ip yang tidak lengkap) dengan versi PHP yang lebih baru.
Setelah pengujian, mengkonfirmasi bahwa itulah masalahnya.
Terima kasih kepada nwellnhof untuk tipnya!
sumber
5**9
alih-alih1<<20
menyimpan satu byte di sini: PHP digunakan&
untuk menguji flag IPv4 / IPv6 , sehingga angka apa pun antara 1048576 dan 2097151 valid.ip2long
tidak mengizinkan alamat yang tidak lengkap.+!!
tidak diperlukan; OP sekarang menerima nilai-nilai kebenaran yang sewenang-wenang.Python 3:
8178706966 byteUlangi semua alamat IPv4 yang mungkin, dapatkan representasi string dan bandingkan dengan input. Eh ... butuh beberapa saat untuk berlari.
EDIT: Dihapus 3 byte dengan beralih dari program penuh ke fungsi anonim.
EDIT2: Dihapus 8 byte dengan bantuan dari xnor
EDIT3: Dihapus 1 byte dengan menggunakan peta yang sudah dibongkar alih-alih pemahaman daftar
EDIT4: Dihapus 3 byte dengan menggunakan pemahaman daftar bukan
ipaddress
modulsumber
[str(ip_address(x))for x in range(256**4)].count
. Juga256**4
bisa16**8
.C # (Visual C # Interactive Compiler) ,
847965 byteCobalah online!
-5 dan -14 byte disimpan berkat @dana!
# C # (Visual C # Interactive Compiler) , 61 byteCobalah online!
Ini adalah pekerjaan yang sedang berjalan. Penggunaan kode
System.Net
(+17 byte jika Anda menghitungnya). jika Anda bertanya-tanya mengapa saya menghitung dan menguraikan:sumberSeperti yang dikatakan @milk dalam komentar, memang akan gagal memimpin nol. Jadi, 61 byte yang tidak berfungsi.
sumber
Python 2 ,
85 8281 byte-1 byte terima kasih kepada Kevin Cruijssen
Cobalah online!
Jawaban 113 byte dihapus karena gagal
1.1.1.1e-80
sumber
print 1*r
keprint~~r
. +1, karena tampaknya berfungsi untuk semua kasus uji yang disarankan sejauh ini . PS: Jawaban 113 byte Anda gagal1.1.1.1e-80
.ipaddress
modul Python 3?Japt,
1715 byteCobalah atau jalankan semua test case atau verifikasi test case tambahan dari komentar tantangan
Penjelasan
Kami membagi ke array pada
.
, memeriksa bahwa panjang array itu sama dengan4
DAN bahwa panjang ketika semua elemen dalam rentang["0","255"]
dihapus dari itu adalah falsey (0
).sumber
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:sumber
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!
sumber
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.
sumber
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!
sumber
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!sumber
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}$
sumber
\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:
sumber
Stax, 14 bytes
Run and debug it
Unpacked, ungolfed, and commented, it looks like this.
Run this one
sumber
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.
sumber
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!
sumber
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:
sumber
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:
sumber
\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?
sumber
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.
sumber
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.
sumber
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()
.sumber