sfondo
Dopo aver applicato il BWT (come visto in Burrows, Wheeler e Back ) e l'MTF (come visto in Sposta sul fronte ASCII stampabile ), il compressore bzip2 applica una forma piuttosto unica di codifica di lunghezza di esecuzione.
Definizione
Ai fini di questa sfida, definiamo la trasformazione BRLE come segue:
Data una stringa di input s che si compone esclusivamente di caratteri ASCII con punti di codice tra 0x20 e 0x7A, effettuare le seguenti operazioni:
Sostituisci ogni serie di caratteri uguali con una singola occorrenza del personaggio e memorizza il numero di ripetizioni dopo la prima.
Codifica il numero di ripetizioni dopo la prima occorrenza del personaggio , usando la numerazione biiettiva base-2 e i simboli
{
e}
.Un numero intero non negativo n è codificato come stringa b k … b 0 tale che n = 2 k i (b k ) +… + 2 0 i (b 0 ) , dove i (
{
) = 1 e i (}
) = 2 .Nota che questa rappresentazione è sempre unica. Ad esempio, il numero 0 è codificato come una stringa vuota.
Inserisci la stringa di parentesi graffe che codifica il numero di ripetizioni dopo la singola occorrenza del carattere corrispondente.
Esempio passo-passo
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{{{"
Compito
Implementare un programma o una funzione involutiva che legge una singola stringa da STDIN o come argomento della riga di comando o della funzione e stampa o restituisce BRLE o il suo inverso della stringa di input.
Se l'input non contiene parentesi graffe, applicare BRLE. Se l'input contiene parentesi graffe, applicare il suo inverso.
Esempi
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
Regole aggiuntive
Non è possibile utilizzare alcun built-in che calcola BRLE o il suo inverso di una stringa.
È possibile utilizzare built-in che:
Calcola RLE o RLD di una stringa, purché il numero di ripetizioni non sia memorizzato in bijective base-2.
Esegui la conversione di base di qualsiasi tipo.
Il codice può stampare una riga finale se si sceglie STDOUT per l'output.
Il codice deve funzionare per qualsiasi input di 1000 o meno caratteri ASCII nell'intervallo da 0x20 a 0x7A, oltre alle parentesi graffe (0x7B e 0x7D).
Se l'input contiene parentesi graffe, si può presumere che sia un risultato valido dell'applicazione di BRLE a una stringa.
Si applicano le regole standard per il golf. Vince l'invio più breve in byte.