Questa sfida è stata pubblicata come parte della sfida LotM di aprile 2018 , nonché per il 2 ° compleanno di Brain-flak
Stavo pensando a quale sarebbe stato il modo più efficace per codificare i programmi di scoria cerebrale. La cosa ovvia da fare, dato che ci sono solo 8 caratteri validi, è mappare ogni personaggio in una sequenza a 3 bit. Questo è certamente molto efficace, ma è ancora molto ridondante. Ci sono alcune caratteristiche del codice brain-flak che potremmo sfruttare per abbreviare la codifica.
I nilad, che sono tutti rappresentati da 2 parentesi abbinate, agiscono in realtà come una singola unità di informazioni anziché 2. Se sostituiamo ogni parentesi con un carattere a byte singolo, questo renderebbe le codifiche molto più piccole senza perdere alcun dato.
Questo è meno ovvio, ma anche i byte di chiusura delle monadi sono ridondanti. Pensi di poter indovinare cosa
'?'
rappresentano i personaggi nel seguente frammento?{(({}?<>?<>?
Se assumiamo che l'input sia un codice valido per il cervello, allora c'è solo un'opzione per ciascuno di quei punti interrogativi. Ciò significa che possiamo usare inequivocabilmente un carattere di monade vicino per rappresentare ogni parentesi di chiusura. Ciò ha l'ulteriore vantaggio di mantenere piccolo il set di caratteri, il che sarebbe di grande aiuto se volessimo usare una codifica huffman. Poiché il personaggio della monade stretta sarà molto probabilmente il personaggio più comune con un ampio margine, potrebbe essere rappresentato da un singolo bit, che è estremamente efficiente.
Questi due trucchi ci permetteranno di comprimere il codice del cervello-flak tramite il seguente algoritmo:
Sostituisci ogni staffa di chiusura di una monade con
|
. O in altre parole, sostituisci ogni barra di chiusura che non è preceduta dalla relativa apertura con una barra. Così...(({})<(()()())>{})
potrebbe diventare
(({}|<(()()()||{}|
Sostituisci ogni nilad con la sua staffa di chiusura. Pertanto, le parentesi corrispondenti che non contengono nulla utilizzano la seguente mappatura:
() --> ) {} --> } [] --> ] <> --> >
Ora il nostro ultimo esempio diventa:
((}|<()))||}|
Rimuovi i
|
caratteri finali . Poiché sappiamo che il numero totale di barre dovrebbe essere uguale al numero totale di({[<
caratteri, se alla fine mancano delle barre, possiamo dedurle. Quindi un esempio come:({({})({}[()])})
potrebbe diventare
({(}|(}[)
La tua sfida per oggi è invertire questo processo.
Data una stringa di scoria cerebrale compressa contenente solo i caratteri (){}[]<>|
, espanderla nel codice originale di scoria cerebrale. Si può presumere che l'input si espanderà sempre fino a essere valido. Ciò significa che nessun prefisso dell'input conterrà mai più |
di ({[<
caratteri.
L'input non conterrà |
caratteri finali . Questi devono essere dedotti dal contesto.
Come al solito, è possibile inviare un programma completo o una funzione e i formati di input / output sono permissivi. E poiché si tratta di un codice-golf , il tuo codice verrà assegnato in base alla lunghezza del codice sorgente in byte, più piccolo è il punteggio, migliore è.
Casi test
Ecco alcuni casi di test. Se desideri di più, puoi generare i tuoi casi di test con questo script Python e il Wiki Brain-Flak , che è la fonte da cui provengono la maggior parte di questi casi di test.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}