Este desafio foi publicado como parte do desafio de abril de 2018 do LotM , bem como para o segundo aniversário do Brain-flak
Eu estava pensando sobre qual seria a maneira mais eficiente de codificar programas de ataques cerebrais. O mais óbvio a ser feito, uma vez que existem apenas 8 caracteres válidos, é mapear cada caractere para uma sequência de 3 bits. Isso certamente é muito eficaz, mas ainda é muito redundante. Existem alguns recursos do código de quebra-cérebro que poderíamos aproveitar para encurtar a codificação.
As nilads, todas representadas por 2 colchetes correspondentes, realmente atuam como uma única unidade de informação em vez de 2. Se substituíssemos cada colchete por um caractere de byte único, isso tornaria as codificações muito menores sem perder dados.
Este é menos óbvio, mas os bytes de fechamento das mônadas também são redundantes. Pense que você poderia adivinhar o que os
'?'
caracteres representam no snippet a seguir?{(({}?<>?<>?
Se supusermos que a entrada é um código de falha cerebral válido, existe apenas uma opção para cada um desses pontos de interrogação. Isso significa que podemos usar inequivocamente um caractere de mônada próxima para representar todos os colchetes de fechamento. Isso tem o benefício adicional de manter o conjunto de caracteres pequeno, o que ajudaria muito se desejássemos usar uma codificação huffman. Como o caractere de mônada próxima provavelmente será o caractere mais comum por uma ampla margem, ele poderá ser representado por um único bit, o que é extremamente eficiente.
Esses dois truques nos permitirão compactar o código do cérebro através do seguinte algoritmo:
Substitua todos os colchetes de fechamento de uma mônada por
|
. Ou, em outras palavras, substitua todos os colchetes que não sejam precedidos por sua correspondência de abertura por uma barra. Tão...(({})<(()()())>{})
se tornaria
(({}|<(()()()||{}|
Substitua cada nilad pelo suporte de fechamento. Portanto, colchetes correspondentes sem nada neles usam o seguinte mapeamento:
() --> ) {} --> } [] --> ] <> --> >
Agora, nosso último exemplo se torna:
((}|<()))||}|
Remova os
|
caracteres finais . Como sabemos que o número total de barras deve ser igual ao número total de({[<
caracteres, se houver barras no final ausentes, podemos inferi-las. Então, um exemplo como:({({})({}[()])})
se tornaria
({(}|(}[)
Seu desafio para hoje é reverter esse processo.
Dada uma sequência de ataques cerebrais comprimidos contendo apenas os caracteres (){}[]<>|
, expanda-os para o código original de ataques cerebrais. Você pode supor que a entrada sempre será expandida para um ataque cerebral válido. Isso significa que nenhum prefixo da entrada jamais conterá mais |
de({[<
caracteres.
A entrada não conterá à direita |
caracteres . Estes devem ser inferidos a partir do contexto.
Como de costume, você pode enviar um programa completo ou uma função, e os formatos de entrada / saída são permitidos. E como esse é um código-golfe , seu código será pontuado pelo tamanho do código-fonte em bytes, quanto menor a pontuação, melhor.
Casos de teste
Aqui estão alguns casos de teste. Se você quiser mais, pode gerar seus próprios casos de teste com este script python e o Brain-Flak Wiki , que é a origem da maioria desses casos de teste.
#Compressed code
#Original code
())))
(()()()())
([([}()||||(>||{(})|>|}{((<}|||>}|}>}
([([{}(())])](<>)){({}())<>}{}{((<{}>))<>{}}{}<>{}
({(}|(}[)|||}
({({})({}[()])}{})
(((()))||(](((}}||(}([(((}))||||(]((}}|}|}}|||]||]|[))||(}))|}(}|(}]]|}
((((()()()))([]((({}{}))({}([((({}()())))]([](({}{}){}){}{})))[]))[])[()()])({}()()){}({})({}[][]){}