Description du défi
Commençons par quelques définitions:
- une relation est un ensemble de paires d'éléments ordonnées (dans ce défi, nous utiliserons des entiers)
Par exemple, [(1, 2), (5, 1), (-9, 12), (0, 0), (3, 2)]
est une relation.
une relation est appelée transitive si pour deux paires d'éléments quelconques
(a, b)
et(b, c)
dans cette relation, une paire(a, c)
est également présente,[(1, 2), (2, 4), (6, 5), (1, 4)]
est transitif, car il contient(1, 2)
et(2, 4)
, mais(1, 4)
aussi,[(7, 8), (9, 10), (15, -5)]
est transitive, car il n'y a pas deux paires(a, b)
,(c, d)
présente telle queb
=c
.[(5, 9), (9, 54), (0, 0)]
n'est pas transitif, car il contient(5, 9)
et(9, 54)
, mais pas(5, 54)
Étant donné une liste de paires d'entiers, déterminez si une relation est transitive ou non.
Entrée sortie
Vous recevrez une liste de paires d'entiers dans n'importe quel format raisonnable. Considérons une relation
[(1, 6), (9, 1), (6, 5), (0, 0)]
Les formats suivants sont équivalents:
[(1, 6), (9, 1), (6, 5), (0, 0)] # list of pairs (2-tuples)
[1, 9, 6, 0], [6, 1, 5, 0] # two lists [x1, x2, ..., xn] [y1, y2, ..., yn]
[[1, 6], [9, 1], [6, 5], [0, 0] # two-dimentional int array
[4, 1, 6, 9, 1, 6, 5, 0, 0] # (n, x1, y1, ..., xn, yn)
[1+6i, 9+i, 6+5i, 0+0i] # list of complex numbers
... many others, whatever best suits golfing purposes
Sortie: une valeur véridique pour une relation transitive, fausse sinon. Vous pouvez supposer que l'entrée consistera en au moins une paire et que les paires sont uniques.
(1,3) (2,1) (3,4) (1,4) (2,4)
. Si les paires n'étaient pas ordonnées, cela ne serait pas transitif car(2,3)
manquant.[(7, 8), (9, 10), (15, -5)]
) ne doit-il pas être transitif?Réponses:
Haskell, 42 octets
Exemple d'utilisation:
f [(1,2), (2,4), (6,5), (1,4)]
->True
.Boucle (externe) sur toutes les paires
(a,b)
et boucle (interne) sur les mêmes paires, désormais appelées(c,d)
et à chaque fois lorsqueb==c
vérifier s'il(a,d)
existe également une paire existante. Combinez les résultats avec logiqueand
.la source
Prolog, 66 octets
La relation n'est pas transitive si nous pouvons trouver (A, B) et (B, C) tels que (A, C) ne tient pas.
la source
MATL ,
2725 octetsLe format d'entrée est une matrice (utilisant
;
comme séparateur de lignes) où chaque paire de la relation est une colonne. Par exemple, les cas de testsont respectivement saisies comme
La sortie véridique est une matrice formée de uns. La fausseté est une matrice qui contient au moins un zéro.
Essayez-le en ligne!
Explication
Le code réduit d'abord les entiers d'entrée à des valeurs entières uniques basées sur 1. À partir de ces valeurs, il génère la matrice d'adjacence; la matrice la multiplie par elle-même; et convertit les valeurs non nulles de la matrice de résultats en valeurs. Enfin, il vérifie qu'aucune entrée dans cette dernière matrice ne dépasse celle de la matrice d'adjacence.
la source
JavaScript (ES6),
6967 octetsEnregistré 2 octets grâce à une idée de @Cyoce. Il y avait quatre formulations précédentes de 69 octets:
la source
.every
[e]
, donc même si cela coûte 8 octets poure
vous affecter, vous enregistrez quand même un octet. Cependant, je suis allé plus loin en créant une abréviation poura.every
, ce qui a permis d'économiser un deuxième octet.Brachylog , 24 octets
Essayez-le en ligne!
Explication:
En d'autres termes, si l'entrée contient des paires
[A:B]
et[B:C]
, nous pouvons permuter l'entrée à mettre[A:B]
et[B:C]
au début, supprimer tous les autres éléments et produire une liste[A:B:B:C]
. Ensuite, nous retournons la vérité du prédicat intérieur (falsey de tout le programme) s'il[A:C]
n'y en a pas.la source
CJam (22 octets)
Suite de tests en ligne . Il s'agit d'un bloc (fonction) anonyme qui prend les éléments comme un tableau à deux niveaux, mais la suite de tests fait une manipulation de chaîne pour placer d'abord l'entrée dans un format approprié.
Dissection
la source
Pyth, 14 octets
Suite de tests
Le format d'entrée devrait être
[[0, 0], [0, 1], ... ]
la source
Mathematica, 49 octets
Fonction pure qui prend une liste de paires. Si la liste d'entrée contient
{a,b}
et{b,c}
mais pas{a,c}
pour certainsa, b, c
, la remplace par0
. Truthy est la liste d'entrée, la fausse est0
.la source
C ++ 14, 140 octets
Comme lambda sans nom retournant via le paramètre de référence. Nécessite que son entrée soit un conteneur de
pair<int,int>
. Prenant l'approche ennuyeuse O (n ^ 3).Non golfé et utilisation:
la source
Python 2 ,
916755 octetsEssayez-le en ligne!
-24 octets grâce à Leaky Nun
-12 octets grâce à Bubbler
la source
lambda x
enlambda s
.for
art.Axiome 103 octets
non golfé:
les exercices
la source
Pyth -
2221 octetsSuite de tests .
la source
Clojure,
5653 octetsMise à jour: Au lieu d'utiliser
:when
je vais vérifier que pour toutes les paires de[a b]
[c d]
deuxb != c
ou[a d]
se trouve de l'ensemble d'entrée.Original:
Wow, Clojure pour les boucles est cool: D Ceci vérifie que la
for
boucle ne génère pas de valeur falsifiée, qui se produit si elle[a d]
n'est pas trouvée dans le jeu d'entrée.Cette entrée doit être un ensemble de vecteurs à deux éléments:
Si l'entrée doit être de type liste, elle
(%[a d])
doit être remplacée par((set %)[a d])
pour 6 octets supplémentaires.la source
Ces deux solutions sont des fonctions sans nom prenant une liste de paires ordonnées en entrée et retournant
True
ouFalse
.Mathematica, 65 octets
#~Permutations~{2}]
crée la liste de toutes les paires ordonnées de paires ordonnées à partir de l'entrée et lesJoin@@@
convertit en quadruples ordonnés. Ceux-ci sont ensuite exploités par la fonctionIf[#2==#3,{#,#4},Nothing]&@@@
, qui a une propriété cool: si les deux éléments du milieu sont égaux, elle renvoie la paire ordonnée composée du premier et du dernier nombre; sinon, il revientNothing
, un jeton Mathematica spécial qui disparaît automatiquement des listes. Le résultat est donc l'ensemble des paires ordonnées qui doit être en entrée pour qu'il soit transitif;SubsetQ[#,...]
détecte cette propriété.Mathematica, 70 octets
Table[...,{i,#},{j,#}]
crée un tableau 2D indexé pari
etj
, qui sont extraits directement de l'entrée (d'où les deux paires ordonnées). La fonction de ces deux indices estLast@i!=#&@@j||#~MemberQ~{#&@@i,Last@j}
, ce qui se traduit par "soit le deuxième élément dei
et le premier élément dej
ne correspondent pas, soit l'entrée contient la paire ordonnée constituée du premier élément dei
et du dernier élément dej
". Cela crée un tableau 2D de booléens, quiAnd@@And@@@
s'aplatit en un seul booléen.la source
APL (NARS), 39 caractères, 78 octets
tester:
une seconde «solution» suit les étapes suivantes:
la source
Lisp commun, 121 octets
Essayez-le en ligne!
la source