De nombreux sujets importants en algèbre abstraite impliquent une fonction binaire agissant sur un ensemble. Un certain nombre de propriétés de ces fonctions ont été définies dans l'étude de ces sujets.
Votre défi sera de déterminer si une fonction binaire donnée sur un domaine donné possède cinq de ces propriétés.
Propriétés
Une fonction binaire est fermée si toutes les sorties possibles se trouvent dans le domaine.
Une fonction binaire est associative si l'ordre dans lequel la fonction est appliquée à une série d'entrées n'affecte pas le résultat. C'est-à-dire qu'il $
est associatif s'il est (a $ b) $ c
toujours égal a $ (b $ c)
. Notez que la valeur (a $ b)
étant utilisée en entrée, les fonctions associatives doivent être fermées.
Une fonction binaire est commutative si l'échange de l'ordre des entrées ne change pas le résultat. En d'autres termes, si a $ b
toujours égal b $ a
.
Une fonction binaire a un élément d'identité s'il existe un élément e
dans le domaine tel que a $ e = a = e $ a
pour tous a
dans le domaine.
Une fonction binaire est idempotente si l'appliquer à deux entrées identiques donne ce nombre comme sortie. En d'autres termes, si a $ a = a
pour tous a
dans le domaine.
Contribution
Vous recevrez une fonction sous la forme d'une matrice, et le domaine de la fonction sera les nombres 0 ... n-1
, où n
est la longueur latérale de la matrice.
La valeur (a $ b)
est codée dans la matrice en tant que e élément de la a
troisième ligne b
. Si la matrice d'entrée est Q
, alors a $ b
=Q[a][b]
Par exemple, la fonction d'exponentiation ( **
en Python) sur le domaine [0, 1, 2]
est codée comme suit:
[[1, 0, 0]
[1, 1, 1]
[1, 2, 4]]
Les domaines gauche et droit sont identiques, donc la matrice sera toujours carrée.
Vous pouvez utiliser n'importe quel format de matrice pratique en entrée, comme une liste de listes, une seule liste dans l'ordre principal des lignes ou des colonnes, l'objet matriciel natif de votre langue, etc. Cependant, vous ne pouvez pas prendre directement une fonction en entrée.
Par souci de simplicité, les entrées de la matrice seront toutes des entiers. Vous pouvez supposer qu'ils correspondent au type d'entier natif de votre langue.
Production
Vous pouvez indiquer laquelle des propriétés ci-dessus contient dans n'importe quel format que vous choisissez, y compris une liste de booléens, une chaîne avec un caractère différent pour chaque propriété, etc. Cependant, il doit y avoir une sortie distincte et unique pour chacun des 24 sous-ensembles possibles des propriétés. Cette sortie doit être facilement lisible par l'homme.
Exemples
La fonction maximale sur le domaine n = 4:
[[0, 1, 2, 3]
[1, 1, 2, 3]
[2, 2, 2, 3]
[3, 3, 3, 3]]
Cette fonction a les propriétés de fermeture, d'associativité, de commutativité, d'identité et d'idempotence.
La fonction d'exponentiation sur le domaine n = 3:
[[1, 0, 0]
[1, 1, 1]
[1, 2, 4]]
Cette fonction n'a aucune des propriétés ci-dessus.
La fonction d'addition sur le domaine n = 3:
[[0, 1, 2]
[1, 2, 3]
[2, 3, 4]]
Cette fonction a les propriétés de commutativité et d'identité.
Le combinateur K sur le domaine n = 3:
[[0, 0, 0]
[1, 1, 1]
[2, 2, 2]]
Cette fonction a les propriétés de fermeture, d'associativité et d'idempotence.
La fonction de différence absolue sur le domaine n = 3:
[[0, 1, 2]
[1, 0, 1]
[2, 1, 0]]
Cette fonction a les propriétés de fermeture, de commutativité et d'identité.
La fonction moyenne, arrondie vers pair, sur le domaine n = 3:
[[0, 0, 1]
[0, 1, 2]
[1, 2, 2]]
Cette fonction a les propriétés de fermeture, commutativité, identité et idempotence.
La fonction d'égalité sur le domaine n = 3:
[[1, 0, 0]
[0, 1, 0]
[0, 0, 1]]
Cette fonction a les propriétés de fermeture et de commutativité.
Défi
C'est le golf de code. Des échappatoires standard s'appliquent. Le moins d'octets l'emporte.
c=all(l>)
?[i%i|i<-b]==b
.CJam, 95 octets
Imprime une sous-séquence de
*AC1I
.*
est le symbole de la fermeture ,A
est pour associatif ,C
est pour commutatif ,1
est pour identité etI
est pour idempotent .Le tableau d'entrée est lu
q~
et stocké dans A (:A
).Fermeture
Si tous les
:*
éléments ( ) de la matrice (Ae_
) sont inférieursf<
à B = taille (A) (A,:B
), imprimez a*
('**
).Associativité
Générez tous les triplets dans le domaine (
B3m*
). Nous imprimonsA
s'ils remplissent tous une condition ({...}%:*'A*
).La condition est que, pour certains triples
[i j k]
, le pliage à gauche de cette liste avec A (_{A==}*
) et le pliage à gauche son inverse[k j i]
(\W%
) avec A op ({Az==}*
), la version inversée deA
, soient égaux (=
).Commutativité
A doit être égale à sa transposition:
A_z=
. Si c'est le cas, nous imprimonsC
('C=
).Identité
L'identité est nécessairement unique, nous ne pouvons donc en imprimer qu'une
1
.Idempotent
Vérifiez si la diagonale est égale
B,
. Si oui, imprimez unI
.la source
Matlab, 226
Une chose importante à noter est que non fermé implique non associatif. Beaucoup de ces propriétés peuvent facilement être vérifiées en utilisant certaines propriétés de la matrice:
Entrée via la notation Matlab standard:
[a,b;c,d]
ou[[a,b];[c,d]]
ou[a b;c d]
etcLa sortie est un vecteur de zéros, 1 = vrai, 0 = faux, pour chacune des propriétés dans l'ordre donné.
Code complet:
la source
JavaScript (ES6) 165
Une fonction anonyme renvoyant un tableau avec cinq valeurs 0/1, qui sont dans l'ordre Clôture, Associativité, Commutativité, Identité et Idempotence.
Moins golfé
Tester
la source