Objetivo
Ordene una lista de elementos para asegurarse de que cada elemento aparezca después de sus dependencias especificadas.
Entrada
Una matriz de matrices de enteros, donde cada entero especifica el índice basado en 0 o en 1 de otro elemento que este elemento debe seguir. La entrada puede ser una matriz o cadena o cualquier otra cosa legible por humanos.
Por ejemplo, una entrada basada en 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
]
Suponga que no hay dependencias circulares, siempre hay al menos un pedido válido.
Salida
Los números en orden de dependencia. Un orden ambiguo no tiene que ser determinista. La salida puede ser una matriz o texto o cualquier otra cosa legible por humanos.
Solo se debe dar un pedido en la salida, incluso cuando hay varios pedidos válidos.
Las salidas posibles para la entrada anterior incluyen:
[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]
Puntuación
Una función o programa que completa esto en el menor número de bytes gana la gloria de la aceptación. La fecha límite es en 6 días.
Respuestas:
Jalea, 8 bytes
Esto se basa en el enfoque de profundidad (no implementado) de la respuesta Python de @ xnor .
Pruébalo en línea!
Cómo funciona
fuente
Pyth, 21 bytes
Prueba:
fuente
Python 2, 73 bytes
Ordena los vértices por su recuento descendiente, que se
f
calcula de forma recursiva. Si un vértice apunta a otro vértice, sus descendientes incluyen el vértice puntiagudo y todos los descendientes de ese vértice, por lo que tiene estrictamente más descendientes. Por lo tanto, se coloca más tarde que el vértice puntiagudo en el orden, como se desee.El recuento descendiente de un vértice es uno por sí mismo, más el recuento descendiente de cada uno de sus hijos. Tenga en cuenta que un descendiente se puede contar varias veces si hay varias rutas que conducen a él.
También habría funcionado con la profundidad utilizada en lugar del recuento de descendientes
excepto que
max
tendría que dar0
en una lista vacía.fuente
Pyth, 19 bytes
Pruébelo en línea: demostración
Explicación:
fuente
Bash, 35 bytes
Ejecución de ejemplo
La E / S está indexada en 1. Cada matriz va en una línea separada, con espacios en blanco como separador de elementos.
Cómo funciona
tsort
- que aprendí en la respuesta de @ DigitalTrauma - lee pares de tokens, separados por espacios en blanco, que indican un orden parcial, e imprime un orden total (en forma de una lista ordenada de todos los tokens únicos) que extiende el orden parcial mencionado anteriormente.Todos los números en una línea específica van seguidos de un espacio o un salto de línea. La
s/\s/ $. /g
parte del comando Perl reemplaza esos caracteres de espacios en blanco con un espacio, el número de línea y otro espacio, asegurándose de que cada n en la línea k precede a k .Finalmente, si la línea está vacía (es decir, consiste solo en un
s/^$/ /
salto de línea), le antepone un espacio. De esta manera, la segunda sustitución convierte una línea vacía k enk k
, asegurándose de que cada número entero ocurra al menos una vez en la cadena que se canalizatsort
.fuente
tsort
mejor / más rápido que yo :) Gracias por la explicación adicional.Bash + coreutils,
2080Ingrese como líneas separadas por espacios, por ejemplo:
nl
agrega índices basados en cero a todas las líneassed
divide las listas de dependencias en pares de dependencias simples y hace que las dependencias incompletas dependan de sí mismas.tsort
hace el tipo topológico requeridotac
pone la salida en orden inversoIdeona Ideone con el caso de prueba de @Dennis
fuente
Python 2,
143118116 bytesUn enfoque un poco más aleatorio .
Ediciones:
fuente