#9365. IPv6地址压缩(洛谷 - P2815)

IPv6地址压缩(洛谷 - P2815)

说明

【IPv6 格式】

IPv6 二进位制下为 128 位长度,以 16 位为一组,每组以冒号“:”隔开,可以分为 8 组,每组以 4 位十六进制方式表示。

比如 2001:0db8:0000:0000:0123:4567:89ab:cdef 是一个合法的 IPv6 地址。

同时 IPv6 地址在某些条件下可以压缩:

  1. 每组数字代表的独立十六进制数可以省略前位的 0

比如上面的 IPv6 地址可被压缩为 2001:db8:0:0:123:4567:89ab:cdef

  1. 可以用双冒号 :: 表示一组 0 或多组连续的 0,但只能出现一次。

比如上面的 IPv6 地址可被压缩为 2001:db8::123:4567:89ab:cdef

请你帮助记忆力不好的网络工程师小明解决他遇到的问题。

【规则补充】

  1. 输入数据为完全展开的 IPv6 地址,确保输入的 IPv6 地址不含双冒号,每组地址省略的 0 都会被补充上去。

  2. 双冒号只能使用一次,因此我们压缩最长的全 0 组。

比如 2001:0db8:0000:0000:1:0000:0000:0000,压缩为 2001:db8:0:0:1::,而非 2001:db8::1:0:0:0

  1. 双冒号只能使用一次,因此我们在我们遇到地址中多个连续全 0 组长度相同时,我们压缩最前面的一个。

比如 2001:0db8:0000:0000:ffff:0000:0000:1,压缩为 2001:db8::ffff:0:0:1,而非 2001:db8:0:0:ffff::1

  1. 输入的 IPv6 地址可能无法被压缩,此时请照原样输出。

提示:本题所示的压缩规则与 macOS (Darwin) 默认的 IPv6 地址显示方式相同,而 Windows 和 Linux 只遇到一组全 0 时不会使用 :: 进行压缩。但用此方法压缩过的 IPv6 地址一样可以被 Windows 和 Linux 正确识别。

比如 2001:0db8:ffff:0000:0123:4567:89ab:cdef,Darwin 压缩为 2001:db8:ffff::123:4567:89ab:cdef,而 Linux 和 Windows 压缩为 2001:db8:ffff:0:123:4567:89ab:cdef

输入格式

一串 39 个字符的字符串,代表一个完全展开的 IPv6 地址。

输出格式

一串压缩后的 IPv6 地址。

2406:0840:f990:0000:0000:0000:0000:0001
2406:840:f990::1

提示

原题链接

Source

模拟 字符串