Você deve escrever um programa ou função que classifique uma lista aninhada. Aqui estão as regras para classificar uma lista aninhada:
Vamos tomar esta lista como um exemplo:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Cada elemento nesta lista tem uma "prioridade". Um elemento conta como um número ou uma sub-lista. Primeiro, obtenha a prioridade de cada elemento na mesma profundidade. Se um elemento é apenas um número, sua prioridade é a mesma que o próprio número. Se um elemento é uma sub- lista, sua prioridade é a soma de todos os números , sem incluir nenhuma sub-sublista.
Portanto, as prioridades de todos os elementos da profundidade 1 são:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Classifique cada elemento por prioridade. Se houver um empate, você deve manter a mesma ordem que a lista original.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Repita para todas as sub-listas. Então nesta sublist
(2, 1, (3, 4))
Nossas prioridades se parecem com:
2 1 ( 7 )
(2, 1, (3, 4))
Tão ordenados, parece com:
(1, 2, (3, 4))
(3, 4)
já está classificado, então terminamos. Repita para (5, 2)
que resultados (2, 5)
e pronto! Nossa lista final é:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Regras:
Altamente duvidoso, mas, no caso de o Mathematica ter algo para isso, não é permitido nenhum built-in de classificação de lista aninhada. Funções de classificação regulares são permitidas.
A E / S pode estar em qualquer formato razoável.
Cada sublist conterá pelo menos um número ou lista. Além disso, sublistas podem ser aninhados em vários níveis de profundidade. Por exemplo,
(1, 2, (((3))))
na(((3)))
tem uma prioridade de 0, uma vez que tem apenas sublists nele.Listas inválidas (parênteses não correspondentes, não números, tipos de colchetes incorretos, números negativos, etc.) resultam em comportamento indefinido.
E / S de teste:
(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))
A resposta mais curta em bytes vence.
fonte
Respostas:
Gelatina, 13 bytes
Experimente online! ou verifique todos os casos de teste .
Como funciona
Comparando (
<
) um número com ele próprio produz 0 (Falsas), mas comparando uma lista não-vazia com si produz uma lista de 0 's (truthy), de modo que<
pode ser utilizado para distinguir os números de listas.fonte
Python 2,
114101787362 bytesEu sabia que havia uma maneira melhor de filtrar as listas.
Classifica uma lista python (e suas sublistas) no local.
https://eval.in/540457 obrigado @tac por me informar que as soluções no local são aceitáveis e @xnor + @feersum para otimizações adicionais!
fonte
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
dela, 5. Em seguida, na condicional, classificamos a lista sobre a qual estamos iterando (!); Portanto, quando pegamos o próximo z, é TAMBÉM 5, levando a uma soma de 10. Em seguida, classificamos a lista externa com essas chaves e obtemos [6, [1, 5]], que está incorreto como "Se houver um empate, você deve manter a mesma ordem que a lista original. " O interessante é que chamamossort
as duas listas duas vezes, então isso só acontece com chaves iguais: se a sub-lista fosse menor, ela retornaria.None
saídat.sort(key=k)
, mas não estou vendo.False
é 0 para os propósitos+
e por extensãosum
,. Não consigo pensar em como isso salva bytes, no entanto.list.sort
retornaNone
, nãoFalse
.Lua, 172 bytes
A função
s
classifica uma tabela Lua (uma estrutura de dados que serve como uma lista entre outras coisas em Lua) de acordo com as regras.fonte
type(a)
retorna uma stringMathematica, 50 bytes
Método recursivo simples que usa
SortBy
. Ignore as mensagens.fonte
Haskell,
160151135 bytesO primeiro problema são listas aninhadas. Haskell requer que todos os elementos de uma lista tenham o mesmo tipo; em particular, um número inteiro e uma lista de números inteiros não são do mesmo tipo. Em outras palavras, uma lista aninhada por variáveis não é uma lista, é uma roseira!
Então, primeiro, precisamos definir um tipo de dados para as roseiras:
(Estritamente,
deriving Show
só é necessário se você quiser ver os resultados. Mas isso é um detalhe técnico.) Com essa definição, podemos escrever uma lista(1, 2, (3, 4))
comoo que é consideravelmente menos legível. Mas de qualquer forma; é uma tradução mecânica e trivial. Prefixe cada número com
N
e cada subárvore comT
.Agora precisamos calcular prioridades. Isso seria fácil se a prioridade de uma subárvore fosse simples a soma de todos os elementos que ela contém. Isso seria um loop recursivo trivial. Mas, como não é, precisamos definir duas funções: uma que se repete e outra que não.
Se somarmos tudo subelementos,
q
não seria necessário existir, economizando um grande número de caracteres. Ah bem!Edit: Na verdade, vários comentaristas apontam que você pode evitar
q
utilizando uma compreensão da lista:[ x | N x <- t]
. Boa ligação, pessoal!(De fato,
p
também não precisaria existir; poderíamos ter o compilador para gerar automaticamente umaOrd
instância para nós em alguns caracteres, e essa implementação padrão corresponderia às especificações.)Por fim, precisamos recursivamente sobre todas as subárvores e classificá-las:
Ou seja,
f
classifica uma árvore aplicando-se recursivamente a todos os elementos (map f
) e, em seguida, chamando asortBy
função para classificar o nível superior. A primeira linha diz que classificar um número não faz nada e é necessário encerrar a recursão.fonte
sortBy (\ x y -> compare (p x) (p y))
é justosortOn p
. Use a versão infix do mapa emp
:sum$q<$>t
.sortOn
definido? Eu sempre quis saber ...p(T t)=sum[x|N x<-t]
edata T=N Int|T[T]deriving Show
. :)$
entrarsum$[x|N x<-t]
. Então 135-5-1 = 129. :)CLISP, 380 bytes
Chame a função q com uma lista.
Eu sou um lisp noob, por favor, não me mate ^^
fonte
Pitão, 15 bytes
Suíte de teste
Uma função recursiva, que funciona da seguinte maneira:
fonte
Java, 219 bytes
Com quebras de linha:
Há muitas transmissões em andamento que realmente aumentam a contagem de bytes. : P
Os valores inteiros são alimentados em um comparador e as listas aninhadas são classificadas primeiro antes que a soma apenas dos valores inteiros seja fornecida ao comparador. Esses valores são como o Comparador determina sua posição na lista quando é classificado.
Experimente aqui .
fonte
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
paraint
isso, e o desafio parece exigir que uma lista seja exibida.JavaScript (ES6), 86 bytes
Toda essa verificação de matriz :-(
fonte
map.map.map.map.map.map.map.map.map