Haskell, 71 bytes
p 1=["[]"]
p n=['[':h++t|k<-[1..n-1],h<-p k,_:t<-p$n-k]
((p=<<[1..])!!)
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.
p 1=[[]]
p n=[h:t|k<-[1..n-1],h<-p k,t<-p$n-k]
((p=<<[1..])!!)
La función p
en la entrada n
proporciona una lista de todas las matrices anidadas de tamaño n
(paréntesis abiertos). Esto se hace de forma recursiva. Cada conjunto de este tipo consiste en una cabeza h
(primer miembro) de tamaño k
y una cola t
(otros miembros) de tamaño n-k
, ambos tamaños distintos de cero. O es la matriz vacía para el tamaño n==1
.
La expresión p=<<[1..]
se aplana p(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.