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

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

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.


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.


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.


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.

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>


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()))
        )));
    }
}

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

0

Mathematica, 84 66 64 bytes

Uso de indexación basada en 1.

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

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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.