O desafio
Seu programa deve receber 3 entradas:
- Um número inteiro positivo que é o número de variáveis,
- Um conjunto de pares não ordenados de números inteiros não negativos, em que cada par representa uma igualdade entre variáveis e
- Um número inteiro positivo que representa a variável inicial,
Ele deve retornar um conjunto de números inteiros não negativos que representam todas as variáveis que podem ser mostradas transitivamente iguais à variável inicial (incluindo a própria variável inicial).
Em outras palavras, dadas as entradas N
, E
e S
, retornar um conjunto Q
, de tal forma que:
S ∈ Q
.- Se
Z ∈ Q
e(Y = Z) ∈ E
, entãoY ∈ Q
. - Se
Z ∈ Q
e(Z = Y) ∈ E
, entãoY ∈ Q
.
Isso também pode ser expresso como um problema da teoria dos grafos :
Dado um gráfico não direcionado e um vértice no gráfico, liste os vértices em seu componente conectado .
Especificações
- Você pode optar por usar a indexação com base em 0 ou em 1.
- A primeira entrada conta o número de variáveis presentes, onde as variáveis são fornecidas como números. Como alternativa, você não pode receber essa entrada; nesse caso, assume-se que seja igual ao índice de variável mais alto presente ou a um mais que isso, dependendo do seu esquema de indexação.
- Você pode assumir que a entrada está bem formada: você não receberá variáveis fora do intervalo especificado pela primeira entrada. Por exemplo,
3, [1 = 2, 2 = 0], 1
é uma entrada válida, enquanto4, [1 = 719, 1 = 2, 3 = 2], -3
não é. - Você não pode assumir que qualquer variável terá igualdades associadas a ela. Se for fornecida uma terceira entrada "solitária" (sem igual), a saída correta é um conjunto de singleton contendo apenas essa entrada (já que é igual a si próprio).
- Você pode assumir que as igualdades não conterão uma igualdade de uma variável para si mesma e que a mesma igualdade não será dada várias vezes (isso inclui coisas como
1 = 2
e2 = 1
). - Você pode supor que todos os números inteiros fornecidos estejam dentro do intervalo representável do seu idioma.
- Você pode pegar a segunda entrada em qualquer formato razoável.
Aqui estão alguns formatos razoáveis:
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]
- Você pode imprimir em qualquer formato razoável (por exemplo, conjunto, lista etc.). A ordem é irrelevante.
Pontuação
Isso é código-golfe , então o programa válido mais curto (em bytes) vence.
Casos de teste (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 teste (1 indexados)
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}