Vous devez écrire un programme ou une fonction qui trie une liste imbriquée. Voici les règles de tri d'une liste imbriquée:
Prenons cette liste comme exemple:
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Chaque élément de cette liste a une "priorité". Un élément compte comme un nombre ou une sous-liste. Tout d'abord, obtenez la priorité de chaque élément à la même profondeur. Si un élément n'est qu'un nombre, sa priorité est la même que le nombre lui-même. Si un élément est une sous-liste, sa priorité est la somme de tous les nombres qu'il contient, à l'exclusion des sous-sous-listes.
Ainsi, les priorités de tous les éléments de profondeur 1 sont:
( 7 ) 2 7 ( 3 ) 9
((5, 2), 2, 7, (2, 1, (3, 4)), 9)
Triez chaque élément par priorité. S'il y a égalité, vous devez conserver le même ordre que la liste d'origine.
2 ( 3 ) ( 7 ) 7 9
(2, (2, 1, (3, 4)), (5, 2), 7, 9)
Répétez l'opération pour chaque sous-liste. Donc sur cette sous-liste
(2, 1, (3, 4))
Nos priorités ressemblent à:
2 1 ( 7 )
(2, 1, (3, 4))
Ainsi trié, il ressemble à:
(1, 2, (3, 4))
(3, 4)
est déjà trié, nous avons donc terminé. Répétez l'opération pour les (5, 2)
résultats (2, 5)
et nous avons terminé! Notre liste finale est:
(2, (1, 2, (3, 4)), (2, 5), 7, 9)
Règles:
Très douteux, mais juste au cas où Mathematica aurait quelque chose pour cela, aucune intégration de tri de liste imbriquée n'est autorisée. Les fonctions de tri régulières sont autorisées.
Les E / S peuvent être dans n'importe quel format raisonnable.
Chaque sous-liste contiendra au moins un numéro ou une liste. De plus, les sous-listes peuvent être imbriquées à plusieurs niveaux. Par exemple, dans
(1, 2, (((3))))
le(((3)))
a une priorité de 0, car il ne contient que des sous-listes.Les listes non valides (parenthèses sans correspondance, non-nombres, types de parenthèses incorrects, nombres négatifs, etc.) entraînent un comportement indéfini.
Tester les 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 réponse la plus courte en octets gagne.
la source
Réponses:
Gelée, 13 octets
Essayez-le en ligne! ou vérifiez tous les cas de test .
Comment ça marche
La comparaison (
<
) d'un nombre avec lui-même donne 0 (fausse), mais la comparaison d'une liste non vide avec elle-même donne une liste de 0 (véridique), donc<
peut être utilisée pour distinguer les nombres des listes.la source
Python 2,
114101787362 octetsJe savais qu'il y avait une meilleure façon de filtrer les listes.
Trie une liste python (et ses sous-listes) sur place.
https://eval.in/540457 remercie @tac de m'avoir fait savoir que les solutions en place sont acceptables, et @xnor + @feersum pour d'autres optimisations!
la source
k=lambda t:t*(t<[])or sum(z for z in t if[t.sort(key=k)]>z)
.z
, 5. Ensuite, au conditionnel, nous trions la liste sur laquelle nous itérons (!), Donc quand nous prenons le z suivant, c'est AUSSI 5, conduisant à une somme de 10. Nous trions ensuite la liste externe avec ces clés et obtenons [6, [1, 5]], qui est incorrect comme "S'il y a une égalité, vous devez garder le même ordre que la liste d'origine. " La chose intéressante est que nous appelonssort
les deux listes deux fois, donc cela ne se produit que sur des clés égales: si la sous-liste était inférieure, elle serait triée.None
sortie det.sort(key=k)
, mais je ne le vois pas.False
est égal à 0 pour les besoins de+
et , par extension,sum
. Je ne peux pas penser à la façon dont cela économise des octets, cependant.list.sort
revientNone
, nonFalse
.Lua, 172 octets
La fonction
s
trie une table Lua (une structure de données qui sert entre autres de liste dans Lua) en place selon les règles.la source
type(a)
retourne une chaîneMathematica, 50 octets
Méthode récursive simple qui utilise
SortBy
. Ignorez les messages.la source
Haskell,
160151135 octetsLe premier problème concerne les listes imbriquées. Haskell requiert que tous les éléments d'une liste aient le même type; en particulier, un entier et une liste d'entiers ne sont pas du même type. En d'autres termes, une liste imbriquée de variables n'est pas une liste, c'est un rosier!
Donc, tout d'abord, nous devons définir un type de données pour les rosiers:
(Strictement,
deriving Show
n'est nécessaire que si vous voulez voir les résultats. Mais c'est une technicité.) Avec cette définition en place, nous pouvons écrire une liste telle(1, 2, (3, 4))
quequi est considérablement moins lisible. Mais peu importe; c'est une traduction mécanique triviale. Préfixez chaque numéro avec
N
et chaque sous-arbre avecT
.Maintenant, nous devons calculer les priorités. Ce serait facile si la priorité d'un sous-arbre était simple, la somme de tous les éléments qu'il contient. Ce serait une boucle récursive triviale. Mais comme ce n'est pas le cas, nous devons définir deux fonctions: une qui se reproduit et une qui ne le fait pas.
Si nous devions additionner tous les sous-éléments, il
q
n'aurait pas besoin d'exister, sauvant un grand nombre de caractères. Tant pis!Edit: En fait, plusieurs commentateurs soulignent que vous pouvez éviter l'
q
utilisation d' une compréhension de la liste:[ x | N x <- t]
. Bon appel, les gars!(En fait,
p
il ne devrait pas non plus exister; nous pourrions demander au compilateur de générer automatiquement uneOrd
instance pour nous dans une poignée de caractères, et cette implémentation par défaut correspondrait à la spécification.)Enfin, nous devons récursif sur tous les sous-arbres et les trier:
Autrement dit,
f
trie un arbre en s’appliquant récursivement à tous les éléments (map f
), puis en appelant lasortBy
fonction pour trier le niveau supérieur. La première ligne indique que le tri d'un nombre ne fait rien et est nécessaire pour mettre fin à la récursivité.la source
sortBy (\ x y -> compare (p x) (p y))
est justesortOn p
. Utilisez la version infix de carte dansp
:sum$q<$>t
.sortOn
défini? J'ai toujours voulu savoir ...p(T t)=sum[x|N x<-t]
etdata T=N Int|T[T]deriving Show
. :)$
ensum$[x|N x<-t]
. Donc, 135-5-1 = 129. :)CLISP, 380 octets
Appelez la fonction q avec une liste.
Je suis un noob lisp, s'il vous plaît ne me tuez pas ^^
la source
Pyth, 15 octets
Suite de tests
Une fonction récursive, qui fonctionne comme suit:
la source
Java, 219 octets
Avec des sauts de ligne:
Il y a beaucoup de casting en cours qui augmente vraiment le nombre d'octets. : P
Les valeurs entières sont introduites dans un comparateur et les listes imbriquées sont d'abord triées avant que la somme des seules valeurs entières ne soit donnée au comparateur. Ces valeurs sont la façon dont le comparateur détermine leur position dans la liste lors de son tri.
Essayez-le ici .
la source
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
àint
comme ça, et le défi semble exiger que la liste est sortie.JavaScript (ES6), 86 octets
Tout ce tableau vérifiant :-(
la source
map.map.map.map.map.map.map.map.map