Hintergrund
Nach dem Anwenden der BWT (wie in Burrows, Wheeler und Back ) und der MTF (wie in Move to the printable ASCII front ) wird die wendet bzip2- Kompressor eine ziemlich einzigartige Form der Lauflängencodierung an.
Definition
Für diese Herausforderung definieren wir die Transformation BRLE wie folgt:
Gehen Sie bei einer Eingabezeichenfolge s , die ausschließlich aus ASCII-Zeichen mit Codepunkten zwischen 0x20 und 0x7A besteht, wie folgt vor:
Ersetzen Sie jeden Lauf gleicher Zeichen durch ein einzelnes Vorkommen des Zeichens und speichern Sie die Anzahl der Wiederholungen nach dem ersten.
Codieren Sie die Anzahl der Wiederholungen nach dem ersten Auftreten des Zeichens mit der bijektiven Basis-2-Nummerierung und den Symbolen
{
und}
.Eine nicht negative ganze Zahl n wird als die Zeichenkette b k … b 0 codiert, so dass n = 2 k i (b k ) +… + 2 0 i (b 0 ) ist , wobei i (
{
) = 1 und i (}
) = 2 .Beachten Sie, dass diese Darstellung immer eindeutig ist. Zum Beispiel kann die Nummer 0 wird als eine leere Zeichenfolge codiert.
Fügen Sie die geschweifte Klammer ein, die die Anzahl der Wiederholungen nach dem einzelnen Auftreten des entsprechenden Zeichens codiert.
Beispiel Schritt für Schritt
Input: "abbcccddddeeeeeffffffggggggghhhhhhhh"
Step 1: "abcdefgh" with repetitions 0, 1, 2, 3, 4, 5, 6, 7
Step 2: "" "{" "}" "{{" "{}" "}{" "}}" "{{{"
Step 3: "ab{c}d{{e{}f}{g}}h{{{"
Aufgabe
Implementieren Sie ein involutives Programm oder eine involutive Funktion, die eine einzelne Zeichenfolge aus STDIN oder als Befehlszeilen- oder Funktionsargument liest und entweder die BRLE oder deren Inverse der Eingabezeichenfolge ausgibt oder zurückgibt.
Wenn die Eingabe keine geschweiften Klammern enthält, wenden Sie BRLE an. Wenn die Eingabe geschweifte Klammern enthält, wenden Sie die Umkehrung an.
Beispiele
INPUT: CODEGOLF
OUTPUT: CODEGOLF
INPUT: PROGRAMMING
OUTPUT: PROGRAM{ING
INPUT: PUZ{LES
OUTPUT: PUZZLES
INPUT: 444488888888GGGGGGGGGGGGGGGGWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWW
OUTPUT: 4{{8{{{G{{{{W{{{{{
INPUT: y}}}{{
OUTPUT: yyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyy
Zusätzliche Regeln
Sie können keine integrierten Funktionen verwenden, die die BRLE oder die Umkehrung einer Zeichenfolge berechnen.
Sie können integrierte Funktionen verwenden, die:
Berechnen Sie die RLE oder RLD eines Strings, solange die Anzahl der Wiederholungen nicht in der bijektiven Basis 2 gespeichert ist.
Grundkonvertierung aller Art durchführen.
Ihr Code druckt möglicherweise eine abschließende neue Zeile, wenn Sie für die Ausgabe STDOUT auswählen.
Ihr Code muss für jede Eingabe von 1000 oder weniger ASCII-Zeichen im Bereich von 0x20 bis 0x7A sowie geschweiften Klammern (0x7B und 0x7D) funktionieren.
Wenn die Eingabe geschweifte Klammern enthält, können Sie davon ausgehen, dass es sich um ein gültiges Ergebnis der Anwendung der BRLE auf eine Zeichenfolge handelt.
Es gelten die Standard-Code-Golfregeln. Die kürzeste Übermittlung in Bytes gewinnt.
quelle
Antworten:
CJam,
5048 BytesVielen Dank für Dennis für das Speichern von 2 Bytes.
Probieren Sie es online aus.
Erläuterung
quelle
Pyth, 48
50Bytes2 Bytes dank @Maltysen.
Demonstration. Kabelbaum testen.
Erläuterung:
quelle
"{}"
können Sie verwenden`H
, mit CJam gebunden :)OCaml, 252
t
ist die Funktion, die die Transformation ausführt.Zuerst dachte ich, ich müsste nach geschweiften Klammern suchen, aber es stellte sich als unnötig heraus. Die Dekodierung hat eindeutig keine Auswirkung auf bereits dekodierte Zeichenfolgen, und der Kodierungsteil erwies sich als ebenso harmlos wie die bereits kodierten.
quelle
the encoding part proved equally harmless
macht es? Codierung verstehst4{{8{{{G{{{{W{{{{{
du nicht4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Eine Erklärung
Nummer n bis BB2 mit 0 und 1:
(n+1).toString(2).slice(1)
Zeichenfolge in BB2 zu Nummer: to_number ("0b1" + Zeichenfolge) - Fügen Sie also eine Binärziffer ganz links hinzu und konvertieren Sie sie von binär (und verringern Sie sie um 1, was in diesem speziellen Fall nicht erforderlich ist).
Regulärer Ausdruck, um ein beliebiges Zeichen zu finden, gefolgt von
{
oder}
:/[^{}][{}]+/g
Regulärer Ausdruck, um wiederholte Zeichen zu finden:
/(.)\1*/g
Unter Verwendung dieses regulären Ausdrucks beim Ersetzen ist der erste Parameter das "wiederholte" Zeichen (eventuell nur ein Mal wiederholen), der zweite Parameter ist die gesamte wiederholte Zeichenfolge, deren Länge die Zahl ist, die ich in BB2 codieren muss, die bereits um 1 erhöht wurde
... dann füge alles zusammen ...
quelle