Kadang-kadang ketika saya mengetik alamat IPv4, saya mendapatkan semua nomor dengan benar, tapi saya lupa mengetik satu atau lebih periode. Saya ingin memiliki program (atau fungsi) yang mengambil alamat IPv4 saya yang rusak dan menampilkan semua kemungkinan penempatan yang valid dari periode yang hilang.
Memasukkan
Input akan selalu berupa string yang merupakan transformasi dari alamat IPv4 yang valid (lihat keterangan di bawah). Itu akan selalu telah ditransformasikan semata-mata oleh penghapusan satu atau lebih karakter periode.
Kiriman Anda tidak perlu menangani input di luar format ini.
Keluaran
Kumpulan atau daftar, tanpa urutan atau format tertentu, dari string yang mewakili semua alamat IPv4 yang valid yang dapat dibuat dari input dengan memasukkan karakter periode ke dalam input.
- Outputnya mungkin berupa daftar asli-bahasa atau jenis koleksi lain yang dipesan atau tidak.
- Atau, itu mungkin urutan string alamat IPv4 dibatasi dengan cara yang jelas.
- Jika Anda menggunakan pembatas satu karakter untuk membatasi string Anda, titik dan digit tidak diperbolehkan sebagai pembatas satu karakter. Saya menyadari bahwa, tidak seperti angka, periode sebagai pembatas tidak ambigu (karena setiap periode keempat akan menjadi pembatas) tetapi demi keterbacaan, saya tidak mengizinkannya.
Format alamat IPv4
Sementara alamat IPv4 sebenarnya hanya urutan empat oktet biner, tantangan ini menggunakan format desimal bertitik terbatas.
- Alamat IPv4 adalah empat nilai desimal yang dipisahkan oleh tiga periode.
- Masing-masing dari empat nilai berada di kisaran
0
untuk255
, inklusif. - Angka nol di depan tidak diizinkan dalam nilai angka apa pun. (Standalone satu karakter
0
diperbolehkan; nomor lain dimulai dengan nol adalah tidak:052
,00
, dll)
Uji Kasus
Input ada di baris pertama, output di baris kedua (di sini, disusun sebagai daftar string yang dikutip koma, dipisahkan oleh koma, dikelilingi oleh [
]
, tetapi Anda dapat menggunakan format atau struktur yang masuk akal, seperti yang ditentukan di atas). Beberapa contoh memiliki catatan pada baris ketiga untuk menyoroti penerapan aturan tertentu.
192.168.1234
["192.168.1.234", "192.168.12.34", "192.168.123.4"]
192.1681234
["192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]
(Note: 192.1681.2.34 (etc.) is illegal because 1681 is greater than 255)
1921681.234
["19.216.81.234", "192.16.81.234", "192.168.1.234"]
1921681234
["19.216.81.234", "192.16.81.234", "192.168.1.234", "192.168.12.34", "192.168.123.4"]
192.168.1204
["192.168.1.204", "192.168.120.4"]
(Note: 192.168.12.04 is illegal because of leading zero)
192.168.123
["1.92.168.123", "19.2.168.123", "192.1.68.123", "192.16.8.123", "192.168.1.23", "192.168.12.3"]
192.168.256
["192.168.2.56", "192.168.25.6"]
(Note: Any combination that would leave 256 intact is illegal)
120345
["1.20.3.45", "1.20.34.5", "1.203.4.5", "12.0.3.45", "12.0.34.5", "120.3.4.5"]
(Note: 12.03.4.5 (etc.) is illegal due to leading zero.)
012345
["0.1.23.45", "0.1.234.5", "0.12.3.45", "0.12.34.5", "0.123.4.5"]
(Note: the first segment must be 0, because `01` or `012` would be illegal.)
000123
["0.0.0.123"]
(Saya membuat contoh ini dengan tangan, jadi tolong beri tahu saya jika ada kesalahan yang Anda temukan.)
sumber
Jawaban:
Pyth, 24 byte
Cobalah online
Bagaimana itu bekerja
Pyth, 17 byte, sangat lambat
Peringatan. Jangan lari. Membutuhkan sekitar 553 GiB RAM.
Bagaimana itu bekerja
sumber
1.9.2.1.6.8.1.2
dan19.2.1.6.8.1.2
lain - lain? (Tapi kemudian jelas semua yang tidak valid bisa disaring)C (gcc / linux),
125121 byteSimpulkan semua alamat IPv4 yang mungkin, dan lakukan perbandingan khusus yang melompati titik-titik tambahan dalam alamat ip yang dihasilkan (tetapi tidak dalam alamat perbandingan utama) untuk memutuskan apakah akan mencetak atau tidak. Sangat lambat, tetapi harus selesai dalam 1 jam pada PC yang wajar .
sumber
i=0;
.i
adalah 0 lagi ...Perl 5, 91 byte
Program ini mengharapkan satu baris dari satu input dan output daftar kandidat yang dibatasi ruang.
Penjelasan
Program ini mengeksploitasi fitur backtracking regex untuk mengulang semua kemungkinan pembentukan alamat IPv4 yang valid dari string input.
Regex IPv4 dengan opsional
.
, tidak ada catatan di sini.Ekspresi evaluasi kode yang mencetak konten dari grup yang menangkap.
Buat pertandingan gagal dan paksa mundur.
Contoh dijalankan
sumber
JavaScript (ES6),
147141135 byteSunting: disimpan 6 byte berkat @apsillers. Menyimpan 6 byte lainnya dengan menyalin uji validitas ANDA.
sumber
.
yang akan membuang tes, tapi saya pikir versi ini OK.0
memiliki$
. (Ini juga tidak ada^
, jadi terima kasih telah menarik perhatian saya ke sana.)splice
tidak berfungsi seperti itu, ia memodifikasi array dan mengembalikan elemen yang dihapus.Python 3, 232 byte
Cukup sederhana: Kami menempatkan titik di mana-mana dan mencetak jika alamat IP dengan periode yang ditempatkan valid. Kami memeriksa validitas alamat IP dengan (ab) menggunakan
ipaddress.ip_address
, yang menimbulkan pengecualian jika inputnya bukan alamat IP yang valid. Tantangannya mendefinisikan beberapa aturan tambahan yangip_address
tidak menangani (yaitu, bahwa tidak ada nol terkemuka), jadi kami memeriksa mereka juga dengan ekspresi reguler, lalu mencetak.Output setiap solusi pada baris baru, dicampur dengan jumlah baris kosong sewenang-wenang.
Contoh dijalankan:
Inilah solusi Python 2 248-byte saya yang lebih lama. Level indent kedua dan ketiga adalah
\t
(tab mentah) dan\t
(tab mentah ditambah spasi). Ini memainkan sangat buruk dengan penurunan harga, sehingga tab telah digantikan oleh dua spasi.
Membutuhkan input yang dikelilingi dengan tanda kutip (misalnya
"123.456.789"
). Keluaran setiap alamat IP yang dihasilkan pada baris baru.Disimpan 9 byte berkat @grawity!
sumber
ipaddress.ip_address()
lebih pendek dari pada pemeriksaan manual + aton?Brachylog , 110 byte
Cobalah online!
sumber
Python 3,
262260 byteTidak ada perpustakaan yang digunakan, tetapi terlambat dan lebih lama, mungkin saya kehilangan beberapa teknik golf yang jelas.
Bagaimanapun hasilnya.
sumber
or
klausa?