Wkład
Tablica, która może zawierać tablice lub dodatnie, kolejne, rosnące liczby całkowite. Tablice mogą mieć w sobie dowolną liczbę tablic, i tak dalej i tak dalej. Żadne tablice nie będą puste.
Wydajność
Ta tablica została uproszczona
Jak uprościć tablicę
Użyjemy tablicy, [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
jako naszego przykładu.
Najpierw sprawdzamy, jak głęboko wartości są zagnieżdżone. Oto głębokości i liczby na tych głębokościach:
0 1
1 2 3 9
2 4 7
3 5 6
5 8
Konstruujemy tablicę wyjściową, biorąc liczby z oryginalnej tablicy, grupując je według głębokości zagnieżdżenia, a następnie zagnieżdżając grupy na głębokościach pierwotnych głębokości ich elementów. Ułóż liczby w porządku rosnącym i rosnącym na głębokości.
Nasza produkcja to [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
Przykłady
[1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]] -> [1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
[[[1]], [2, [3]], 4, [5, [6, [7, [8], [9, [[10]]]]]]] -> [4, [2, 5], [[1, 3, 6]], [[[7]]], [[[[8, 9]]]], [[[[[[10]]]]]]]
[1] -> [1]
[1, [2], [[3]], [[[4]]], [[[[5]]]]] -> [1, [2], [[3]], [[[4]]], [[[[5]]]]]
[1, [[[[2], 3]]] [[4]]] -> [1, [[4]], [[[3]]], [[[[2]]]]]
code-golf
array-manipulation
Daniel
źródło
źródło
8
liniiSo, our output is.....
. Naprawiono to jednak we fragmencie przykładów.[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[]]]], [[[[[8]]]]]]
?Odpowiedzi:
Galaretka , 8 bajtów
Wyjście to jeden poziom na linię, z pustymi liniami dla poziomów bez elementów. Wypróbuj online!
Jak to działa
źródło
JavaScript (ES6),
139109 bajtówObjaśnienie przy użyciu przykładowego wejścia:
v
jest metodą pomocniczą, która zwraca tablice (z parametrem1
) lub wartości (bez parametru). Zaczynamy oda = [1, [2, 3], [[4]], [[[5, 6], 7, [[[8]]]], 9]]
, który jest niepusty. Odfiltrowujemy tablice, dając[1]
. Następnie rekurencyjnie nazywamy się tablicami połączonymi razem, co jest[2, 3, [4], [[5, 6], 7, [[[8]]]], 9]
rezultatem[2, 3, 9, [4, 7], [[5, 6]], [[[[8]]]]]
. Ponownie filtrujemy tablice, co daje nam drugi termin naszej produkcji[2, 3, 9]
, jednak musimy uważać, aby nie wstawić tutaj pustej tablicy. Pozostaje owinąć tablice[4, 7], [[5, 6]], [[[[8]]]]
wewnątrz tablic i dołączyć je do wyniku, w wyniku czego[1, [2, 3, 9], [[4, 7]], [[[5, 6]]], [[[[[8]]]]]]
.źródło
filter
. Może zacznij odF=(x,y)=>x.filter(y)
[].concat(...v(1))
sięv(1)
, aby zapisać 14 bajtów. Prawdopodobnie jest jeszcze kilka innych rzeczy, ale trudno mi śledzić zagnieżdżone nawiasy w mojej głowie.[].concat(...v(1))
to zupełnie inna bestiav(1)
, inaczej nie zrobiłbym tego! Dla prostego przykładu rozważmya = [2, [3], [[4]]]
następniev(1) = [[3], [[4]]]
ale[].concat(...v(1)) = [3, [4]]
.05AB1E ,
27262521 bajtówWypróbuj online! (nieco zmodyfikowany, ponieważ
.g
nie ma go jeszcze w TIO)Wyjaśnienie
Główną strategią jest zapętlanie każdego możliwego poziomu zagnieżdżonej tablicy i drukowanie dowolnych cyfr w jednym wierszu, przy jednoczesnym zachowaniu niecyfrowych (list) na liście o jeden poziom mniej zagnieżdżonych.
źródło
Perl, 52 bajty
Po prostu podprogram rekurencyjny. (niezwykłe jak na odpowiedź Perla, wiem ..)
Nazwij to tak:
Każdy wiersz wyniku odpowiada poziomowi głębokości tablicy (stąd pusta linia w powyższym przykładzie).
Można go przekształcić w pełny program za kilka dodatkowych bajtów: dodaj
-n
flagę ieval
(wewnątrz,@{ }
aby przekształcić dane wejściowe w tablicę, a nie w tablicę referencji), aby przekształcić dane wejściowe w tablicę Perla:Moje poprzednie podejście było nieco dłuższe (65 bajtów), ale wciąż interesujące, więc pozwolę to tutaj:
źródło
JavaScript (ES6) 121
144 152Edytować Wiele poprawiono, 1 bajt zaoszczędził dzięki Patrickowi Robertsowi, a 21 kolejnych tylko przeglądając kod
Funkcja rekurencyjna działająca na tablicach na wejściu i wyjściu. Nie podoba mi się żądanie posiadania elementów na głębokości 1 jako pojedynczych elementów w tablicy wyjściowej (podczas gdy większe poziomy są zgrupowane jako jeden element):
[l1,l1, [l2...], [[l3...]] ]
. Chociaż byłoby to bardziej bezpośrednie:[ [l1...], [[l2...]], [[[l3...]]] ]
Dodano nową linię dla czytelności.
Kilka uwag: linia 2 jest oceniana raz po raz przy każdym wywołaniu rekurencyjnym, ale użyteczna jest tylko ostatnia iteracja na końcu rekurencji.
Specjalna obsługa
d==0
w linii 2 zajmuje się anomalią elementów poziomu 1.The
n
rekurencyjna obsługuje zagnieżdżanie tablicy w danych wyjściowychTest
źródło
v[0]
zamiast tego byłby łatwiejszy test dla operatora trójskładnikowegov.map
. Oszczędza 1 bajt.JavaScript (ES6) 168 bajtów
Próbny
źródło
PHP, 145 bajtów
Awaria
źródło
Pyth,
1916 bajtówWypróbuj online. Zestaw testowy.
Zwróć uwagę na wiodące miejsce. Wyświetla poziomy w wierszach takich jak odpowiedź Perla.
Wyjaśnienie
Q
.f
ilter pozycjiT
zQ
:s
um jestI
włączonyT
.p
rintT
plus spacja+
…d
.s
um przedmioty. Usuwa to warstwę tablic z każdego elementu. Jeśli nie zostaną żadne, daje0
.=
wynik doQ
.W
jeśli wynik nie jest pusty, wypisz pusty ciągk
i nowy wiersz.źródło
Haskell,
124123 bajtyPonieważ Haskell domyślnie nie obsługuje list mieszanych (liczb całkowitych i list liczb całkowitych), zdefiniowałem niestandardowy typ listy
L
. Przykład użycia:Uwaga: uruchomienie zajmuje trochę czasu, ponieważ pętle przechodzą przez wszystkie pozytywne int (32- lub 64-bitowe) w poszukiwaniu głębokiego poziomu zagnieżdżenia. Ponadto: niestandardowy typ listy nie może być drukowany domyślnie, więc jeśli chcesz zobaczyć wynik jak w powyższym przykładzie, musisz dodać
deriving Show
dodata
deklaracji (->data L=I Int|R[L] deriving Show
). Ponieważ nie jest potrzebne do zwrócenia listy L z funkcji, nie liczę bajtów.Jak to działa:
Edytuj @BlackCap zapisał bajt, przełączając się z
>>=
nado
notację. Dzięki!źródło
h l=R$do d<-[1..];[i|(e,i)<-0#l,d==e]!d
JavaScript (ES6),
127137134 bajtówPobiera tablicę jako dane wejściowe i zwraca ciąg znaków.
Przypadki testowe
Pokaż fragment kodu
źródło