Introdução
Nesse desafio, você recebe um gráfico direcionado com auto-loops e sua tarefa é convertê-lo em um gráfico não direcionado sem auto-loops.
Entrada
Sua entrada é um gráfico direcionado com vértice definido {0, 1, ..., n-1}
para algum número natural n ≥ 0
(ou {1, 2, ..., n}
se você usar a indexação baseada em 1). O gráfico é fornecido como uma n
lista de comprimento, L
onde L[i]
está uma lista dos vizinhos externos do vértice i
. Por exemplo, a lista [[0,1],[0],[1,0,3],[]]
representa o gráfico
.-.
| v
'-0<--2-->3
^ |
| |
v |
1<--'
Observe que as listas de vizinhos não são necessariamente ordenadas, mas são garantidas como livres de duplicação.
Resultado
Sua saída é outro gráfico no mesmo formato da entrada, obtido da seguinte forma.
- Exclua todos os auto-loops.
- Para cada aresta restante
u -> v
, adicione a aresta invertida,v -> u
se ainda não estiver presente.
Assim como na entrada, as listas de vizinhos do gráfico de saída podem não estar ordenadas, mas não podem conter duplicatas. Para o gráfico acima, seria uma saída correta [[1,2],[0,2],[0,1,3],[2]]
, que representa o gráfico
0<->2<->3
^ ^
| |
v |
1<--'
Regras
Você pode usar a indexação com base em 0 ou em 1 nos gráficos. Ambas as funções e programas completos são aceitáveis. A menor contagem de bytes vence e as brechas padrão não são permitidas.
Casos de teste
Esses casos de teste usam indexação baseada em 0; incremente cada número no caso baseado em 1. Essas listas de vizinhos são classificadas em ordem crescente, mas não são necessárias.
[] -> []
[[0]] -> [[]]
[[],[0,1]] -> [[1],[0]]
[[0,1],[]] -> [[1],[0]]
[[0,1],[0],[1,0,3],[]] -> [[1,2],[0,2],[0,1,3],[2]]
[[3],[],[5],[3],[1,3],[4]] -> [[3],[4],[5],[0,4],[1,3,5],[2,4]]
[[0,1],[6],[],[3],[3],[1],[4,2]] -> [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
[[6],[0,5,1],[5,4],[3,5],[4],[5,6],[0,3]] -> [[1,6],[0,5],[4,5],[5,6],[2],[1,2,3,6],[0,3,5]]
[[1,0],[5,1],[5],[1],[5,7],[7,1],[],[1]] -> [[1],[0,3,5,7],[5],[1],[5,7],[1,2,4,7],[],[1,4,5]]
[[2,8,0,9],[5,2,3,4],[0,2],[3,7,4],[8,1,2],[5,1,9,2],[6,9],[6,5,2,9,0],[9,1,2,0],[3,9]] -> [[2,7,8,9],[2,3,4,5,8],[0,1,4,5,7,8],[1,4,7,9],[1,2,3,8],[1,2,7,9],[7,9],[0,2,3,5,6,9],[0,1,2,4,9],[0,3,5,6,7,8]]
.e
foi só mudou a partirk,Y
dek,b
, por assim executar este, o uso.e-.|f}k@QTUQbkQ
CJam,
4340353433 bytes2 bytes salvos pelo Sp3000.
Isso começou como uma solução realmente elegante e depois se tornou cada vez mais horrível quando tentei consertar alguns buracos que eu ignorava. Ainda não tenho certeza se a idéia original ainda pode ser recuperada, mas vou tentar o meu melhor ...
Teste aqui. Como alternativa, execute todo o equipamento de teste .
Vou acrescentar uma explicação quando tiver certeza de que o paciente está morto.
fonte
Python 2, 107 bytes
Ainda estou tentando descobrir se posso jogar mais isso, mas, por enquanto, é o melhor que posso fazer.
Eu uso conjuntos para evitar duplicatas; Além disso, ao contrário
list.remove(i)
,{S}-{i}
não gera um erro sei
não estiverS
.fonte
Ruby, 78 bytes
Finalmente, algum uso para operadores de conjuntos de ruby (
[1,2]&[2]==[2]
e[3,4,5]-[4]==[3,5]
).ideona , incluindo todos os casos de teste pelos quais passa.
fonte
CJam, 26 bytes
Não é muito curto ...
Explicação
fonte
JavaScript (ES6), 96
110Criar conjuntos de adjacências a partir da lista de adjacências, que ajuda a evitar duplicatas. Até o momento, ele recria as listas a partir dos conjuntos.
fonte
Java, 150
Código executável expandido:
fonte
Groovy - 87
Script completo para executar testes:
fonte
Mathematica,
846664 bytesUsando indexação baseada em 1.
fonte
Python 3, 127 bytes
Experimente on-line
Não é minha melhor tentativa ...
fonte