Haskell, 71 bajtów
p 1=["[]"]
p n=['[':h++t|k<-[1..n-1],h<-p k,_:t<-p$n-k]
((p=<<[1..])!!)
Główna funkcja ostatniego wiersza indeksuje do listy wszystkich zagnieżdżonych tablic, posortowanych według wielkości (liczba otwartych nawiasów). Tak więc wszystkie tablice wielkości maksymalnie 16 są wymienione jako pierwsze.
Najpierw spójrzmy na kod, który jest ładniejszy i krótszy, ale narzędzie do sprawdzania typów Haskell odmawia przyjęcia.
p 1=[[]]
p n=[h:t|k<-[1..n-1],h<-p k,t<-p$n-k]
((p=<<[1..])!!)
Funkcja p
na wejściu n
daje listę wszystkich zagnieżdżonych tablic wielkości n
(otwarte nawiasy kwadratowe). Odbywa się to rekurencyjnie. Każda taka tablica składa się z części głowy h
(pierwszego elementu) wielkości k
i części ogona t
(innych elementów) wielkości n-k
, przy czym oba rozmiary są niezerowe. Lub jest to pusta tablica dla rozmiaru n==1
.
Wyrażenie p=<<[1..]
następnie spłaszcza p(1), p(2), ...
się w jedną nieskończoną listę wszystkich tablic posortowanych według wielkości
[ [], [[]], [[],[]], [[[]]], [[],[],[]], [[],[[]]], [[[]],[]], [[[],[]]], ...
i główna funkcja indeksuje się do niego.
... Lub, gdyby Haskell nie narzekał na „skonstruowanie [nieskończonego typu]: t ~ [t]”. Haskell nie może reprezentować nieskończonej listy powyżej, której elementy są dowolnie zagnieżdżonymi tablicami. Wszystkie jego elementy muszą mieć ten sam typ, ale typ t nie może być taki sam jak lista t. W rzeczywistości funkcjap
samej nie można przypisać spójnego typu bez pisania zależnego, którego brakuje Haskellowi.
Zamiast tego pracujemy nad ciągami nawiasów, symulując działanie wad przez działanie na znaki [
i ]
. To zajmuje dodatkowe 9 bajtów. Zagrożenia związane z golfem w języku bezpiecznym dla typu.