Objectif
Triez une liste d'éléments en vous assurant que chaque élément est répertorié après ses dépendances spécifiées.
Contribution
Un tableau de tableaux d'entiers, où chaque entier spécifie l'index basé sur 0 ou 1 d'un autre élément que cet élément doit suivre. L'entrée peut être un tableau ou une chaîne ou tout autre élément lisible par l'homme.
Par exemple, une entrée basée sur 0:
[
[ 2 ], // item 0 comes after item 2
[ 0, 3 ], // item 1 comes after item 0 and 3
[ ], // item 2 comes anywhere
[ 2 ] // item 3 comes after item 2
]
Supposons qu'il n'y ait pas de dépendances circulaires, il y a toujours au moins un ordre valide.
Production
Les nombres par ordre de dépendance. Un ordre ambigu n'a pas à être déterministe. La sortie peut être un tableau ou du texte ou tout autre élément lisible par l'homme.
Une seule commande doit être indiquée dans la sortie, même s'il existe plusieurs commandes valides.
Les sorties possibles pour l'entrée ci-dessus incluent:
[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]
Notation
Une fonction ou un programme qui termine cela dans le moins d'octets gagne la gloire de l'acceptation. Le délai est de 6 jours.
Réponses:
Gelée, 8 octets
Ceci est basé sur l'approche en profondeur (non implémentée) de la réponse Python de @ xnor .
Essayez-le en ligne!
Comment ça fonctionne
la source
Pyth, 21 octets
Tester:
la source
Python 2, 73 octets
Trie les sommets par leur nombre de descendants, qui
f
calcule récursivement. Si un sommet pointe vers un autre sommet, ses descendants incluent le sommet pointé et tous les descendants de ce sommet, il a donc strictement plus de descendants. Ainsi, il est placé plus tard que le sommet pointé dans l'ordre, comme vous le souhaitez.Le nombre de descendants d'un sommet est un pour lui-même, plus le nombre de descendants de chacun de ses enfants. Notez qu'un descendant peut être compté plusieurs fois s'il y a plusieurs chemins qui y mènent.
Il aurait également fonctionné à la profondeur utilisée plutôt qu'au nombre de descendants
sauf
max
qu'il faudrait donner0
sur une liste vide.la source
Pyth, 19 octets
Essayez-le en ligne: Démonstration
Explication:
la source
Bash, 35 octets
Exemple d'exécution
Les E / S sont indexées sur 1. Chaque tableau va sur une ligne distincte, avec des espaces comme séparateur d'élément.
Comment ça fonctionne
tsort
- que j'ai appris dans la réponse de @ DigitalTrauma - lit des paires de jetons, séparées par des espaces, qui indiquent une commande partielle, et imprime une commande totale (sous la forme d'une liste triée de tous les jetons uniques) qui étend la commande partielle susmentionnée.Tous les nombres sur une ligne spécifique sont suivis d'un espace ou d'un saut de ligne. La
s/\s/ $. /g
partie de la commande Perl remplace ces caractères d'espacement par un espace, le numéro de ligne et un autre espace, s'assurant ainsi que chaque n sur la ligne k précède k .Enfin, si la ligne est vide (c'est-à-dire ne se compose que d'un saut de ligne), lui
s/^$/ /
ajoute un espace. De cette façon, la deuxième substitution transforme une ligne vide k enk k
, en s'assurant que chaque entier apparaît au moins une fois dans la chaîne qui est dirigée verstsort
.la source
tsort
mieux / plus vite que moi :) Merci pour l'explication supplémentaire.Bash + coreutils,
2080Saisie sous forme de lignes séparées par des espaces, par exemple:
nl
ajoute des indices de base zéro à toutes les lignessed
divise les listes de dépendances en paires de dépendances simples et rend dépendantes les dépendances incomplètes.tsort
fait le tri topologique requistac
met l'ordre inverse de sortieIdeone. Ideone avec le testcase de @Dennis
la source
Python 2,
143118116 116 octetsUne approche un peu plus aléatoire .
Modifications:
la source