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.
źródło
Odpowiedzi:
CJam,
5048 bajtówDzięki za Dennisa za oszczędność 2 bajtów.
Wypróbuj online.
Wyjaśnienie
źródło
Pyth, 48
50bajtów2 bajty dzięki @Maltysen.
Demonstracja. Uprząż testowa.
Wyjaśnienie:
źródło
"{}"
możesz używać`H
, związany z CJam :)OCaml, 252
t
jest funkcją, która dokonuje transformacji.Na początku myślałem, że muszę sprawdzić obecność nawiasów klamrowych, ale okazało się to niepotrzebne. Dekodowanie wyraźnie nie ma wpływu na ciągi, które są już dekodowane, a część kodująca okazała się równie nieszkodliwa jak te, które zostały już zakodowane.
źródło
the encoding part proved equally harmless
czy to? Kodowanie4{{8{{{G{{{{W{{{{{
nie rozumiesz4{{8{}G{{{W{{}
?JavaScript ( ES6 ), 162
Jakieś wyjaśnienie
Liczba n do BB2 przy użyciu 0 i 1:
(n+1).toString(2).slice(1)
Łańcuch w BB2 na numer: to_number („0b1” + ciąg) - to znaczy dodaj 1 lewą cyfrę binarną i przekonwertuj z binarnej (i zmniejsz o 1, niepotrzebne w tym konkretnym przypadku).
Wyrażenie regularne, aby znaleźć dowolny znak, po którym następuje
{
lub}
:/[^{}][{}]+/g
Wyrażenie regularne, aby znaleźć powtarzające się znaki:
/(.)\1*/g
Używając tego wyrażenia regularnego w zamian, pierwszy parametr jest „powtarzanym” char (w końcu powtórzy tylko 1 raz), drugi parametr jest całkowitym powtórzonym ciągiem, którego długość jest liczbą, którą muszę zakodować w BB2 już zwiększoną o 1
... a następnie złóż wszystko razem ...
źródło