Inspirado por A014486 .
Desafio
Dada uma entrada inteira na base 10, construa uma representação para a floresta binária correspondente à entrada. As representações incluem, mas não estão limitadas a, matrizes e cadeias aninhadas.
Quão?
Converta a entrada em binário. 1
s representam ramos 0
es representam folhas.
Para facilitar a compreensão, vamos usar 834
(1101000010 em binário) como exemplo.
Começamos com o primeiro dígito. O primeiro dígito é a 1
, então desenhamos ramificações:
\ / 1 1
ou como uma matriz, {{1}}
O próximo dígito é 1
, portanto, desenhamos mais ramos (vamos da esquerda para a direita):
\ / 1 1 \ / 1 1
ou como uma matriz, {{1, {1}}}
O próximo dígito é 0
, então colocamos uma folha:
0 0 \ / 1 1 \ / 1 1
ou como uma matriz, {{1, {1, 0}}}
O próximo dígito é a 1
, então colocamos um ramo:
\ / 0 1 \ / 1 1 \ / 1 1
ou como uma matriz, {{1, {1, 0, {1}}}}
Repetindo o processo, obtemos a seguinte árvore após o oitavo dígito:
0 0 \ / 0 1 \ / 1 0 \ / 1 1
ou como uma matriz, {{1, {1, 0, {1, 0, 0}}, 0}}
Para os dígitos restantes, desenhamos mais árvores:
O nono dígito é um 0
, então colocamos uma folha (aww, é um broto jovem!)
0 0 \ / 0 1 \ / 1 0 \ / 1 0
ou como uma matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0}
Quando usamos todos os dígitos, terminamos com o seguinte:
0 0 \ / 0 1 \ / 1 0 0 \ / \ / 1 0 1
ou como uma matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0}}
Isso parece estranho, por isso, preenchemos um zero para completar a árvore:
0 0 \ / 0 1 \ / 1 0 0 0 \ / \ / 1 0 1
ou como uma matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0, 0}}
Observe que o achatamento da matriz gera o número original em binário, mas com um zero preenchido.
Critério
- A saída deve mostrar claramente a separação das árvores e galhos (se não for uma matriz aninhada, explique seu formato de saída).
- A extração de todos os dígitos da saída deve ser idêntica à representação binária da entrada (com os zero preenchidos do processo acima).
Casos de teste
A saída pode diferir desde que atenda aos critérios.
0 -> {0} 1 -> {{1, 0, 0}} 44 -> {{1, 0, {1, {1, 0, 0}, 0}}} 63 -> {{1, {1, {1, {1, {1, {1, 0, 0}, 0}, 0}, 0}, 0}, 0}, 0}} 404 -> {{1, {1, 0, 0}, {1, 0, {1, 0, 0}}}} 1337 -> {{1, 0, {1, 0, 0}}, {1, {1, {1, 0, 0}, {1, 0, 0}}, 0}}
Pontuação
Isso é código-golfe , então os bytes mais baixos vencem!
fonte
Respostas:
JavaScript (ES6),
968980797473 bytesDefine uma função
f
que retorna uma matriz aninhada. O código HTML é apenas para teste.fonte
$&
fazendo sem.replace
?" : PBefunge,
138117104 bytesExperimente online!
Explicação
A linha 1 lê um número de stdin e a linha 2 converte esse número em uma sequência binária que ele armazena no campo de jogo na linha 10. As linhas 3 a 5 então iteram sobre esses dígitos binários, produzindo a representação de árvore apropriada à medida que cada dígito é processado. A pilha Befunge é usada para acompanhar a profundidade da árvore e quanto espaço de folha resta em cada nível, para que saibamos quando criar um novo galho. As linhas 6 e 7 lidam com o
0
preenchimento final para preencher as folhas vazias.Para jogar isso o máximo possível, removi as vírgulas da saída, bem como as chaves externas estranhas. Isso ainda não superou a solução Mathematica, mas foi divertido tentar.
Se você quiser ver como era o formato de saída detalhado original, salvei uma versão anterior do código aqui (131 bytes).
fonte
Mathematica,
167161 bytesFunção anônima. Pega um número como entrada e retorna uma lista arbitrariamente aninhada de números como saída. Quebras de linha adicionadas para maior clareza. Usa algum mecanismo que envolve continuações, mas estou cansado demais para pensar sobre isso por mais tempo.
fonte
#[[1]]
a#&@@#
deve salvar um byte.!#~FreeQ~1
em vez de#~MemberQ~1
salvar um byte também.Mathematica,
11510910810498 bytesGera mensagens de erro que podem ser ignoradas com segurança. Produz uma floresta binária. É um pouco diferente da saída de amostra porque
1
é umHead
, não o primeiro elemento de uma lista. (por exemplo, em1[0, 0]
vez de{1, 0, 0}
)Versão sem erros (104 bytes)
Explicação
Converta a entrada em uma lista de base 2. Guarde-o
i
.SetDelay
f
o seguinte (avaliado sempre quef
for chamado):Switch
declaração.Primeiro, se
i
estiver vazio, saia0
. Caso contrário, imprima o primeiro elemento dei
e solte-o da lista. Use a saída como a variável de controle.Se a variável de controle for
0
, output0
. Se for1
, saída1[f, f]
(recursiva).Enquanto
i
não estiver vazio, continue ligandof
. Saída do resultado, embrulhado comList
.Exemplo
Solução alternativa (120 bytes)
Idêntico à minha solução de 104 bytes, mas converte a saída no formato fornecido na pergunta.
fonte
Python 2,
133118117 bytesParcialmente recursivo, parcialmente iterativo. Tentei usar um número inteiro, mas a árvore começa com os bits mais significativos, então não acho que valha a pena.
Experimente online
fonte
Java 8, 367 bytes
Golfe:
Ungolfed:
fonte
DUP , 84 bytes (82 caracteres)
Por razões de golfe, me livrei das chaves externas e das vírgulas, porque elas não são necessárias para reconstruir as árvores.
Exemplo de saídas:
Explicação:
Experimente com o interpretador Javascript DUP on-line em quirkster.com ou clone meu repositório GitHub do meu interpretador DUP escrito em Julia.
fonte