El reto
Su programa debe tomar 3 entradas:
- Un entero positivo que es el número de variables,
- Un conjunto de pares no ordenados de enteros no negativos, donde cada par representa una igualdad entre variables, y
- Un entero positivo que representa la variable inicial,
Debería devolver un conjunto de enteros no negativos que representan todas las variables que pueden ser transitivamente iguales a la variable inicial (incluida la propia variable inicial).
En otras palabras, entradas dadas N
, E
y S
, devolver un conjunto Q
, de tal manera que:
S ∈ Q
.- Si
Z ∈ Q
y(Y = Z) ∈ E
, entoncesY ∈ Q
. - Si
Z ∈ Q
y(Z = Y) ∈ E
, entoncesY ∈ Q
.
Esto también se puede expresar como un problema de teoría de grafos :
Dado un gráfico no dirigido y un vértice en el gráfico, enumere los vértices en su componente conectado .
Especificaciones
- Puede elegir usar indexación basada en 0 o en 1.
- La primera entrada cuenta el número de variables que están presentes, donde las variables se dan como números. Alternativamente, no puede tomar esta entrada, en cuyo caso se supone que es igual al índice variable más alto presente, o uno más, dependiendo de su esquema de indexación.
- Puede suponer que la entrada está bien formada: no se le darán variables fuera del rango especificado por la primera entrada. Por ejemplo,
3, [1 = 2, 2 = 0], 1
es una entrada válida, mientras4, [1 = 719, 1 = 2, 3 = 2], -3
que no lo es. - No puede suponer que ninguna variable tendrá ninguna igualdad asociada con ella. Si se le da una tercera entrada que es "solitaria" (no tiene igualdades), la salida correcta es un conjunto singleton que contiene solo esa entrada (ya que es igual a sí misma).
- Puede suponer que las igualdades no contendrán una igualdad de una variable a sí misma, y que la misma igualdad no se dará varias veces (esto incluye cosas como
1 = 2
y2 = 1
). - Puede suponer que todos los enteros dados estarán dentro del rango representable de su idioma.
- Puede tomar la segunda entrada en cualquier formato razonable.
Aquí hay algunos formatos razonables:
0 = 2
0 = 3
1 = 0
{(0, 2), (0, 3), (1, 0)}
[0, 2, 0, 3, 1, 0]
0 2 0 3 1 0
Graph[{{0, 2}, {0, 3}, {1, 0}}]
[0 = 2, 0 = 3, 1 = 0]
- Puede imprimir en cualquier formato razonable (es decir, conjunto, lista, etc.). El orden es irrelevante.
Puntuación
Este es el código de golf , por lo que gana el programa válido más corto (en bytes).
Casos de prueba (indexados 0)
3, [1 = 2, 2 = 0], 1 -> {0, 1, 2}
5, [0 = 2, 0 = 3, 1 = 2], 3 -> {0, 1, 2, 3}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 4 -> {2, 4}
6, [0 = 3, 1 = 3, 2 = 4, 5 = 1], 5 -> {0, 1, 3, 5}
5, [0 = 1, 2 = 0, 0 = 3, 4 = 0], 2 -> {0, 1, 2, 3, 4}
6, [0 = 1, 1 = 2, 2 = 3, 3 = 4, 4 = 5], 3 -> {0, 1, 2, 3, 4, 5}
4, [0 = 1, 1 = 2, 2 = 0], 3 -> {3}
5, [0 = 2, 2 = 4], 2 -> {0, 2, 4}
8, [], 7 -> {7}
Casos de prueba (1 indexado)
3, [2 = 3, 3 = 1], 2 -> {1, 2, 3}
5, [1 = 3, 1 = 4, 2 = 3], 4 -> {1, 2, 3, 4}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 5 -> {3, 5}
6, [1 = 4, 2 = 4, 3 = 5, 6 = 2], 6 -> {1, 2, 4, 6}
5, [1 = 2, 3 = 1, 1 = 4, 5 = 1], 3 -> {1, 2, 3, 4, 5}
6, [1 = 2, 2 = 3, 3 = 4, 4 = 5, 5 = 6], 4 -> {1, 2, 3, 4, 5, 6}
4, [1 = 2, 2 = 3, 3 = 1], 4 -> {4}
5, [1 = 3, 3 = 5], 3 -> {1, 3, 5}
8, [], 8 -> {8}
code-golf
graph-theory
equation
Fruta Esolanging
fuente
fuente
Respuestas:
Brachylog , 22 bytes
Pruébalo en línea!
Explicación
fuente
Python 2 ,
6563 bytes-2 bytes gracias a ovs
Pruébalo en línea!
fuente
Pyth , 12 bytes
Banco de pruebas.
fuente
Limpio ,
8581 bytesPruébalo en línea!
Define la función
$ :: [[Int]] -> ([Int] -> [Int])
fuente
limit
funcionaWolfram Language (Mathematica) , 32 bytes
Formato de entrada:
{2<->3, 3<->1}, 3
. No toma la primera entrada.Pruébalo en línea!
fuente
Lenguaje de script Operation Flashpoint , 364 bytes
Llamar con:
Salida:
Desenrollado:
fuente
Python 2 , 53 bytes
Pruébalo en línea!
Misma longitud que la función:
Pruébalo en línea!
Esto se basa en la buena solución de Rod usando la actualización de cortocircuito
b|=b&p and p
. Tomar el número de variables como entradan
ayuda a acortar el código del bucle.fuente
Jalea ,
121110 bytes-1 gracias a Erik the Outgolfer (reemplaza el átomo
œ&
conf
)Un enlace diádico que acepta
E
a la izquierda (como una lista de dos listas de longitud) yS
a la derecha (como un entero) que devuelve una lista [deduplicada].Pruébalo en línea! o ver un conjunto de pruebas .
¿Cómo?
fuente
œ&
Losf
valores de retorno ' y ' siempre tienen la misma propiedad booleana.Perl 5
-n0
,4939 bytesDé el valor inicial en una línea en STDIN seguido de líneas de pares de números equivalentes (o dé el valor inicial al final o en el medio o dé varios valores iniciales, todo funciona)
Pruébalo en línea!
Esto puede generar un elemento en el conjunto de resultados varias veces. Esta variación de 48 bytes genera cada elemento equivalente solo una vez:
Pruébalo en línea!
fuente
Rubí , 39 bytes
Pruébalo en línea!
fuente
K (ngn / k) ,
373635 bytesPruébalo en línea!
{
}
función con argumentosx
,y
yz
que representaN
,E
yS
respectivamente!x
es la lista 0 1 ... x-1&2
es la lista0 0
y,,&2
agregamos el par0 0
ay
evitar el caso especial de un vacíoy
+y,,&2
lo mismo transpuesto de una lista de pares a un par de listas{
}[+y,,&2]
es una proyección, es decir, una función en la quex
será el valor de+y,,&2
yy
será el argumento pasado al llamar a la proyección|y x
estáy
en índicesx
, invertido (|
)@[y;x;&;|y x]
enmendary
en los índicesx
tomando el mínimo (&
) del elemento existente y un elemento de|y x
/
sigue llamando hasta la convergenciaa:
asignar a una[z]=z
máscara booleana de los elementos dea
igual a laz
enésima&
convierte la máscara booleana en una lista de índicesfuente
Octava ,
4845 bytesToma la entrada como "matriz de adyacencia", por ejemplo utiliza
[0 0 0; 0 0 1; 1 0 0]
para[2 = 3, 3 = 1]
, pruébelo en línea!Explicación
Primero construimos la matriz de adyacencia completa para el gráfico transitivo, usando la suma de
eye(size(A))
(los elementos son reflexivos),A
(input) yA'
(la relación es simétrica).Calculamos la clausura transitiva mediante el cálculo de la potencia a
nnz(A)
la que basta (nnz(A)
es cota superior para la longitud de un camino), por lo que a partir de ahí todo lo que queda es conseguir la fila derecha con(u,:)
yfind
todas las entradas que no son cero.fuente
Python 2 , 87 bytes
Pruébalo en línea!
fuente
Pari / GP , 80 bytes
Pruébalo en línea!
fuente
JavaScript (ES6), 87 bytes
La desduplicación sería posible con
&&[...new Set(d[n]||[n])]
un costo de 14 bytes.fuente