反向的也还好,下面是229个字节的版本,支持你提到的省略方式(Python3带类型注释,去掉可以更少点):
# decode the run-length encoded string
In [1]: def decode(code: str) -> str:
...: num = lambda s, n: (s and s[0].isdigit()) and num(s[1:], 10*n + int(s[0])) or (n, s)
...: dec = lambda h, n, s: h * max(n, 1) + (s and dec(s[0], *num(s[1:], 0)) or '')
...: return dec('', 0, code)
...:
In [2]: decode('A4a2B1C3D2e1')
Out[2]: 'AAAAaaBCCCDDe'
In [3]: decode('ab12c3de5fg')
Out[3]: 'abbbbbbbbbbbbcccdeeeeefg'
下面是Scala版的encode与decode,加起来也不到255个字节:
// run length decode and encode
scala> def encode(str: String): String = raw"((\w)\2*)".r.findAllIn(str).map(s => s"${s(0)}${s.size}").mkString
| def decode(str: String): String = raw"\w\d+".r.findAllIn(str).map(s => s.take(1) * s.drop(1).toInt).mkString
scala> encode("AAAAaaBCCCDDe")
val res3: String = A4a2B1C3D2e1
scala> decode("A4a2B1C3D2e1")
val res4: String = AAAAaaBCCCDDe
【 在 k7amd 的大作中提到: 】
: 如果是楼主的题目反向,不import不容易写短,因为没有字符串转数值的简便方法,即只转换能转成数值的部分。
: 如下程序
: 输入'A4a2B1C3D2e1',输出'AAAAaaBCCCDDe'
: ...................
--
FROM 183.192.14.*