Objetivo
Classifique uma lista de itens, garantindo que cada item seja listado após suas dependências especificadas.
Entrada
Uma matriz de matrizes de números inteiros, em que cada número inteiro especifica o índice com base em 0 ou em 1 de outro item que esse item deve vir depois. A entrada pode ser uma matriz ou string ou qualquer outra coisa legível por humanos.
Por exemplo, uma entrada baseada em 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
]
Suponha que não haja dependências circulares, sempre há pelo menos um pedido válido.
Resultado
Os números em ordem de dependência. Uma ordem ambígua não precisa ser determinística. A saída pode ser uma matriz ou texto ou qualquer outra coisa legível por humanos.
Somente um pedido deve ser fornecido na saída, mesmo quando houver vários pedidos válidos.
As saídas possíveis para a entrada acima incluem:
[ 2, 3, 0, 1 ]
[ 2, 0, 3, 1 ]
Pontuação
Uma função ou programa que conclua isso no menor número de bytes ganha a glória da aceitação. O prazo é de 6 dias.
Respostas:
Geléia, 8 bytes
Isso se baseia na abordagem de profundidade (não implementada) da resposta em Python do @ xnor .
Experimente online!
Como funciona
fonte
Pitão, 21 bytes
Teste:
fonte
Python 2, 73 bytes
Classifica os vértices pela contagem de descendentes, que
f
calcula recursivamente. Se um vértice aponta para outro vértice, seus descendentes incluem o vértice pontudo e todos os descendentes desse vértice; portanto, há estritamente mais descendentes. Portanto, ele é colocado depois do vértice apontado na ordem, conforme desejado.A contagem de descendentes de um vértice é uma para si, mais a contagem de descendentes de cada um de seus filhos. Observe que um descendente pode ser contado várias vezes se houver vários caminhos que levam a ele.
Também teria trabalhado para usar a profundidade em vez da contagem de descendentes
exceto o
max
precisaria dar0
em uma lista vazia.fonte
Pitão, 19 bytes
Experimente online: Demonstração
Explicação:
fonte
Bash, 35 bytes
Exemplo de execução
A E / S é indexada 1. Cada matriz segue uma linha separada, com espaço em branco como separador de itens.
Como funciona
tsort
- sobre o qual aprendi na resposta do @ DigitalTrauma - lê pares de tokens, separados por espaços em branco, que indicam uma ordem parcial e imprime uma ordem total (na forma de uma lista classificada de todos os tokens exclusivos) que estende a ordem parcial acima mencionada.Todos os números em uma linha específica são seguidos por um espaço ou um avanço de linha. A
s/\s/ $. /g
parte do comando Perl substitui esses caracteres de espaço em branco por um espaço, o número da linha e outro espaço, garantindo assim que cada n na linha k preceda k .Finalmente, se a linha estiver vazia (ou seja, consistir apenas em um avanço de linha), ele adicionará
s/^$/ /
um espaço a ela. Dessa forma, a segunda substituição transforma uma linha vazia k emk k
, certificando-se de que cada número inteiro ocorra pelo menos uma vez na sequência que é canalizadatsort
.fonte
tsort
melhor / mais rápido do que eu :) Obrigado pela explicação extra.Bash + coreutils,
2080Entrada como linhas separadas por espaço, por exemplo:
nl
adiciona índices baseados em zero a todas as linhassed
divide listas de impedimentos em pares de dependências simples e torna dependências incompletas dependentes de si mesmas.tsort
faz o tipo topológico necessáriotac
coloca a ordem inversa de saídaIdeone. Ideone com o testcase do @Dennis
fonte
Python 2,
143118116 bytesUma abordagem um pouco mais aleatória .
Editar% s:
fonte