Introducción
Dado un gráfico G no dirigido, podemos construir un gráfico L (G) (llamado gráfico lineal o gráfico conjugado) que representa las conexiones entre los bordes en G. Esto se hace creando un nuevo vértice en L (G) para cada borde en G y conectando estos vértices si los bordes que representan tienen un vértice en común.
Aquí hay un ejemplo de Wikipedia que muestra la construcción de un gráfico lineal (en verde).
Como otro ejemplo, tome este gráfico G con vértices A, B, C y D.
A
|
|
B---C---D---E
Creamos un nuevo vértice para cada borde en G. En este caso, el borde entre A y C está representado por un nuevo vértice llamado AC.
AC
BC CD DE
Y conecte los vértices cuando los bordes que representan tienen un vértice en común. En este caso, los bordes de A a C y de B a C tienen el vértice C en común, por lo que los vértices AC y BC están conectados.
AC
/ \
BC--CD--DE
Este nuevo gráfico es el gráfico lineal de G!
Ver Wikipedia para más información.
Desafío
Dada la lista de adyacencia para un gráfico G, su programa debe imprimir o devolver la lista de adyacencia para el gráfico lineal L (G). Este es el código de golf, por lo que gana la respuesta con la menor cantidad de bytes.
Entrada
Una lista de pares de cadenas que representan los bordes de G. Cada par describe los vértices que están conectados por ese borde.
- Se garantiza que cada par (X, Y) es único, lo que significa que la lista no contendrá (Y, X) o un segundo (X, Y).
Por ejemplo:
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")]
[("D","E"),("C","D"),("B","C"),("A","C")]
Salida
Una lista de pares de cadenas que representan los bordes de L (G). Cada par describe los vértices que están conectados por ese borde.
Cada par (X, Y) debe ser único, lo que significa que la lista no contendrá (Y, X) o un segundo (X, Y).
Para cualquier borde (X, Y) en G, el vértice que crea en L (G) debe llamarse XY (los nombres se concatenan juntos en el mismo orden en que se especifican en la entrada).
Por ejemplo:
[("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
[("DE","CD"),("CD","CB"),("CD","CA"),("BC","AB")]
Casos de prueba
[] -> []
[("0","1")] -> []
[("0","1"),("1","2")] -> [("01","12")]
[("a","b"),("b","c"),("c","a")] -> [("ab","bc"),("bc","ca"),("ca","ab")]
[("1","2"),("1","3"),("1","4"),("2","5"),("3","4"),("4","5")] -> [("12","13"),("12","14"),("12","25"),("13","14"),("13","34"),("14","34"),("14","45"),("25","45"),("34","45")]
fuente
[("1","23"),("23","4"),("12","3"),("3","4")]
, para la cual presumiblemente debería ser la salida[("123","234"),("123","34")]
, que no se puede interpretar correctamente. Creo que la única forma de solucionar esto es editar con la garantía de que la entrada nunca contendrá tales ambigüedades, pero si esta pregunta se hubiera publicado en el sandbox , habría sugerido que fuera menos prescriptivo sobre la denominación de vértices en la salida.Respuestas:
Ruby, 51 bytes
Pruébalo en línea!
Para cada combinación de dos aristas, si tienen un vértice en común (es decir, si el primer elemento de su intersección no es
nil
), imprima una matriz que contenga las dos aristas en STDOUT.fuente
JavaScript (Firefox 30-57), 77 bytes
Asume que todas las entradas son letras simples (bueno, cualquier carácter único que no sea
^
y]
).fuente
Brachylog , 13 bytes
Pruébalo en línea!
Con todos los casos de prueba
(-1 byte reemplazado
l₂
porĊ
, gracias a @Fatalize).fuente
Ċ
(pareja) en lugar del₂
guardar un byte.K (ngn / k) ,
4539332930 bytesPruébalo en línea!
,:'
envolver cada borde en una lista de 1 elemento{
}@
aplicar una función con argumento implícitox
x,/:\:x
concatene cada una de las izquierdasx
con cada una de las derechasx
, obtenga una matriz de resultados: todos los pares de aristas,/
aplanar la matriz(
)#
filtrar(3=#?,/)#
filtra solo aquellos pares cuya concatenación (,/
) tiene un recuento (#
) de exactamente 3?
elementos únicos ( )Esto elimina bordes como
("ab";"ab")
y("ab";"cd")
de la lista.(*>)#
filtra solo aquellos pares cuya permutación de clasificación descendente (>
) comienza con (*
) a 1 (no 0 es verdadero booleano)En nuestro caso, la permutación descendente podría ser
0 1
o1 0
.fuente
Jalea , 5 bytes
Pruébalo en línea!
fuente
f
yƇ
en Jelly? Si lo leo en los documentos, ambos son filtros.f
es " Filtro; elimine los elementos de x que no están en y " yƇ
es " Filtro (alias paraÐf
). Mantenga todos los elementos que cumplan una condición ". ¿Se usan siempre juntos? ¿SeƇ
usa para cerrar el filtrof
? Como en, ¿esf...Ƈ
similar aʒ...}
en 05AB1E? ¿O tiene algo que ver con/
(" Reducir o reducir n-sabio ")? Solo trato de entender el código, y estoy confundido por los dos comandos de filtro diferentes (y cómo se usan ambos aquí). :)f
yƇ
son dos cosas completamente separadas. Puede pensarf
como una intersección (dadas dos listas, devuelve sus elementos comunes) yƇ
es comoʒ
en 05AB1E. En resumen:Œc
devuelve todas las combinaciones posibles de dos elementos de la lista, luegoƇ
solo mantiene aquellas que satisfacen el enlace (es decir, la función Jelly)f/
, que devuelve la intersección de los dos elementos. Perof
es una díada (función de dos argumentos) y en su lugar debemos aplicarla en una lista de dos elementos, por lo que tenemos que usar/
reducir.f
en los documentos, aunque correcto, principalmente me confundió con el filtro real que seƇ
está utilizando. Su explicación de " dadas dos listas, devuelva sus elementos comunes " lo dejó todo claro. Y de hecho tuve la sensación de que/
se utilizó para convertir los datos de Jelly de alguna manera. En realidad, ahora veo la sección 6.6 Reducción en el Tutorial en el wiki de Jelly que explica cómo aparece una diada y empuja una mónada reducida (básicamente 2 argumentos frente a una lista de pares como argumento). Gracias, todo claro ahora!MATL , 13 bytes
Pruébalo en línea!
No es tan malo como esperaba dada la entrada de matriz de celdas. Básicamente la misma idea que la respuesta de Ruby de @ Doorknob .
fuente
C (gcc) , 173 bytes
La entrada
i
y la salidao
son matrices planas con terminación nula. Los nombres de salida pueden tener hasta 998 caracteres mucho antes de que esto se rompa.Pruébalo en línea!
fuente
*x
lugar dex[0]
y enint**
lugar dechar**
Mathematica 23 bytes
Ejemplo:
g = Graph[{1 <-> 2, 2 <-> 3, 3 <-> 4, 2 <-> 4 }]
(*
{2 <-> 1, 3 <-> 2, 4 <-> 1, 4 <-> 2, 4 <-> 3}
*)
fuente
Pyth , 7 bytes
Pruébalo aquí!
Si es necesario unirse, 10 bytes
Pruébalo aquí!
fuente
Wolfram Language
6453 bytesEncuentra todas las listas de entrada
Subset
de longitud 2,Select
aquellas en las que los nodos de un par se cruzan con los nodos de otro par (lo que indica que los pares comparten un nodo), yStringJoin
los nodos para todos los pares seleccionados.El código es especialmente difícil de leer porque emplea 4 anidados puros ( también conocidos como funciones "anónimas").
El código usa llaves, "{}", como delimitadores de lista, como es habitual en Wolfram Language.
1 byte guardado gracias al Sr. Xcoder.
Ejemplo
fuente
Select[#~Subsets~{2},IntersectingQ@@#&]/.{a_,b_}:>{""<>a,""<>b}&
- ¡ Pruébelo en línea!Python 2 , 109 bytes
Pruébalo en línea!
Para cada nodo
x
(descubierto haciendo un conjunto de la lista aplanada de bordes), haga una lista de los paresp
que tienenx
como miembro; luego, para cada una de esas listasQ
, encuentre los pares únicos y distintos dentroQ
(la unicidad / distinción se aplica a través deif s<t
).fuente
C # 233 bytes
Ejemplo
fuente