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}
code-golf
graph-theory
equation
Esolanging Fruit
fonte
fonte
Respostas:
Braquilog , 22 bytes
Experimente online!
Explicação
fonte
Python 2 ,
6563 bytes-2 bytes graças a ovs
Experimente online!
fonte
Pitão , 12 bytes
Suíte de teste.
fonte
Limpo ,
8581 bytesExperimente online!
Define a função
$ :: [[Int]] -> ([Int] -> [Int])
fonte
limit
funciona?Wolfram Language (Mathematica) , 32 bytes
Formato de entrada:
{2<->3, 3<->1}, 3
. Não recebe a primeira entrada.Experimente online!
fonte
Linguagem de script da operação Flashpoint , 364 bytes
Ligue para:
Resultado:
Desenrolado:
fonte
Python 2 , 53 bytes
Experimente online!
Mesmo comprimento que a função:
Experimente online!
Isso se baseia na boa solução de Rod usando a atualização de curto-circuito
b|=b&p and p
. Tomar o número de variáveis como entradan
ajuda a diminuir o código do loop.fonte
Geléia ,
121110 bytes-1 graças a Erik the Outgolfer (substitua o átomo
œ&
porf
)Um link diádico aceitando
E
à esquerda (como uma lista de comprimento-duas-listas) eS
à direita (como número inteiro) retornando uma lista [desduplicada].Experimente online! ou veja uma suíte de testes .
Quão?
fonte
œ&
Osf
valores de retorno de s e sempre têm a mesma propriedade booleana.Perl 5
-n0
,4939 bytesDê o valor inicial em uma linha em STDIN seguido por linhas de pares de números equivalentes (ou dê o valor inicial por último ou no meio ou dê vários valores iniciais, tudo funciona)
Experimente online!
Isso pode gerar um elemento no conjunto de resultados várias vezes. Essa variação de 48 bytes gera cada elemento equivalente apenas uma vez:
Experimente online!
fonte
Ruby , 39 bytes
Experimente online!
fonte
K (ngn / k) ,
373635 bytesExperimente online!
{
}
função com argumentosx
,y
, ez
representandoN
,E
eS
respectivamente!x
é a lista 0 1 ... x-1&2
é a lista0 0
y,,&2
nós adicionamos o par0 0
paray
evitar o caso especial de um vazioy
+y,,&2
mesma coisa transposta de uma lista de pares para um par de listas{
}[+y,,&2]
é uma projeção, ou seja, uma função na qualx
será o valor+y,,&2
ey
será o argumento passado ao chamar a projeção|y x
estáy
nos índicesx
, invertido (|
)@[y;x;&;|y x]
alterar osy
índices,x
utilizando o mínimo (&
) do elemento existente e um elemento de|y x
/
continue ligando até convergênciaa:
atribuir a uma[z]=z
máscara booleana dos elementosa
igual az
-th&
converte a máscara booleana em uma lista de índicesfonte
Oitava ,
4845 bytesRecebe entrada como "adjacency-matrix", por exemplo, usa
[0 0 0; 0 0 1; 1 0 0]
para[2 = 3, 3 = 1]
, experimente online!Explicação
Primeiro, construímos a matriz de adjacência completa para o gráfico transitivo, usando a soma de
eye(size(A))
(elementos são reflexivos),A
(entrada) eA'
(a relação é simétrica).Calculamos o fechamento transitivo computando o poder de
nnz(A)
que é suficiente (nnz(A)
é limite superior para o comprimento de um caminho), então a partir daí tudo o que resta é fazer com que a linha direita com(u,:)
efind
todas as entradas diferentes de zero.fonte
Python 2 , 87 bytes
Experimente online!
fonte
Pari / GP , 80 bytes
Experimente online!
fonte
JavaScript (ES6), 87 bytes
A desduplicação seria possível usando
&&[...new Set(d[n]||[n])]
a um custo de 14 bytes.fonte