Untuk menandai peringatan hari IPv6 Dunia , Internet Society telah menerbitkan kampanye untuk Matikan IPv4 pada 6 Juni 2014 untuk One Day .
Alamat IPv6 dapat direpresentasikan dalam bentuk panjang sebagai delapan nilai hex 16-bit yang dipisahkan oleh titik dua. Bergantung pada alamatnya, mereka juga dapat dipersingkat seperti yang dijelaskan dalam item 2 dari bagian 2.2 Representasi Teks dari Alamat RFC 3513 :
Untuk membuat alamat penulisan yang mengandung nol bit lebih mudah, sintaks khusus tersedia untuk mengompresi nol. Penggunaan "::" menunjukkan satu atau lebih grup dengan 16 bit nol. "::" hanya dapat muncul sekali dalam satu alamat. "::" juga dapat digunakan untuk mengompresi nol di depan atau di belakang alamat.
Entri untuk tantangan ini adalah program yang menerima tepat satu alamat IPv6 yang diformat dalam format panjang atau pendek, dan akan menampilkan alamat yang sama dalam format panjang dan pendek, dalam urutan itu.
Input mungkin berasal dari argumen baris perintah, STDIN, atau sumber input lain yang sesuai dengan pilihan bahasa Anda.
Perpustakaan atau utilitas khusus untuk mem -parsing alamat IPv6 dilarang (mis. Inet_ {ntop, pton} () ).
Jika alamat input tidak valid, output akan kosong (atau beberapa pesan kesalahan yang sesuai menunjukkan alamat tidak valid diberikan)
Dalam kasus di mana
::
pemendekan terjadi, hanya satu operasi pemendekan dapat terjadi untuk alamat yang diberikan. Jika ada lebih dari satu operasi pemendekan potensial untuk alamat yang diberikan, operasi yang memberikan keseluruhan alamat terpendek harus digunakan. Jika ada ikatan dalam hal ini, operasi pertama akan digunakan. Ini diilustrasikan dalam contoh di bawah ini.
Contoh:
Input Output
1080:0:0:0:8:800:200C:417A 1080:0:0:0:8:800:200C:417A
1080::8:800:200C:417A
FF01::101 FF01:0:0:0:0:0:0:101
FF01::101
0:0:0:0:0:0:0:1 0:0:0:0:0:0:0:1
::1
:: 0:0:0:0:0:0:0:0
::
1:0:0:2:0:0:0:3 1:0:0:2:0:0:0:3
1:0:0:2::3
1:0:0:8:8:0:0:3 1:0:0:8:8:0:0:3
1::8:8:0:0:3
1:2:3:4:5:6:7:8 1:2:3:4:5:6:7:8
1:2:3:4:5:6:7:8
ABCD:1234 <Invalid address format - no output>
ABCDE::1234 <Invalid address format - no output>
1:2:3:4:5:6:7:8:9 <Invalid address format - no output>
:::1 <Invalid address format - no output>
codegolf puzzle <Invalid address format - no output>
Ini adalah codegolf , jadi jawaban tersingkat dalam byte pada 6 Juni 2014 akan diterima sebagai pemenang.
sumber
1:0:0:2:2::3
. Apakah output yang diperpendek akan identik dengan itu atau1::2:2:0:0:3
? Sama untuk input yang diperpendek secara tidak optimal.1::2:0:0:0:3
mungkin input?Jawaban:
JavaScript (ES6) -
198,183,180,188, 187 byteDan, versi yang lebih lama, interaktif dengan beberapa pop-up (203 byte):
Tidak Disatukan:
Penjelasan:
Untuk menghitung versi panjang dari alamat IPv6:
8 - str.split(/:+/).length % 9
- hitung berapa nol yang perlu kita masukkan. Mereka adalah 8 - jumlah nilai hex. Di sini% 9 adalah penjaga sehingga tidak akan pernah menjadi angka negatif.replace('::', ':0'.repeat(zeros || 1) + ':')
- ganti "::" dengan nol yang dipisahkan dengan titik dua. Jika tidak ada nol untuk menambahkannya masih menambahkan satu sehingga alamat tidak akan valid pada akhirnyareplace(/^:0|0:$/g, zeros ? '0:0' : '0')
- ini berkaitan dengan kasus khusus ketika alamat dimulai atau diakhiri dengan "::" karenasplit
fungsi menambahkan 1 ke jumlah nilai hex (:: 1 -> ["", "1"])Itu dia! Sekarang mari kita hitung formulir singkat:
replace(/(\b0(:0)*)(?!.*\1:0)/,':')
- ganti baris nol terlama dengan titik dua (tidak peduli berapa banyak).replace(/::+/,'::')
- hapus titik dua tambahan jika adareturn /^(:[\da-f]{1,4}){8}$/i.test(':'+longIP) && [longIP, shortIP];
- uji apakah versi panjang IPv6 valid dan kembalikan kedua versi ataufalse
jika tes gagal.Tes di Firefox:
sumber
1:2:3:4::a:b:c:d
Javascript (E6) 246
305 284 292 319Kasus khusus yang sangat direvisi untuk :: ditangani secara khusus, fase kompres menghindari loop for (tapi tidak terlalu pendek memang)
Saya yakin bahwa fase kompres akhir dapat dibuat lebih pendek. Lagipula tidak sekarangTerima kasih kepada nderscore
Sebagai sebuah program
Input dan output menggunakan js popup, pada dasarnya:
p=prompt,p(F(p()))
Menulis ulang dengan popup dan tanpa definisi fungsi, jumlah char harus di bawah 260Tidak digabungkan dan berkomentar sedikit
Test In console
Uji keluaran
sumber
prompt()
. Berikut adalah beberapa optimisasi yang membawanya ke 290: pastie.org/private/3ccpinzqrvvliu9nkccygPerl - 204
176 190 191 197(202 karakter + 2 untuk
-p
bendera)Contoh:
Penjelasan:
sumber
die
menjadi jalan keluar yang sunyi.1:2:3:4::a:b:c:d
. Ini merupakan kasus khusus menjengkelkan, karena sebagian besar alamat delapan usus tidak valid, tetapi::2:3:4:a:b:c:d
dan1:2:3:4:a:b:c::
keduanya berlaku.sed, 276
Saya memiliki 275 byte di ipshorten.sed, ditambah 1 byte untuk
-r
switchsed -rf
untuk menggunakan ekspresi reguler yang diperluas. Saya menggunakan OpenBSD sed (1) .Pemakaian:
echo ::2:3:4:a:b:c:d | sed -rf ipshorten.sed
Saya menggunakan 22 ekspresi reguler, karena sed tidak dapat membandingkan angka atau membuat array. Untuk setiap baris input, sed menjalankan perintah dan mencetak baris. Selama pengujian, saya menaruh beberapa baris alamat IP yang diduga dalam file, dan mengumpankan file ini ke sed. Referensi untuk ekspresi reguler yang diperluas ada di re_format (7) .
s/^/:/
menambahkan titik dua ekstra ke awal baris. Saya menggunakan titik dua ini untuk bermain golf dua perintah berikutnya./^(:[0-9A-Fa-f]{0,4})*$/!d
memeriksa apakah seluruh baris cocok dengan nol atau lebih banyak kelompok titik dua diikuti oleh nol hingga empat digit heksadesimal.!
meniadakan cek, jadid
hapus garis dengan angka heksadesimal yang terlalu besar atau dengan karakter yang tidak valid. Ketikad
menghapus suatu baris, sed tidak lagi menjalankan perintah pada baris ini.s/:0*([^:])/:\1/g
menghapus 0s terkemuka dari setiap nomor. Itu akan berubah:0000:0000:
menjadi:0:0:
. Saya harus melakukan ini karena loop kontraksi saya hanya berfungsi dengan 0-digit tunggal.s/://
menghapus usus besar tambahan. Itu hanya menghapus usus besar pertama.s/::/:=/
mengubah yang pertama::
menjadi:=
. Ini adalah perintah kemudian yang bisa cocok=
daripada::
, dan jadi=
tidak dihitung sebagai titik dua. Jika tidak ada::
, penggantian ini dengan aman tidak melakukan apa-apa.::
harus membuat setidaknya satu 0, tetapi ada tiga kasus berbeda untuk menempatkan 0 ini.s/(.:=)(.)/\10:\2/
adalah kasus pertama. Jika::
berada di antara dua karakter lain, maka:=
menjadi:=0:
. Ini adalah satu-satunya kasus yang menambahkan tanda titik dua.s/^:=/0&/
adalah kasus kedua. Jika::
pada awal baris, maka letakkan 0 di sana.s/=$/&0/
adalah kasus ketiga, untuk::
di akhir baris.:E
adalah label untuk loop ekspansi./(.*:){7}/!{/=/!d
memulai blok bersyarat jika garis memiliki kurang dari 7 titik dua./=/!d
menghapus garis yang tidak memiliki::
dan tidak cukup titik dua.s//=0:/
menambahkan satu titik dua. Kosong//
mengulangi ekspresi reguler terakhir, jadi ini benar-benars/=/=0:/
.bE
cabang untuk:E
melanjutkan loop.}
menutup blok. Sekarang garis memiliki setidaknya tujuh titik dua.s/=//
menghapus=
./^:|::|:$|(.*:){8}/d
adalah pemeriksaan terakhir setelah ekspansi. Ini menghapus garis dengan usus besar yang memimpin, tambahan::
yang tidak diperluas, usus besar yang tertinggal, atau delapan atau lebih banyak titik dua.p
mencetak baris, yang merupakan alamat IP dalam bentuk panjang.s/.*/:&:/
membungkus alamat dalam titik dua tambahan.:0:0:0:
, dan mengontraknya::
.s/:((0:)+)/:<\1>/g
makan setiap kelompok 0s, jadi:0:0:0:
akan menjadi:<0:0:0:>
.:C
adalah label untuk loop kontraksi.s/0:>/>0:/g
bergerak satu 0 dari setiap mulut, jadi:<0:0:0:>
akan menjadi:<0:0:>0:
./<0/{s/<>//g
membuka blok bersyarat jika ada mulut yang tidak kosong.s/<>//g
menghapus semua mulut kosong, karena grup-grup itu terlalu pendek.bC
melanjutkan loop kontraksi.}
menutup blok. Sekarang setiap mulut kosong dan menandai kelompok 0s terpanjang.s/<>(0:)+/:/
kontrak kelompok terpanjang, jadi:<>0:0:0:
akan menjadi::
. Dalam dasi, ia mengambil mulut kosong di sebelah kiri.s/<>//g
menghapus mulut kosong lainnya./^::/!s/://
menghapus usus besar tambahan pertama kecuali jika itu bagian dari::
./::$/!s/:$//
melakukannya untuk usus besar tambahan terakhir. Kemudian sed mencetak alamat IP dalam bentuk singkat.sumber
Python 3: 387 karakter
Bahkan bekerja dengan input yang diperpendek.
Penggantian ganda
':::'
dengan'::'
terasa sangat buruk tetapi tidak yakin cara menangani string terpanjang dengan 0 saat berbatasan dengan satu atau kedua ujungnya.Ganti final
pass
denganraise
untuk melihat bagaimana itumacetmelindungi terhadap input yang salah format.sumber
1:2:3:4::a:b:c:d
tetapi menolak keduanya::2:3:4:a:b:c:d
dan1:2:3:4:a:b:c::
. Saya percaya itu salah tiga kali.