Inspirado en A014486 .
Reto
Dada una entrada entera en la base 10, construya una representación para el bosque binario correspondiente a la entrada. Las representaciones incluyen, entre otras, matrices y cadenas anidadas.
¿Cómo?
Convierta la entrada a binario. 1
s representan ramas y 0
s representan hojas.
Para que esto sea más fácil de entender, usemos 834
(1101000010 en binario) como ejemplo.
Comenzamos con el primer dígito. El primer dígito es a 1
, por lo que dibujamos ramas:
\ / 1
o como una matriz, {{1}}
El siguiente dígito es 1
, por lo que dibujamos más ramas (vamos de izquierda a derecha):
\ / 1 \ / 1
o como una matriz, {{1, {1}}}
El siguiente dígito es 0
, así que colocamos una hoja:
0 0 \ / 1 \ / 1
o como una matriz, {{1, {1, 0}}}
El siguiente dígito es un 1
, así que colocamos una rama:
\ / 0 1 \ / 1 \ / 1
o como una matriz, {{1, {1, 0, {1}}}}
Repitiendo el proceso, obtenemos el siguiente árbol después del octavo dígito:
0 0 \ / 0 1 \ / 1 0 \ / 1
o como una matriz, {{1, {1, 0, {1, 0, 0}}, 0}}
Para los dígitos restantes, dibujamos más árboles:
El noveno dígito es un 0
, así que colocamos una hoja (¡aww, es un brote joven!)
0 0 \ / 0 1 \ / 1 0 \ / 1 0
o como una matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0}
Cuando usamos todos los dígitos, terminamos con esto:
0 0 \ / 0 1 \ / 1 0 0 \ / \ / 1 0 1
o como una matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0}}
Eso se ve raro, así que rellenamos un cero para completar el árbol:
0 0 \ / 0 1 \ / 1 0 0 0 \ / \ / 1 0 1
o como una matriz, {{1, {1, 0, {1, 0, 0}}, 0}, 0, {1, 0, 0}}
Tenga en cuenta que al aplanar la matriz se obtiene el número original en binario, pero con un cero rellenado.
Criterios
- La salida debe mostrar claramente la separación de los árboles y las ramas (si no es una matriz anidada, explique su formato de salida).
- La extracción de todos los dígitos de la salida debe ser idéntica a la representación binaria de la entrada (con los cero rellenados del proceso anterior).
Casos de prueba
El resultado puede diferir siempre que cumpla con los criterios.
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}} 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}}
Tanteo
Este es el código de golf , por lo que gana los bytes más bajos.
fuente
Respuestas:
JavaScript (ES6),
968980797473 bytesDefine una función
f
que devuelve una matriz anidada. El código HTML es solo para probar.fuente
$&
haciendo sin.replace
?" : PBefunge,
138117104 bytesPruébalo en línea!
Explicación
La línea 1 lee un número de stdin, y la línea 2 convierte ese número en una secuencia binaria que almacena en el campo de juego en la línea 10. Las líneas 3 a 5 luego iteran sobre esos dígitos binarios, generando la representación de árbol apropiada a medida que se procesa cada dígito. La pila Befunge se usa para realizar un seguimiento de la profundidad en el árbol y cuánto espacio de hoja queda en cada nivel para que sepamos cuándo crear una nueva rama. Las líneas 6 y 7 manejan el
0
relleno final para llenar las hojas vacías.Para jugar golf tanto como sea posible, eliminé las comas de la salida, así como los soportes externos extraños. Esto todavía no ha superado la solución de Mathematica, pero ha sido divertido intentarlo.
Si desea ver cómo se veía con el formato de salida detallado original, guardé una versión anterior del código aquí (131 bytes).
fuente
Mathematica,
167161bytesFunción anónima. Toma un número como entrada y devuelve una lista arbitrariamente anidada de números como salida. Saltos de línea añadidos para mayor claridad. Utiliza algunos mecanismos que implican continuaciones, pero estoy demasiado cansado para pensarlo más.
fuente
#[[1]]
que#&@@#
debe guardar un byte.!#~FreeQ~1
en lugar de#~MemberQ~1
guardar un byte también.Mathematica,
11510910810498 bytesGenera mensajes de error que pueden ignorarse de forma segura. Produce un bosque binario. Es ligeramente diferente de la salida de muestra porque
1
es unHead
, no el primer elemento de una lista. (por ejemplo, en1[0, 0]
lugar de{1, 0, 0}
)Versión sin errores (104 bytes)
Explicación
Convierta la entrada a una lista de base 2. Almacenarlo en
i
.SetDelay
f
lo siguiente (evaluado cada vez quef
se llama):Switch
declaración.Primero, si
i
está vacío, salida0
. De lo contrario, muestre el primer elementoi
y suéltelo de la lista. Use la salida como la variable de control.Si la variable de control es
0
, salida0
. Si es así1
, salida1[f, f]
(recursiva).Mientras
i
no esté vacío, sigue llamandof
. Salida del resultado, envuelto conList
.Ejemplo
Solución alternativa (120 bytes)
Idéntico a mi solución de 104 bytes, pero convierte la salida al formato dado en la pregunta.
fuente
Python 2,
133118117 bytesParcialmente recursivo, parcialmente iterativo. Intenté usar un número entero, pero el árbol comienza con los bits más significativos, por lo que no creo que valga la pena.
Pruébalo en línea
fuente
Java 8, 367 bytes
Golfizado:
Sin golf:
fuente
DUP , 84 bytes (82 caracteres)
Por razones de golf, me deshice de las llaves exteriores y las comas porque no son necesarias para reconstruir los árboles.
Salidas de ejemplo:
Explicación:
Pruébelo con el intérprete DUP Javascript en línea en quirkster.com o clone mi repositorio GitHub de mi intérprete DUP escrito en Julia.
fuente