Doppelte Lauflängencodierung


9

Jeder weiß, was Lauflängencodierung ist. Es war bereits Gegenstand vieler Code-Golf-Herausforderungen. Wir werden uns eine bestimmte Variante ansehen.

Beispiel

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

Die Zahl in Klammern gibt an, wie oft das vorherige Symbol aufgetreten ist. Im Beispiel wurden nur Läufe mit 5 oder mehr Zeichen codiert. Dies liegt daran, dass Codierungsläufe von 4 oder weniger die Anzahl der Zeichen nicht verbessern.

Herausforderung

Schreiben Sie eine Funktion / ein Programm, die bzw. das diese Variation der Lauflängencodierung implementiert, aber auch Läufe mit zwei Symbolen codieren kann. Die Läufe von zwei Symbolen müssen ebenfalls in Klammern stehen. Eine Gruppe wird ebenfalls in Klammern gesetzt. Ihr Programm muss eine Zeichenfolge als Eingabe akzeptieren und die geänderte Zeichenfolge mit Änderungen ausgeben, die die Zeichenfolge verkürzen.

Beispiel

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

Anmerkungen

  • 111wurde nicht codiert, da die Codierung it ( 1(3)) nicht kürzer ist.
  • Die Zeichenfolge 444111kommt dreimal vor, sodass sie codiert ist.
  • 676767wurde nicht codiert, weil ((67)(4))es länger als zuvor ist.
  • 222222277777222222277777wurde nicht als codiert ((222222277777)(2)). Warum? Weil 222222277777sich auf reduzieren kann 2(7)7(5).
  • 123123123123 wird nicht codiert, da Ihr Programm zwei Symbole verarbeiten soll, nicht drei.

Dies ist also gewinnt der kürzeste Code. Tie-Breaker ist frühzeitige Einreichung.


Wenn ich etwas verpasst habe oder wenn Sie sich nicht sicher sind, benachrichtigen Sie mich bitte in den Kommentaren.


Aber es gibt 4 67s.
Undichte Nonne

Müssen wir damit umgehen 441444144414-> ((4414)(3))?
Undichte Nonne

Ich habe es repariert.
Ericw31415

@ KennyLau Nein, wirst du nicht. 4414ist technisch gesehen eine Serie von 4. Mein Wortlaut ist einfach schlecht.
Ericw31415

Kann 111111111als codiert werden (1)(9)?
CalculatorFeline

Antworten:


2

Netzhaut, 162 Bytes

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

Probieren Sie es online aus!


Wenn Sie eingeben 10101010100100100100100, ist die Ausgabe ((10)(5))0((100)(4)), ((10)(4))((100)(5))wäre jedoch ein Zeichen kürzer.
Marv

Müssen Sie wirklich solche Randtestfälle verwenden ...
Leaky Nun

Ja, das ist der ganze Spaß! : ^)
Marv

Es ist lustig, wie dies derzeit die einzige Antwort ist.
Ericw31415
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.