Debe escribir un programa o función que clasifique una lista anidada. Estas son las reglas para ordenar una lista anidada:
Tomemos esta lista como ejemplo:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Cada elemento en esta lista tiene una "prioridad". Un elemento cuenta como un número o una sublista. Primero, obtenga la prioridad de cada elemento a la misma profundidad. Si un elemento es solo un número, su prioridad es la misma que el número mismo. Si un elemento es una sublista, su prioridad es la suma de todos los números que contiene, sin incluir ninguna sublista.
Entonces, las prioridades de todos los elementos de la profundidad 1 son:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Ordenar cada elemento por prioridad. Si hay un empate, debe mantener el mismo orden que la lista original.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Repita para cada sublista. Entonces en esta sublista
(2, 1, (3, 4))
Nuestras prioridades se ven así:
2 1 ( 7 )
(2, 1, (3, 4))
Así ordenado, se ve así:
(1, 2, (3, 4))
(3, 4)
ya está ordenado, así que hemos terminado. Repita para (5, 2)
que resultados (2, 5)
y hemos terminado! Nuestra lista final es:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Reglas:
Muy dudoso, pero solo en caso de que Mathematica tenga algo para esto, no se permite la creación de listas anidadas. Funciones de ordenación regulares están permitidos.
Las E / S pueden estar en cualquier formato razonable.
Cada sublista contendrá al menos un número o lista. Además, las sublistas se pueden anidar en varios niveles de profundidad. Por ejemplo, en
(1, 2, (((3))))
el(((3)))
tiene una prioridad de 0, ya que sólo tiene sublistas en ella.Las listas no válidas (paréntesis no coincidentes, no números, tipos de paréntesis incorrectos, números negativos, etc.) dan como resultado un comportamiento indefinido.
Prueba de E / S:
(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))
La respuesta más corta en bytes gana.
fuente
Respuestas:
Jalea, 13 bytes
Pruébalo en línea! o verificar todos los casos de prueba .
Cómo funciona
Al comparar (
<
) un número consigo mismo se obtiene 0 (falso), pero al comparar una lista no vacía consigo mismo se obtiene una lista de 0 (verdadero), por lo que<
se puede utilizar para distinguir números de listas.fuente
Python 2,
114101787362 bytesYo sabía que había una mejor manera de listas de filtros fuera.
Ordena una lista de Python (y sus sublistas) en el lugar.
https://eval.in/540457 ¡ gracias @tac por informarme que las soluciones en el lugar son aceptables, y @xnor + @feersum por más optimizaciones!
fuente
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
de ella, 5. Luego, en el condicional, clasificamos la lista sobre la que estamos iterando (!), Entonces cuando tomamos la siguiente z es TAMBIÉN 5, conduciendo a una suma de 10. Luego ordenamos la lista externa con estas teclas y obtenemos [6, [1, 5]], que es incorrecto como "Si hay un empate, debe mantener el mismo orden que la lista original. " Lo interesante es que llamamossort
a ambas listas dos veces, por lo que esto solo ocurre en claves iguales: si la sublista fuera menor, se ordenaría de nuevo.None
salida det.sort(key=k)
, pero no lo estoy viendo.False
es 0 para los fines de+
y por extensión,sum
. Sin embargo, no puedo pensar en cómo eso ahorra bytes.list.sort
regresaNone
, noFalse
.Lua, 172 bytes
La función
s
clasifica una tabla Lua (una estructura de datos que sirve como una lista entre otras cosas en Lua) en su lugar de acuerdo con las reglas.fuente
type(a)
devuelve una cadenaMathematica, 50 bytes
Método recursivo simple que utiliza
SortBy
. Ignora los mensajes.fuente
Haskell,
160151135 bytesEl primer problema son las listas anidadas. Haskell requiere que todos los elementos de una lista tengan el mismo tipo; en particular, un entero y una lista de enteros no son del mismo tipo. En otras palabras, una lista anidada de variables no es una lista, ¡es un rosal!
Primero, tenemos que definir un tipo de datos para rosales:
(Estrictamente,
deriving Show
solo es necesario si desea ver los resultados. Pero eso es un tecnicismo). Con esta definición, podemos escribir una lista(1, 2, (3, 4))
comoque es considerablemente menos legible. Pero lo que sea; Es una traducción trivial y mecánica. Prefije cada número con
N
y cada subárbol conT
.Ahora necesitamos calcular prioridades. Esto sería fácil si la prioridad de un subárbol fuera simple la suma de todos los elementos que contiene. Eso sería un bucle recursivo trivial. Pero como no lo es, necesitamos definir dos funciones: una que se repite y otra que no.
Si tuviéramos que sumar todos los subelementos, entonces
q
no necesitaría existir, salvando una gran cantidad de caracteres. ¡Oh bien!Editar: En realidad, varios comentaristas señalan que se puede evitar
q
el uso de una lista por comprensión:[ x | N x <- t]
. Buena llamada, chicos!(De hecho,
p
tampoco necesitaría existir; podríamos hacer que el compilador genere automáticamente unaOrd
instancia para nosotros en un puñado de caracteres, y esta implementación predeterminada coincidiría con la especificación).Finalmente, tenemos que recurrir a todos los subárboles y ordenarlos:
Es decir,
f
clasifica un árbol aplicándose recursivamente a todos los elementos (map f
) y luego llamando a lasortBy
función para ordenar el nivel superior. La primera línea dice que ordenar un número no hace nada y es necesario para terminar la recursión.fuente
sortBy (\ x y -> compare (p x) (p y))
es justosortOn p
. Utilice la versión infija del mapa enp
:sum$q<$>t
.sortOn
define? Siempre quise saber ...p(T t)=sum[x|N x<-t]
ydata T=N Int|T[T]deriving Show
. :)$
entrarsum$[x|N x<-t]
. Entonces, 135-5-1 = 129. :)CLISP, 380 bytes
Llame a la función q con una lista.
Soy un novato lisp, por favor no me mates ^^
fuente
Pyth, 15 bytes
Banco de pruebas
Una función recursiva, que funciona de la siguiente manera:
fuente
Java, 219 bytes
Con saltos de línea:
Hay una gran cantidad de casting que realmente acumula el recuento de bytes. :PAGS
Los valores enteros se introducen en un Comparador, y las listas anidadas se ordenan primero antes de que la suma de solo los valores enteros se den al Comparador. Estos valores son cómo el Comparador determina su posición dentro de la lista cuando se ordena.
Probarlo aquí .
fuente
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
aint
esa manera, y el desafío parece requerir que una lista es la salida.JavaScript (ES6), 86 bytes
Toda esa comprobación de matriz :-(
fuente
map.map.map.map.map.map.map.map.map