Çift çalışma uzunluğu kodlaması


9

Herkes çalışma uzunluğu kodlamasının ne olduğunu bilir. Zaten birçok kod-golf zorluğunun konusu olmuştur. Belli bir varyasyona bakacağız.

Misal

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

Parantez içindeki sayı, önceki sembolün kaç kez meydana geldiğini belirtir. Örnekte, yalnızca 5 veya daha fazla karakterden oluşan çalışmalar kodlanmıştır. Bunun nedeni, 4 veya daha düşük kodlama işlemlerinin karakter sayısını iyileştirmemesidir.

Meydan okuma

Çalışma uzunluğu kodlamasının bu varyasyonunu uygulayan, ancak iki sembolün çalışmalarını da kodlayabilen bir işlev / program yazın. İki sembolün çalışmaları da parantez içine alınmalıdır. Bir grup ayrıca parantez içine alınacaktır. Programınız bir dizeyi giriş olarak kabul etmeli ve değiştirilmiş dizeyi dizeyi kısaltan değişikliklerle çıkarmalıdır.

Misal

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

notlar

  • 111( 1(3)) kodlaması daha kısa olmadığı için kodlanmadı .
  • Dize 444111, kodlanacak şekilde 3 kez oluşur.
  • 676767kodlanamadı çünkü ((67)(4))öncekinden daha uzun.
  • 222222277777222222277777olarak kodlanmadı ((222222277777)(2)). Neden? Çünkü 222222277777kendisi azaltılabilir 2(7)7(5).
  • 123123123123 programınızın üç değil iki sembolden oluşması gerektiği için kodlanmamıştır.

Bu en kısa kod kazanır. Tie-breaker erken teslimdir.


Bir şey kaçırdıysam ya da bir şeyden emin değilseniz lütfen yorumlarda bana haber verin.


Ama 4 67s var.
Leaky Nun

Ele almamız gerekecek 441444144414-> ((4414)(3))?
Leaky Nun

Ben tamir ettim.
ericw31415

@KennyLau Hayır, yapmayacaksınız. 4414teknik olarak 4 serisidir. İfadelerim sadece kötü.
ericw31415

Can 111111111olarak kodlanmış (1)(9)?
CalculatorFeline

Yanıtlar:


2

Retina, 162 bayt

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

Çevrimiçi deneyin!


Girilecek Eğer 10101010100100100100100, çıkışı ((10)(5))0((100)(4)), henüz ((10)(4))((100)(5))bir karakter daha kısa olacaktır.
Marv

Gerçekten böyle marjinal testcasları kullanmak zorunda mısın ....
Leaky Nun

Evet, hepsi bu kadar eğlenceli! : ^)
Marv

Şu anda buradaki tek cevap nasıl komik.
ericw31415
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.