#P2815. IPv6地址压缩

IPv6地址压缩

Description

【IPv6 格式】

IPv6 二进位制下为 128128 位长度,以 1616 位为一组,每组以冒号“:”隔开,可以分为 88 组,每组以 44 位十六进制方式表示。

比如 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

Input Format

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

Output Format

一串压缩后的 IPv6 地址。

2406:0840:f990:0000:0000:0000:0000:0001
2406:840:f990::1
2a13:1801:018a:00cf:0100:0000:0000:0000
2a13:1801:18a:cf:100::
2001:4860:4860:0000:0000:0000:0000:8888
2001:4860:4860::8888
2001:0db8:0000:0000:0000:0000:0000:0001
2001:db8::1
0000:0000:0000:0000:0000:0000:0000:0000
::
0000:0000:0000:0000:0000:0000:0000:0001
::1
2001:0db8:ffff:0000:0123:4567:89ab:cdef
2001:db8:ffff::123:4567:89ab:cdef
1234:5678:9abc:def0:1234:5678:9abc:def0
1234:5678:9abc:def0:1234:5678:9abc:def0
0001:0000:0000:0000:0000:0000:0000:0001
1::1
0000:0000:0000:0000:0000:0000:0001:0002
::1:2