Haskell, 71 octets
p 1=["[]"]
p n=['[':h++t|k<-[1..n-1],h<-p k,_:t<-p$n-k]
((p=<<[1..])!!)
La fonction principale de la dernière ligne indexe dans une liste de tous les tableaux imbriqués, triés par taille (nombre de crochets ouverts). Ainsi, tous les tableaux de taille au plus 16 sont répertoriés en premier.
Examinons d'abord le code plus agréable et plus court, mais le vérificateur de typographie de Haskell refuse d'accepter.
p 1=[[]]
p n=[h:t|k<-[1..n-1],h<-p k,t<-p$n-k]
((p=<<[1..])!!)
La fonction p
en entrée n
donne une liste de tous les tableaux imbriqués de taille n
(crochets ouverts). Cela se fait récursivement. Chacun de ces tableaux se compose d'une tête h
(premier membre) de taille k
et d'une queue t
(autres membres) de taille n-k
, les deux tailles étant différentes de zéro. Ou, c'est le tableau vide pour la taille n==1
.
L'expression p=<<[1..]
s'aplatit ensuite p(1), p(2), ...
en une seule liste infinie de tous les tableaux triés par taille
[ [], [[]], [[],[]], [[[]]], [[],[],[]], [[],[[]]], [[[]],[]], [[[],[]]], ...
et la fonction principale y est indexée.
... Ou, si Haskell ne se plaignait pas de "construire [ing] le type infini: t ~ [t]". Haskell ne peut pas représenter la liste infinie ci-dessus dont les éléments sont des tableaux imbriqués arbitrairement. Tous ses éléments doivent avoir le même type, mais un type t ne peut pas être le même qu'une liste de t. En fait, la fonction p
elle-même ne peut pas être affectée à un type cohérent sans typage dépendant, ce qui manque à Haskell.
Donc, à la place, nous travaillons sur des chaînes de crochets, simulant l'opération par contre en agissant sur [
et sur les ]
caractères. Cela prend 9 octets supplémentaires. Les dangers du golf dans un langage sûr.