Le défi
Votre programme doit prendre 3 entrées:
- Un entier positif qui est le nombre de variables,
- Un ensemble de paires non ordonnées d'entiers non négatifs, où chaque paire représente une égalité entre les variables, et
- Un entier positif qui représente la variable de départ,
Il doit renvoyer un ensemble d'entiers non négatifs qui représentent toutes les variables qui peuvent être montrées transitoirement égales à la variable de départ (y compris la variable de départ elle-même).
En d' autres termes, les entrées données N
, E
et S
, renvoyer un jeu Q
tel que:
S ∈ Q
.- Si
Z ∈ Q
et(Y = Z) ∈ E
alorsY ∈ Q
. - Si
Z ∈ Q
et(Z = Y) ∈ E
alorsY ∈ Q
.
Cela peut également être exprimé comme un problème de théorie des graphes :
Étant donné un graphique non orienté et un sommet dans le graphique, répertoriez les sommets dans son composant connecté .
Caractéristiques
- Vous pouvez choisir d'utiliser l'indexation basée sur 0 ou basée sur 1.
- La première entrée compte le nombre de variables présentes, où les variables sont données sous forme de nombres. Alternativement, vous ne pouvez pas prendre cette entrée, auquel cas elle est supposée être égale à l'indice variable le plus élevé présent, ou à un de plus, selon votre schéma d'indexation.
- Vous pouvez supposer que l'entrée est bien formée: vous ne recevrez pas de variables en dehors de la plage spécifiée par la première entrée. Par exemple,
3, [1 = 2, 2 = 0], 1
est une entrée valide, tandis que ce4, [1 = 719, 1 = 2, 3 = 2], -3
n'est pas le cas. - Vous ne pouvez pas supposer qu'une variable sera associée à des égalités. Si une troisième entrée est "solitaire" (sans égalité), la sortie correcte est un ensemble singleton contenant uniquement cette entrée (car elle est égale à elle-même).
- Vous pouvez supposer que les égalités ne contiendront pas une égalité d'une variable à elle-même, et que la même égalité ne sera pas donnée plusieurs fois (cela inclut des choses comme
1 = 2
et2 = 1
). - Vous pouvez supposer que tous les entiers donnés seront dans la plage représentable de votre langue.
- Vous pouvez prendre la deuxième entrée dans n'importe quel format raisonnable.
Voici quelques formats raisonnables:
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]
- Vous pouvez produire dans n'importe quel format raisonnable (c.-à-d. Ensemble, liste, etc.). L'ordre n'est pas pertinent.
Notation
Il s'agit de code-golf , donc le programme valide le plus court (en octets) l'emporte.
Cas de test (indexés 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}
Cas de test (1 indexé)
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
la source
la source
Réponses:
Brachylog , 22 octets
Essayez-le en ligne!
Explication
la source
Python 2 ,
6563 octets-2 octets grâce aux ovs
Essayez-le en ligne!
la source
Pyth , 12 octets
Suite de tests.
la source
Nettoyer ,
8581 octetsEssayez-le en ligne!
Définit la fonction
$ :: [[Int]] -> ([Int] -> [Int])
la source
limit
marche?Wolfram Language (Mathematica) , 32 octets
Format d' entrée:
{2<->3, 3<->1}, 3
. Il ne prend pas la première entrée.Essayez-le en ligne!
la source
Langage de script Operation Flashpoint , 364 octets
Appeler avec:
Production:
Déroulé:
la source
Python 2 , 53 octets
Essayez-le en ligne!
Même longueur que la fonction:
Essayez-le en ligne!
Ceci est basé sur la belle solution de Rod utilisant la mise à jour de court-circuit
b|=b&p and p
. Prendre le nombre de variables en entréen
permet de raccourcir le code de boucle.la source
Gelée ,
121110 octets-1 grâce à Erik l'Outgolfer (remplacez l'atome
œ&
parf
)Un lien dyadique acceptant
E
à gauche (comme une liste de deux listes de longueur) etS
à droite (comme un entier) renvoyant une liste [dédoublonnée].Essayez-le en ligne! ou voir une suite de tests .
Comment?
la source
œ&
Lesf
valeurs de retour de et ont toujours la même propriété booléenne.Perl 5
-n0
,4939 octetsDonnez la valeur de départ sur une ligne sur STDIN suivie de lignes de paires de nombres équivalents (ou donnez la valeur de départ en dernier ou au milieu ou donnez plusieurs valeurs de départ, tout fonctionne)
Essayez-le en ligne!
Cela peut produire un élément dans le jeu de résultats plusieurs fois. Cette variation de 48 octets ne renvoie chaque élément équivalent qu'une seule fois:
Essayez-le en ligne!
la source
Rubis , 39 octets
Essayez-le en ligne!
la source
K (ngn / k) ,
373635 octetsEssayez-le en ligne!
{
}
fonction avec des argumentsx
,y
, etz
représentantN
,E
etS
respectivement!x
est la liste 0 1 ... x-1&2
est la liste0 0
y,,&2
nous ajoutons la paire0 0
poury
éviter le cas particulier d'un videy
+y,,&2
même chose transposée d'une liste de paires à une paire de listes{
}[+y,,&2]
est une projection, c'est-à-dire une fonction dans laquellex
sera la valeur de+y,,&2
ety
sera l'argument passé lors de l'appel de la projection|y x
esty
aux indicesx
, inversé (|
)@[y;x;&;|y x]
modifier lesy
indicesx
en prenant le minimum (&
) de l'élément existant et un élément de|y x
/
Continuez à appeler jusqu'à la convergencea:
assigner à una[z]=z
masque booléen des élémentsa
égaux auz
-ième&
convertir le masque booléen en une liste d'indicesla source
Octave ,
4845 octetsPrend l'entrée comme "matrice d'adjacence", par exemple utilise
[0 0 0; 0 0 1; 1 0 0]
pour[2 = 3, 3 = 1]
, essayez-le en ligne!Explication
Nous construisons d'abord la matrice d'adjacence complète pour le graphe transitif, en utilisant la somme de
eye(size(A))
(les éléments sont réflexifs),A
(entrée) etA'
(la relation est symétrique).Nous calculons la fermeture transitive en calculant la puissance à
nnz(A)
laquelle suffit (nnz(A)
est la limite supérieure de la longueur d'un chemin), donc à partir de là, tout ce qui reste est d'obtenir la ligne de droite avec(u,:)
etfind
toutes les entrées non nulles.la source
Python 2 , 87 octets
Essayez-le en ligne!
la source
Pari / GP , 80 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 87 octets
La déduplication serait possible en utilisant
&&[...new Set(d[n]||[n])]
un coût de 14 octets.la source