Une matrice de signe alternatif est une matrice n
par n
composée des nombres -1, 0, 1, telle que:
- La somme de chaque ligne et colonne est 1
- Les entrées non nulles dans chaque ligne et colonne alternent dans le signe
Ces matrices généralisent les matrices de permutation, et le nombre de telles matrices pour une donnée n
était intéressant depuis un certain temps. Ils se produisent naturellement lors de la méthode de condensation de Dodgson pour calculer les déterminants matriciels (du nom de Charles Dodgson, mieux connu sous le nom de Lewis Carroll).
Voici quelques exemples de matrices de signes alternés 4 x 4:
0 1 0 0 1 0 0 0 0 0 1 0 0 0 1 0
0 0 1 0 0 0 1 0 0 1 -1 1 1 0 -1 1
1 0 0 0 0 1 -1 1 1 -1 1 0 0 1 0 0
0 0 0 1 0 0 1 0 0 1 0 0 0 0 1 0
Et voici quelques exemples de matrices 4 par 4 qui ne sont pas des matrices de signes alternées:
0 1 0 0
0 0 0 1
1 0 0 0
0 0 1 -1 (last row and last column don't add to 1)
0 0 0 1
1 0 0 0
-1 1 1 0
1 0 0 0 (third row does not alternate correctly)
Votre programme ou la fonction sera donnée une n
par n
matrice ( n >= 1
) de -1S, 0 et de 1 - sortie une valeur de truthy si la matrice est une matrice donnée de signe alterné, sinon sortie une valeur falsy.
Il s'agit de code-golf , donc l'objectif est de minimiser le nombre d'octets utilisés.
Cas de test
Les cas de test suivants sont donnés dans un format de liste 2D de type Python.
Vérité:
[[1]]
[[1,0],[0,1]]
[[0,1],[1,0]]
[[0,1,0],[0,0,1],[1,0,0]]
[[0,1,0],[1,-1,1],[0,1,0]]
[[0,1,0,0],[0,0,1,0],[1,0,0,0],[0,0,0,1]]
[[1,0,0,0],[0,0,1,0],[0,1,-1,1],[0,0,1,0]]
[[0,0,1,0],[0,1,-1,1],[1,-1,1,0],[0,1,0,0]]
[[0,0,1,0],[1,0,-1,1],[0,1,0,0],[0,0,1,0]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,0,-1,1],[0,0,0,1,0]]
[[0,0,1,0,0,0,0,0],[1,0,-1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
[[0,0,0,0,1,0,0,0],[0,0,1,0,-1,1,0,0],[0,0,0,1,0,0,0,0],[1,0,0,-1,1,-1,1,0],[0,1,-1,1,-1,1,0,0],[0,0,0,0,1,0,0,0],[0,0,1,0,0,0,0,0],[0,0,0,0,0,0,0,1]]
Faux:
[[0]]
[[-1]]
[[1,0],[0,0]]
[[0,0],[0,1]]
[[-1,1],[1,0]]
[[0,1],[1,-1]]
[[0,0,0],[0,0,0],[0,0,0]]
[[0,1,0],[1,0,1],[0,1,0]]
[[-1,1,1],[1,-1,1],[1,1,-1]]
[[0,0,1],[1,0,0],[0,1,-1]]
[[0,1,0,0],[0,0,0,1],[1,0,0,0],[0,0,1,-1]]
[[0,0,1,0],[0,0,1,0],[1,0,-1,1],[0,1,0,0]]
[[0,0,0,1],[1,0,0,0],[-1,1,1,0],[1,0,0,0]]
[[1,0,1,0,-1],[0,1,0,0,0],[0,0,0,0,1],[0,0,0,1,0],[0,0,0,0,1]]
[[0,0,1,0,0],[0,1,-1,1,0],[1,-1,1,0,0],[0,1,1,-1,0],[0,0,-1,1,1]]
[[0,-1,0,1,1],[1,-1,1,-1,1],[0,1,1,0,-1],[1,1,-1,1,-1],[-1,1,0,0,1]]
[[0,0,1,0,0,0,0,0],[1,0,1,0,1,0,0,0],[0,0,0,1,-1,0,0,1],[0,0,1,-1,1,0,0,0],[0,0,0,0,0,0,1,0],[0,0,0,0,0,1,0,0],[0,1,-1,1,0,0,0,0],[0,0,1,0,0,0,0,0]]
Réponses:
Rétine ,
62585653 octetsLe nombre d'octets suppose le codage ISO 8859-1, et le
\t
devrait être remplacé par des tabulations réelles (0x09 qui seraient transformées en espaces par SE sinon).Le format d'entrée est une matrice où chaque colonne utilise trois caractères alignés à droite, par exemple:
La sortie est soit
0
(fausse) soit1
(vraie).Suite de tests. (Les premières lignes transforment le format d'entrée et permettent à Retina d'exécuter plusieurs cas de test à la fois.)
Explication
Heureusement, l'entrée est une matrice carrée: la transposition de carrés est à peu près faisable dans la rétine, tandis que la transposition de rectangles est une douleur énorme.
Nous commençons par ajouter un onglet, l'entrée entière à nouveau (en utilisant le préfixe
$`
) puis un saut de ligne à la fin (en utilisant l'alias de Retina¶
). Nous utilisons un onglet pour séparer les deux copies afin de pouvoir les distinguer lorsque nous transposons l'une d'entre elles, et en utilisant un espace, nous pouvons économiser quelques octets plus tard.C'est le bit le plus délicat: transposer la première copie de la matrice. L'idée est de faire correspondre les cellules de la première copie, puis de les trier (de manière stable) par position horizontale. Nous faisons correspondre les cellules avec
...
(car elles ont toujours trois caractères de large), puis mesurons la position horizontale avec l'(.+)
intérieur du regard. Ensuite, pour nous assurer que nous ne transposons que la première copie, nous vérifions que nous pouvons atteindre le début de la chaîne sans passer devant un onglet.Vous remarquerez peut-être que cela correspondra également à certaines chaînes de trois octets (qui ne s'alignent même pas avec les cellules) dans la première ligne de la deuxième copie, car elles
.+
peuvent passer par l'onglet. Cependant, ce n'est pas un problème car la position horizontale de ces correspondances est strictement supérieure à celle de la première copie, de sorte que ces correspondances restent à leur position.Le reste est assez simple:
Nous supprimons les espaces et les zéros de l'entrée.
Et enfin, nous vérifions que la totalité de l'entrée est constituée de lignes terminées par des espaces du formulaire
1(-11)*
, c'est-à-dire une séquence alternée de1
et-1
qui commence et se termine par1
(car sinon, elle ne résume pas1
).la source
Gelée, 15 octets
Essayez-le en ligne!
la source
Pyth, 16 octets
Essayez-le en ligne: démonstration ou suite de tests
Explication:
la source
Gelée , 11 octets
Renvoie 1 pour les matrices de signe alternées, 0 sinon. Essayez-le en ligne! ou vérifiez tous les cas de test .
Contexte
Sans tenir compte des zéros, chaque ligne et colonne doit être constituée du motif (1, -1) * 1 , c'est-à-dire alterner les occurrences de 1 et -1 , commençant et se terminant par 1 (la somme est donc 1 ).
Pour vérifier que c'est le cas, nous prenons le tableau de toutes les lignes et colonnes et les joignons en utilisant -1 comme séparateur. Puisque tous les points de terminaison sont à 1 , le tableau plat résultant satisfait le modèle (1, -1) * 1 si et seulement si les lignes et les colonnes le font.
Pour le test réel, nous calculons la somme cumulée du tableau. Pour une matrice de signe alternée, le résultat sera un tableau de 0 et de 1 qui se termine par un 1 .
Nous inversons la somme cumulée et la dédupliquons, en conservant l'ordre des occurrences initiales de tous les éléments uniques. Pour une entrée véridique, le résultat sera la liste [1, 0] .
Pour sortir le booléen correspondant, nous convertissons les sommes cumulées dupliquées de binaire en entier et testons si le résultat est 2 .
Comment ça fonctionne
la source
MATL,
18161513 octets3 octets économisés grâce à @Luis
Cette solution accepte un tableau 2D en entrée et produira un tableau véridique ou falsey . Il est important de noter qu'en MATL, un tableau véridique est composé de tous les éléments non nuls tandis qu'un résultat de falsey a au moins un élément zéro. Voici une autre démonstration des tableaux truey / falsey .
Essayez-le en ligne
Version modifiée pour afficher tous les cas de test
Explication
la source
Julia, 36 octets
Essayez-le en ligne!
la source
JavaScript (ES6),
112100 bytesAplatit le tableau et sa transposition en chaînes, puis (en ignorant
0
s) vérifie le motif1-11...1-11
dans chaque chaîne.Edit: 12 octets enregistrés grâce à @PeterTaylor.
la source
-11-1...-11-1
parce que depuis les entrées de remplacement et ont somme positive, il doit y avoir un plus1
que-1
, de sorte que le modèle doit être1-11...1-11
.Python 2,
6360 octetsL'entrée est une liste de tuples.
Cela se termine par le code de sortie 0 pour les matrices de signe alternées et le code de sortie 1 sinon. C'est ce que font le vrai et le faux , et - comme indiqué dans la section de vérification - cela peut en effet être utilisé comme condition dans, par exemple, un script Bash.
Vérification
test-cases.txt
test-suite.sh
Production
Comment ça fonctionne
Sans tenir compte des zéros, chaque ligne et colonne doit être constituée du motif (1, -1) * 1 , c'est-à-dire alterner les occurrences de 1 et -1 , commençant et se terminant par 1 (la somme est donc 1 ).
Pour vérifier que c'est le cas, nous compressons / transposons la matrice d'entrée M , ajoutons le résultat à M (maintenant composé d'une liste de lignes et de colonnes) et ajoutons un -1 à chaque ligne / colonne.
Par exemple, si M est l'une des matrices suivantes (valide, non valide)
les résultats sont
La lecture de la matrice générée en ligne doit entraîner une séquence plate avec le motif (-1, 1) * . Pour vérifier que c'est le cas, nous prenons la somme cumulée de toutes les entrées, en commençant par la ligne du haut.
Pour les exemples de matrices, cela se traduit par
Pour une matrice de signe alternatif valide, la sortie sera composée de -1 et de 0 et - puisque chaque -1 annule le 1 précédent et vice versa - aucun autre nombre.
À première vue, cela peut sembler ne pas réussir à vérifier si la dernière colonne se termine par un 1 . Cependant, pour une matrice n × n contenant k zéros, les lignes valides contiendront n + k uns. Si toutes les colonnes sauf la dernière étaient également valides, il y en aurait n + k - 1 dans les colonnes, ce qui est impossible.
Pour vérifier qu'il n'y a pas d'autres nombres, nous stockons les sommes partielles dans une variable s et les mettons à jour pour chaque entrée de avec la matrice générée avec
s+=[n][s]
.Si s = 0 ou s = -1 , cela équivaut à
s+=n
. Cependant, pour toutes les autres valeurs de s , il provoque une IndexError , donc Python se termine immédiatement avec le code de sortie 1 . Si cela ne se produit à aucun moment, le programme se termine proprement avec le code de sortie 0 .la source
R, 54 octets
La fonction anonyme utilise la même logique que les réponses de Dennis Python 2, Jelly et Julia.
la source