Musisz napisać program lub funkcję sortującą listę zagnieżdżoną. Oto zasady sortowania listy zagnieżdżonej:
Weźmy tę listę jako przykład:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Każdy element na tej liście ma „priorytet”. Element liczy się jako liczba lub lista podrzędna. Najpierw uzyskaj priorytet każdego elementu na tej samej głębokości. Jeśli element jest tylko liczbą, jego priorytet jest taki sam jak sama liczba. Jeśli element jest podlistą, jego priorytetem jest suma wszystkich zawartych w nim liczb , nie uwzględniając żadnych podlist.
Zatem priorytetami wszystkich elementów głębokości 1 są:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Posortuj każdy element według priorytetu. W przypadku remisu musisz zachować tę samą kolejność, co oryginalną listę.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Powtórz dla każdej podlisty. Więc na tej liście
(2, 1, (3, 4))
Nasze priorytety wyglądają następująco:
2 1 ( 7 )
(2, 1, (3, 4))
Tak posortowane, wygląda następująco:
(1, 2, (3, 4))
(3, 4)
jest już posortowane, więc skończyliśmy. Powtórz dla (5, 2)
których wyniki (2, 5)
i gotowe! Nasza ostateczna lista to:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Zasady:
Bardzo wątpliwe, ale na wszelki wypadek, gdy Mathematica ma coś do tego, żadne wbudowane sortowanie listy zagnieżdżonej nie jest dozwolone. Dozwolone są regularne funkcje sortowania .
I / O może mieć dowolny rozsądny format.
Każda lista podrzędna będzie zawierać co najmniej jeden numer lub listę. Podlisty można również zagnieżdżać na kilku poziomach. Na przykład w
(1, 2, (((3))))
elemencie(((3)))
ma priorytet 0, ponieważ ma w nim tylko listy podrzędne.Nieprawidłowe listy (niedopasowane nawiasy, niepoliczalne liczby, niewłaściwe typy nawiasów, liczby ujemne itp.) Powodują niezdefiniowane zachowanie.
Test we / wy:
(1, 2, 3) ---> (1, 2, 3)
(1, 2, 6, 3, 9, 8) ---> (1, 2, 3, 6, 8, 9)
(4, 3, (2), (1)) ---> ((1), (2), 3, 4)
(4, 3, (2), ((1))) ---> (((1)), (2), 3, 4)
(5, (1, 2, (9, 8))) ---> ((1, 2, (8, 9)), 5)
(3, (1, 2), (2, 1)) ---> (3, (1, 2), (1, 2))
(3, (1, 2, (99)), (2, 1, (34))) ---> (3, (1, 2, (99)), (1, 2, (34)))
(7, 2, (1, (9, 12)), (4, 3, 2, (1, 2))) ---> ((1, (9, 12)), 2, 7, (2, 3, (1, 2), 4))
Najkrótsza odpowiedź w bajtach wygrywa.
źródło
Odpowiedzi:
Galaretka, 13 bajtów
Wypróbuj online! lub zweryfikuj wszystkie przypadki testowe .
Jak to działa
Porównanie (
<
) liczby w sobie daje 0 (falsy), lecz w porównaniu niepusty listę ze sobą uzyskuje listę 0 „s (truthy), a więc<
mogą być używane do rozróżniania numerów z listy.źródło
Python 2,
114101787362 bajtówWiedziałem , że istnieje lepszy sposób na odfiltrowanie list.
Sortuje listę python (i jej listy podrzędne) w miejscu.
https://eval.in/540457 dzięki @tac za poinformowanie mnie, że rozwiązania na miejscu są dopuszczalne, a @xnor + @feersum za dalsze optymalizacje!
źródło
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
z niej inicjał 5. Następnie w trybie warunkowym sortujemy listę, nad którą iterujemy (!), Więc kiedy bierzemy następną z, jest to TAKŻE TAKŻE 5, prowadząc do sumy 10. Następnie sortujemy zewnętrzną listę za pomocą tych kluczy i otrzymujemy [6, [1, 5]], co jest niepoprawne jako „Jeśli istnieje remis, musisz zachować tę samą kolejność, co oryginalną listę. „ Interesujące jest to, że wywołujemysort
obie listy dwa razy, więc dzieje się tak tylko na równych klawiszach: jeśli lista podrzędna byłaby mniejsza, sortowałaby się z powrotem.None
wynikit.sort(key=k)
, ale nie widzę tego.False
wynosi od 0 do celów+
i za tym idziesum
. Nie mogę jednak wymyślić, jak to oszczędza bajty.list.sort
Zwraca @CatsAreFluffyNone
, a nieFalse
.Lua, 172 bajty
Funkcja
s
sortuje tabelę Lua (strukturę danych, która służy jako lista między innymi w Lua) zgodnie z regułami.źródło
type(a)
zwraca sznurMathematica, 50 bajtów
Prosta metoda rekurencyjna, która wykorzystuje
SortBy
. Zignoruj wiadomości.źródło
Haskell,
160151135 bajtówPierwszym problemem są listy zagnieżdżone. Haskell wymaga, aby wszystkie elementy listy miały ten sam typ; w szczególności liczba całkowita i lista liczb całkowitych nie są tego samego typu. Innymi słowy, lista zagnieżdżona w zmiennej nie jest listą, to drzewo różane!
Najpierw musimy zdefiniować typ danych dla drzew róży:
(Ściśle rzecz biorąc,
deriving Show
jest to konieczne tylko, jeśli chcesz zobaczyć wyniki. Ale to jest kwestia techniczna.) Po wprowadzeniu tej definicji możemy napisać listę taką(1, 2, (3, 4))
jak:co jest znacznie mniej czytelne. Ale cokolwiek; to banalne, mechaniczne tłumaczenie. Poprzedź każdą cyfrę
N
i każde poddrzewo znakiemT
.Teraz musimy obliczyć priorytety. Byłoby to łatwe, gdyby priorytetem poddrzewa była prosta suma wszystkich zawartych w nim elementów. To byłaby trywialna pętla rekurencyjna. Ale ponieważ tak nie jest, musimy zdefiniować dwie funkcje: jedną, która się powtarza, i jedną, która nie powtarza się.
Gdybyśmy zsumowali wszystkie podelementy,
q
nie musielibyśmy istnieć, oszczędzając ogromną liczbę znaków. No cóż!Edycja: Faktycznie, kilka commentors podkreślić, że można uniknąć
q
stosując listowych:[ x | N x <- t]
. Dobra rozmowa!(W rzeczywistości też
p
nie musiałby istnieć; moglibyśmy mieć kompilator automatycznie generującyOrd
dla nas instancję w kilku znakach, a ta domyślna implementacja byłaby zgodna ze specyfikacją.)Wreszcie musimy rekurencyjnie wykonywać wszystkie pod-drzewa i sortować je:
Oznacza to, że
f
sortuje drzewo poprzez rekurencyjne zastosowanie się do wszystkich elementów (map f
), a następnie wywołaniesortBy
funkcji w celu posortowania najwyższego poziomu. Pierwszy wiersz mówi, że sortowanie liczb nic nie robi i jest konieczne, aby zakończyć rekurencję.źródło
sortBy (\ x y -> compare (p x) (p y))
jest po prostusortOn p
. Użyj wersji Infix mapy wp
:sum$q<$>t
.sortOn
zdefiniowany? Zawsze chciałem wiedzieć ...p(T t)=sum[x|N x<-t]
idata T=N Int|T[T]deriving Show
. :)$
sięsum$[x|N x<-t]
. Zatem 135-5-1 = 129. :)CLISP, 380 bajtów
Wywołaj funkcję q z listą.
Jestem seplenieniem, proszę, nie zabijaj mnie ^^
źródło
Pyth, 15 bajtów
Zestaw testowy
Funkcja rekurencyjna, która działa w następujący sposób:
źródło
Java, 219 bajtów
Z podziałami linii:
Jest dużo castingu, który naprawdę podnosi liczbę bajtów. : P
Wartości całkowite są wprowadzane do Komparatora, a zagnieżdżone listy są sortowane najpierw, zanim suma samych wartości całkowitych zostanie podana do Komparatora. Te wartości określają, w jaki sposób Komparator określa swoją pozycję na liście podczas sortowania.
Wypróbuj tutaj .
źródło
int f(List l){l.sort(Comparator.comparing(o->o instanceof Integer?(int)o:f((List)o)));return l.stream().mapToInt(o->o instanceof Integer?(int)o:0).sum();}
Object
się wint
ten sposób, a wyzwanie wydaje się wymagać wyjścia listy.JavaScript (ES6), 86 bajtów
Całe sprawdzanie tablicy :-(
źródło
map.map.map.map.map.map.map.map.map