Introducción
En este desafío, se le proporciona un gráfico dirigido con bucles automáticos, y su tarea es convertirlo en un gráfico no dirigido sin bucles automáticos.
Entrada
Su entrada es un gráfico dirigido con un conjunto de vértices {0, 1, ..., n-1}
para algún número natural n ≥ 0
(o {1, 2, ..., n}
si usa indexación basada en 1). El gráfico se proporciona como una n
lista de longitud L
donde L[i]
es una lista de los vecinos externos del vértice i
. Por ejemplo, la lista [[0,1],[0],[1,0,3],[]]
representa el gráfico
.-.
| v
'-0<--2-->3
^ |
| |
v |
1<--'
Tenga en cuenta que las listas de vecinos no están necesariamente ordenadas, pero se garantiza que no tendrán duplicados.
Salida
Su salida es otro gráfico en el mismo formato que la entrada, que se obtiene de la siguiente manera.
- Eliminar todos los bucles automáticos.
- Para cada borde restante
u -> v
, agregue el borde invertidov -> u
si aún no está presente.
Al igual que con la entrada, las listas vecinas del gráfico de salida pueden estar desordenadas, pero no pueden contener duplicados. Para el gráfico anterior, sería una salida correcta [[1,2],[0,2],[0,1,3],[2]]
, que representa el gráfico
0<->2<->3
^ ^
| |
v |
1<--'
Reglas
Puede usar la indexación basada en 0 o en 1 en los gráficos. Ambas funciones y programas completos son aceptables. El conteo de bytes más bajo gana, y las lagunas estándar no se permiten.
Casos de prueba
Estos casos de prueba usan indexación basada en 0; incremente cada número en el caso basado en 1. Estas listas de vecinos se ordenan en orden ascendente, pero no es obligatorio.
[] -> []
[[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
solo se cambió dek,Y
ak,b
, así que para ejecutar esto, use.e-.|f}k@QTUQbkQ
CJam,
4340353433 bytes2 bytes guardados por Sp3000.
Esto comenzó como una solución realmente elegante y luego se volvió cada vez más horrible a medida que intentaba arreglar algunos agujeros que pasé por alto. Todavía no estoy seguro si la idea original aún es rescatable, pero haré lo mejor que pueda ...
Pruébalo aquí. Alternativamente, ejecute todo el arnés de prueba .
Agregaré una explicación una vez que esté seguro de que el paciente está muerto.
fuente
Python 2, 107 bytes
Todavía trato de averiguar si puedo jugar más al golf, pero por ahora, esto es lo mejor que puedo hacer.
Yo uso conjuntos para evitar duplicados; Además, a diferencia
list.remove(i)
,{S}-{i}
no arroja un error sii
no está enS
.fuente
Ruby, 78 bytes
Finalmente algo de uso para los operadores de conjuntos de ruby (
[1,2]&[2]==[2]
y[3,4,5]-[4]==[3,5]
).ideona , incluidos todos los casos de prueba, que pasa.
fuente
CJam, 26 bytes
No muy corto ...
Explicación
fuente
JavaScript (ES6), 96
110Crear conjuntos de adyacencia a partir de la lista de adyacencia, eso ayuda a evitar duplicados. El último anuncio reconstruye las listas a partir de los conjuntos.
fuente
Java, 150
Código ampliado y ejecutable:
fuente
Maravilloso - 87
Script completo para ejecutar pruebas:
fuente
Mathematica,
846664 bytesUso de indexación basada en 1.
fuente
Python 3, 127 bytes
Probar en línea
No es mi mejor intento ...
fuente