双游程编码


9

每个人都知道游程长度编码是什么。它已经成为许多代码高尔夫球挑战的主题。我们将研究某些变化。

Normal: 11222222222222222222233333111111111112333322
Run-length: 112(19)3(5)1(11)2333322

括号中的数字指定上一个符号出现的次数。在该示例中,仅对5个或更多字符的运行进行编码。这是因为4或更少的编码运行不会改善字符数。

挑战

编写一个实现行程编码这种变化形式的函数/程序,但也可以对两个符号的行程进行编码。两个符号的行也必须用括号括起来。组也将括在括号中。您的程序必须接受一个字符串作为输入,并输出经过修改的字符串并带有缩短该字符串的修改。

Normal: 111244411144411144411167676767222222277777222222277777123123123123
Double run-length: 1112((444111)(3))67676767((2(7)7(5))(2))123123123123

笔记

  • 111未编码,因为对其进行编码(1(3))并不短。
  • 该字符串444111出现3次,因此被编码。
  • 676767未编码,因为((67)(4))比以前更长。
  • 222222277777222222277777未编码为((222222277777)(2))。为什么?因为222222277777本身可以简化为2(7)7(5)
  • 123123123123 未编码,因为您的程序应该处理两个符号而不是三个符号。

这是 所以最短的代码胜出。决胜局是提早提交的。


如果我错过了任何事情,或者您不确定任何事情,请在评论中通知我。


但是有4 67秒。
Leaky Nun

我们将不得不处理441444144414-> ((4414)(3))吗?
Leaky Nun

我已经解决了。
ericw31415 '16

@KennyLau不,你不会。4414从技术上讲是4的系列。我的措辞很糟糕。
ericw31415 '16

可以111111111编码为(1)(9)
CalculatorFeline

Answers:


2

视网膜,162字节

+{`((\d)\2*(?!\2)(\d)\3*|\d)(?<1>\1)+
<<$1><$#1>>
<<([^<>]{1,7})><2>>
$1$1
<<([^<>]{1,3})><3>>
$1$1$1
<<([^<>]{1,2})><4>>
$1$1$1$1
}`<<(.)><(\d+)>>
$1($2)
T`<>`()

在线尝试!


如果输入10101010100100100100100,则输出为((10)(5))0((100)(4)),但((10)(4))((100)(5))要短一个字符。
Marv

你真的有使用这样的边际测试用例....
漏嫩

是的,这就是所有的乐趣!:^)
Marv

有趣的是,这是目前这里唯一的答案。
ericw31415 '16
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.