Desviar un gráfico

16

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 nlista de longitud Ldonde 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.

  1. Eliminar todos los bucles automáticos.
  2. Para cada borde restante u -> v, agregue el borde invertido v -> usi 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]]
Zgarb
fuente

Respuestas:

5

Pyth, 17 16 bytes

.e-.|f}k@QTUQbkQ

Pruébelo en línea: Demostración o conjunto de pruebas

Explicación

                   implicit: Q = input
.e             Q   enumerated mapping of Q (k index, b out-neighbors):
     f     UQ         filter [0, 1, ..., len(Q)-1] for elements T, which satisfy:
      }k@QT              k in Q[T]
                      # this are the in-neighbors
   .|        b        setwise union with b 
  -           k       remove k
Jakube
fuente
Por cierto, .esolo se cambió de k,Ya k,b, así que para ejecutar esto, use.e-.|f}k@QTUQbkQ
isaacg
@isaacg lo hará, una vez que el compilador en línea se actualice.
Jakube
Ha sido actualizado
isaacg
5

CJam, 43 40 35 34 33 bytes

2 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 ...

q~_,,\ff{&W+0=)}_z..-{_,{;(},+}%`

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.

Martin Ender
fuente
3

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.

def u(g):e=enumerate;o=[set(_)-{i}for i,_ in e(g)];[o[j].add(i)for i,_ in e(o)for j in _];print map(list,o)

Yo uso conjuntos para evitar duplicados; Además, a diferencia list.remove(i), {S}-{i}no arroja un error si ino está en S.

Sirpercival
fuente
3

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]).

->k{n=k.size;n.times{|i|n.times{|j|(k[j]&[i])[0]&&k[i]=(k[i]<<j).uniq-[i]}};k}

ideona , incluidos todos los casos de prueba, que pasa.

blutorange
fuente
2

CJam, 26 bytes

l~_,,:T.-_T\ff&Tf.e&.|:e_p

No muy corto ...

Explicación

l~                           e# Read the input.
  _,,:T                      e# Get the graph size and store in T.
       .-                    e# Remove self-loops from the original input.
         _T\ff&              e# Check if each vertex is in each list, and
                             e# return truthy if yes, or empty list if no.
               Tf.e&         e# Convert truthy to vertex numbers.
                    .|       e# Merge with the original graph.
                      :e_    e# Remove empty lists.
                         p   e# Format and print.
jimmy23013
fuente
1

JavaScript (ES6), 96 110

Crear 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.

//Golfed 
U=l=>
  l.map((m,n)=>m.map(a=>a-n?s[n][a]=s[a][n]=1:0),s=l.map(m=>[]))
  &&s.map(a=>[~~k for(k in a)])

// Ungolfed

undirect=(adList)=>(
  adSets=adList.map(_ => []),
  adList.forEach((curAdList,curNode)=>{
    curAdList.forEach(adNode=>{
      if (adNode!=curNode) {
        adSets[curNode][adNode]=1,
        adSets[adNode][curNode]=1
      }
    })  
  }),
  adSets.map(adSet=>[~~k for(k in adSet)])
)

// Test
out=s=>OUT.innerHTML+=s+'\n'

test=[
 [ [], [] ]
,[ [[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]]
 ]
] 

show=l=>'['+l.map(a=>'['+a+']').join(',')+']'

test.forEach(t => (
  r = U(t[0]),
  ck = show(r) == show(t[1]),           
  out('Test ' + (ck ? 'OK: ':'FAIL: ') + show(t[0])+' -> ' + 
      '\nResult: ' + show(r) + 
      '\nCheck : ' + show(t[1]) + '\n\n')
) )
<pre id=OUT></pre>

edc65
fuente
0

Java, 150

a->{int i=0,j,k=a.size();for(;i<k;a.get(i).remove((Object)i++))for(j=k;j-->0;)if(a.get(j).contains(i)&!a.get(i).contains(j))a.get(i).add(j);return a;}

Código ampliado y ejecutable:

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Function
public class C {
    static Function<List<List<Integer>>, List<List<Integer>>> f = a -> {
        int i = 0, j, k = a.size();
        for (; i < k; a.get(i).remove((Object) i++)) {
            for (j = k; j-- > 0;) {
                if (a.get(j).contains(i) & !a.get(i).contains(j)) {
                    a.get(i).add(j);
                }
            }
        }
        return a;
    };
    public static void main(String[] args) {
        System.out.println(f.apply(new ArrayList(Arrays.asList(
                new ArrayList(Arrays.asList(0, 1)),
                new ArrayList(Arrays.asList(1)),
                new ArrayList(Arrays.asList(1, 0, 3)),
                new ArrayList(Arrays.asList()))
        )));
    }
}
Ypnypn
fuente
0

Maravilloso - 87

u={g->g.eachWithIndex{n,i->g[i]=n-i;g[i].each{g[it]<<i}};g.each{it=it.sort().unique()}}

Script completo para ejecutar pruebas:

u={g->g.eachWithIndex{n,i->g[i]=n-i;g[i].each{g[it]<<i}};g.each{it=it.sort().unique()}}
assert u([]) == []
assert u([[0]]) == [[]]
assert u([[],[0,1]]) == [[1],[0]]
assert u([[0,1],[]]) == [[1],[0]]
assert u([[0,1],[0],[1,0,3],[]]) == [[1,2],[0,2],[0,1,3],[2]]
assert u([[3],[],[5],[3],[1,3],[4]]) == [[3],[4],[5],[0,4],[1,3,5],[2,4]]
assert u([[0,1],[6],[],[3],[3],[1],[4,2]]) == [[1],[0,5,6],[6],[4],[3,6],[1],[1,2,4]]
assert u([[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]]
assert u([[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]]
assert u([[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]]
dbramwell
fuente
0

Mathematica, 84 66 64 bytes

Uso de indexación basada en 1.

MapIndexed[Union[#,First/@l~Position~Tr@#2]~Complement~#2&,l=#]&
alephalpha
fuente
0

Python 3, 127 bytes

l=list;g=l(map(set,eval(input())))
for i in range(len(g)):
    for j in g[i]:g[j]=g[j]^g[j]&{j}|{i}
print(l(map(l,g)))

Probar en línea

No es mi mejor intento ...

OrangeHat
fuente