El desafío es simple: escribir un programa o función que, cuando se le da un número entero no negativo finito, genera una matriz anidada.
Las normas
- Su código debe producir una matriz anidada válida única para cada número entero 0 ≤ n <2 31 .
- Cada posible matriz anidada con hasta 16 paréntesis abiertos debe enviarse dentro de este rango. (Esto no significa que su código nunca pueda generar una matriz anidada con más de 16 paréntesis abiertos).
- Su código puede generar una representación de cadena de la matriz anidada en lugar de una matriz real (con o sin comas).
Un posible mapeo:
0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.
Tanteo
Este es el código de golf , por lo que gana el código más corto en bytes.
code-golf
array-manipulation
balanced-string
ETHproducciones
fuente
fuente
Respuestas:
Python 2.7,
172149124118bytesExplicación:
Defina una biyección por
[
↔1
y]
↔0
. Cualquier disposición de corchetes se puede escribir como un número binario y viceversa, por ejemplo[][]
↔1010
(10) y[[][]]
↔110100
(52). Todos los arreglos válidos de hasta 15 corchetes abiertos (30 corchetes en total) están cubiertos por números de hasta 30 bits (ignorando los ceros iniciales), que son precisamente los números menores que 2 31 .El primer bucle for da el inverso de esta biyección, convirtiendo un número en una disposición de corchetes, mientras verifica que la disposición sea válida.
Los arreglos no válidos se reemplazan dentro de la declaración de impresión por secuencias largas de corchetes para evitar colisiones. Por ejemplo
11
(3) ↔[[
no es válido, por lo que concatenamos 3 + 16 corchetes. Esto asegura que todos los arreglos sean únicos.La disposición resultante se coloca dentro de un par de soportes para hacer una matriz anidada, de modo que
1010
(10) se convierte en[[][]]
y110100
(52) se convierte[[[][]]]
. El soporte abierto adicional significa que ahora hemos cubierto todos los arreglos con 16 soportes abiertos.El siguiente programa se puede usar para calcular el número de una matriz dada con hasta 16 corchetes.
fuente
Python,
153128bytesAsignamos un número n a una lista anidada mirando sus dígitos binarios de izquierda a derecha. Este algoritmo funciona para cualquier número, no solo por debajo de 2 32 .
[
.][
.][
.]
.Finalmente, cerramos los corchetes abiertos.
fuente
Cuchara , 63 bytes (501 bits)
Este es el siguiente programa de brainfuck convertido en cuchara:
Lee un número entero en binario en stdin y genera la lista anidada en stdin. Requiere que se ingrese 0 como la cadena vacía (sin dígitos), y requiere un intérprete de brainfuck con celdas de 8 bits. Mismo algoritmo que mi respuesta de Python.
Versión legible:
fuente
Jalea , 28 bytes
Este itera sobre todas las cadenas de los personajes
[
y]
que se inician con una[
y al final con una]
, verifica si los soportes coinciden, e imprime el n º partido.Pruébalo en línea!
fuente
Perl,
8079 bytesNuevamente usa el algoritmo de orlp , pero esta vez primero comprobé si funciona ...
Incluye +1 para
-p
Dar el número de entrada en STDIN
nest.pl
:La solución de Linus es de 64 bytes en perl:
La solución de Dennis es de 59 bytes en perl (cada vez más lenta para grandes números):
fuente
-p
se cuenta como 1 byte extraPython 3,
120114 bytesPruébalo en Ideone .
Cómo funciona
La función definida f toma la entrada n e inicializa k a 0 . Seguiremos incrementando k hasta que n + 1 valores de k den como resultado una salida válida. Cada vez que encontramos dicho valor de k , n disminuye una vez que alcanza -1 ,
~n
produce 0 y se imprime la lista r que corresponde al último valor de k .La asignación parcial de los enteros positivos a las listas anidadas (es decir, k ↦ r ) tiene que ser biyectiva, pero no existen otras restricciones. El utilizado en esta respuesta funciona de la siguiente manera.
Convierta k en una representación de cadena binaria, mirando con 0b .
Por ejemplo, 44 ↦ "0b101100" .
Reemplace todos los 0 '(punto de código 48 ) en la representación de cadena con la cadena "]," y todos los 1 ' (punto de código 49 ) con [ .
Por ejemplo, "0b101100" ↦ "], b [], [[],]," .
Elimine los primeros tres caracteres (corresponden a "0b" ) y el carácter final (con suerte una coma).
Por ejemplo, "], b [], [[],]," ↦ "[], [[],]" .
Intenta evaluar el código generado. Si esto resulta en un error, k no se asigna a ninguna lista.
Por ejemplo, "[], [[],]" ↦ ([], [[]]) .
Concatene el resultado (si lo hay) con la lista vacía. Si esto resulta en un error, k no se asigna a ninguna lista.
Por ejemplo, ([], [[]]) + [] errores ya que + no puede concatenar listas y tuplas.
fuente
Haskell, 71 bytes
La función principal en la última línea se indexa en una lista de todas las matrices anidadas, ordenadas por tamaño (número de paréntesis abiertos). Entonces, todas las matrices de tamaño como máximo 16 se enumeran primero.
Primero veamos el código que es más agradable y más corto, pero el comprobador de tipos de Haskell se niega a aceptar.
La función
p
en la entradan
proporciona una lista de todas las matrices anidadas de tamañon
(paréntesis abiertos). Esto se hace de forma recursiva. Cada conjunto de este tipo consiste en una cabezah
(primer miembro) de tamañok
y una colat
(otros miembros) de tamañon-k
, ambos tamaños distintos de cero. O es la matriz vacía para el tamañon==1
.La expresión
p=<<[1..]
se aplanap(1), p(2), ...
en una única lista infinita de todas las matrices ordenadas por tamaño.y la función principal se indexa en él.
... O, lo haría, si Haskell no se quejara de "construir [ing] el tipo infinito: t ~ [t]". Haskell no puede representar la lista infinita arriba cuyos elementos son matrices anidadas arbitrariamente. Todos sus elementos deben tener el mismo tipo, pero un tipo t no puede ser lo mismo que una lista de t. De hecho, a la función en
p
sí no se le puede asignar un tipo coherente sin un tipeo dependiente, del que carece Haskell.Entonces, en su lugar, trabajamos en cadenas de corchetes, simulando la operación contras actuando sobre
[
y]
caracteres. Esto toma 9 bytes adicionales. Los peligros del golf en un lenguaje de tipo seguro.fuente
Haskell,
8782 bytesEmite los elementos de la matriz. Ejemplo de uso:
(([0..]>>= \y->y#y)!!) 3
->"[][]"
.La función
#
construye todas las matrices anidadas como cadenas paran
abrir ym
cerrar paréntesis, al realizar un seguimiento de la cantidad restante de cada una. Siempre comienza conn == m
. La función principal llamay # y
a caday <- [0,1,...]
y elige el elemento en el índice dado por la entrada.fuente
MATL , 31 bytes
Pruébalo en línea! O verifique los primeros casos de prueba (toma unos segundos).
El mapeo producido es:
Explicación
El código sigue probando números binarios crecientes, con dígitos
0
reemplazados por-1
; es decir, usando1
y-1
como dígitos. Dígito1
representará'['
y-1
representará']'
.El programa cuenta hasta que se hayan obtenido n +1 números válidos . Un número es válido si se cumplen las dos condiciones siguientes:
1
y-1
)1
dígitos siempre excede el de-1
) excepto al final (donde es cero por la condición 1).Una vez que se han obtenido n +1 números válidos, el último se transcribe cambiando
1
a[
y-1
dentro]
, y luego se muestra.Código:
fuente