Kodowanie podwójnej długości

9

Wszyscy wiedzą, co to jest kodowanie ciągłe. Był już przedmiotem wielu wyzwań związanych z golfem. Będziemy patrzeć na pewną odmianę.

Przykład

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

Liczba w nawiasach określa liczbę wystąpień poprzedniego symbolu. W tym przykładzie zakodowano tylko serie 5 lub więcej znaków. Wynika to z faktu, że kodowanie przebiegów 4 lub mniej nie poprawia liczby znaków.

Wyzwanie

Napisz funkcję / program, który implementuje tę odmianę kodowania długości przebiegu, ale może również kodować przebiegi dwóch symboli. Serie dwóch symboli muszą być również ujęte w nawiasy. Grupa zostanie również umieszczona w nawiasach. Twój program musi zaakceptować ciąg jako dane wejściowe i wygenerować zmodyfikowany ciąg z modyfikacjami, które skracają ciąg.

Przykład

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

Notatki

  • 111nie został zakodowany, ponieważ kodowanie go ( 1(3)) nie jest krótsze.
  • Ciąg 444111występuje 3 razy, więc jest zakodowany.
  • 676767nie został zakodowany, ponieważ ((67)(4))jest dłuższy niż wcześniej.
  • 222222277777222222277777nie został zakodowany jako ((222222277777)(2)). Dlaczego? Ponieważ 222222277777sam można sprowadzić do 2(7)7(5).
  • 123123123123 nie jest zakodowany, ponieważ twój program ma obsługiwać dwa symbole, a nie trzy.

To jest więc najkrótszy kod wygrywa. Tie-breaker to wcześniejsze zgłoszenie.


Jeśli coś przeoczyłem lub jeśli czegoś nie jesteś pewien, powiadom mnie w komentarzach.

ericw31415
źródło
Ale są 4 67s.
Leaky Nun
Czy będziemy musieli obsłużyć 441444144414-> ((4414)(3))?
Leaky Nun
Naprawiłem to.
ericw31415
@KennyLau Nie, nie będziesz. 4414jest technicznie serią 4. Moje sformułowanie jest po prostu złe.
ericw31415
Czy 111111111można zakodować jako (1)(9)?
CalculatorFeline

Odpowiedzi:

2

Siatkówka, 162 bajty

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

Wypróbuj online!

Leaky Nun
źródło
Jeśli wprowadzisz 10101010100100100100100, wynik będzie ((10)(5))0((100)(4)), ale ((10)(4))((100)(5))będzie o jeden znak krótszy.
Marv
Czy naprawdę musisz używać takich marginalnych przypadków testowych ...
Leaky Nun
Tak, to cała zabawa! : ^)
Marv
Zabawne, że jest to jedyna obecnie dostępna odpowiedź.
ericw31415