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ícitoxx,/:\:xconcatene cada una de las izquierdasxcon 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 1o1 0.fuente
Jalea , 5 bytes
Pruébalo en línea!
fuente
fyƇen Jelly? Si lo leo en los documentos, ambos son filtros.fes " 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í). :)fyƇson dos cosas completamente separadas. Puede pensarfcomo una intersección (dadas dos listas, devuelve sus elementos comunes) yƇes comoʒen 05AB1E. En resumen:Œcdevuelve 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. Perofes 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.fen 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
iy la salidaoson 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
*xlugar 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
Subsetde longitud 2,Selectaquellas 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), yStringJoinlos 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 parespque tienenxcomo 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