tło
Po zastosowaniu BWT (jak widać w Burrows, Wheeler and Back ) i MTF (jak widać w Move to the printable ASCII front ), bzip2 kompresor stosuje raczej unikalną formę kodowania długości przebiegu.
Definicja
Na potrzeby tego wyzwania definiujemy transformację BRLE w następujący sposób:
Biorąc pod uwagę ciąg wejściowy S , który składa się wyłącznie ze znaków ASCII z punktów kodowych między 0x20 i 0x7A, wykonaj następujące czynności:
Zastąp każdy ciąg równych znaków pojedynczym wystąpieniem znaku i zapisz liczbę powtórzeń po pierwszym.
Zakoduj liczbę powtórzeń po pierwszym wystąpieniu znaku , używając numeracji bijective base-2 i symboli
{
i}
.Nieujemna liczba całkowita n jest kodowana jako ciąg b k … b 0 w taki sposób, że n = 2 k i (b k ) +… + 2 0 i (b 0 ) , gdzie i (
{
) = 1 i i (}
) = 2 .Pamiętaj, że ta reprezentacja jest zawsze unikalna. Na przykład liczba 0 jest kodowana jako pusty ciąg.
Wstaw ciąg nawiasów klamrowych, który koduje liczbę powtórzeń po pojedynczym wystąpieniu odpowiedniego znaku.
Przykład krok po kroku
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{{{"
Zadanie
Zaimplementuj program lub funkcję, która odczytuje pojedynczy ciąg znaków ze STDIN lub jako argument wiersza polecenia lub funkcji i wypisuje lub zwraca BRLE lub jego odwrotność ciągu wejściowego.
Jeśli dane wejściowe nie zawierają nawiasów klamrowych, zastosuj BRLE. Jeśli dane wejściowe zawierają nawiasy klamrowe, zastosuj odwrotność.
Przykłady
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
Dodatkowe zasady
Nie można używać żadnych wbudowanych funkcji, które obliczają BRLE lub jego odwrotność.
Państwo może używać Zabudowy że:
Oblicz RLE lub RLD ciągu, o ile liczba powtórzeń nie jest przechowywana w bijective base-2.
Wykonaj dowolną konwersję podstawową.
Twój kod może wydrukować końcowy znak nowej linii, jeśli wybierzesz STDOUT jako wynik.
Twój kod musi działać na każdym wprowadzeniu 1000 lub mniej znaków ASCII w zakresie od 0x20 do 0x7A, a także nawiasach klamrowych (0x7B i 0x7D).
Jeśli dane wejściowe zawierają nawiasy klamrowe, możesz założyć, że jest to poprawny wynik zastosowania BRLE do łańcucha.
Obowiązują standardowe zasady gry w golfa. Najkrótsze przesłanie w bajtach wygrywa.