Mã hóa chiều dài gấp đôi


9

Mọi người đều biết mã hóa chiều dài chạy là gì. Nó đã là chủ đề của nhiều thử thách golf-code. Chúng ta sẽ xem xét một biến thể nhất định.

Thí dụ

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

Số trong ngoặc đơn chỉ định số lần biểu tượng trước đó xảy ra. Trong ví dụ, chỉ có 5 ký tự trở lên được mã hóa. Điều này là do mã hóa chạy từ 4 trở xuống không cải thiện số lượng ký tự.

Thử thách

Viết hàm / chương trình thực hiện biến thể mã hóa độ dài chạy này, nhưng cũng có thể mã hóa các lần chạy của hai ký hiệu. Việc chạy hai biểu tượng cũng phải được đặt trong ngoặc đơn. Một nhóm cũng sẽ được đặt trong ngoặc đơn. Chương trình của bạn phải chấp nhận một chuỗi làm đầu vào và xuất chuỗi đã sửa đổi với các sửa đổi rút ngắn chuỗi.

Thí dụ

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

Ghi chú

  • 111đã không được mã hóa vì mã hóa nó ( 1(3)) không ngắn hơn.
  • Chuỗi 444111xảy ra 3 lần nên được mã hóa.
  • 676767đã không được mã hóa vì ((67)(4))dài hơn trước.
  • 222222277777222222277777đã không được mã hóa thành ((222222277777)(2)). Tại sao? Bởi vì 222222277777chính nó có thể được giảm xuống 2(7)7(5).
  • 123123123123 không được mã hóa bởi vì chương trình của bạn có nghĩa vụ xử lý các lần chạy của hai biểu tượng chứ không phải ba.

Đây là nên mã ngắn nhất sẽ thắng. Tie-breaker là trình sớm.


Nếu tôi bỏ lỡ bất cứ điều gì, hoặc nếu bạn không chắc chắn về bất cứ điều gì xin vui lòng thông báo cho tôi trong các ý kiến.


Nhưng có 4 67s.
Rò rỉ Nun

Chúng tôi sẽ phải xử lý 441444144414-> ((4414)(3))?
Rò rỉ Nun

Tôi đã sưa nó.
ericw31415

@KennyLau Không, bạn sẽ không. 4414về mặt kỹ thuật là một loạt 4. Từ ngữ của tôi chỉ là xấu.
ericw31415

Có thể 111111111được mã hóa như (1)(9)?
Máy

Câu trả lời:


2

Võng mạc, 162 byte

+{`((\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`<>`()

Hãy thử trực tuyến!


Nếu bạn nhập 10101010100100100100100, đầu ra là ((10)(5))0((100)(4)), nhưng ((10)(4))((100)(5))sẽ ngắn hơn một ký tự.
Marv

Bạn có thực sự phải sử dụng các thử nghiệm cận biên như vậy không ....
Leaky Nun

Vâng, đó là tất cả niềm vui! : ^)
Marv

Thật buồn cười khi đây là câu trả lời duy nhất hiện tại.
ericw31415
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.