Définition
Une matrice en pointe de flèche est une matrice dont toutes les entrées sont égales à 0 , à l'exception de celles de la diagonale principale, de la rangée du haut et de la colonne la plus à gauche. En d'autres termes, la matrice devrait ressembler à ceci:
* * * * * * * * 0 0 0 0 * 0 * 0 0 0 * 0 0 * 0 0 * 0 0 0 * 0 * 0 0 0 0 *
Où chaque * est une entrée non nulle.
Tâche
Étant donné une matrice carrée d’entiers non négatifs, vérifiez si elle correspond à une flèche conformément à la définition ci-dessus.
Vous ne pouvez pas prendre la taille de la matrice en tant qu'entrée, sauf si l'équivalent linguistique d'un tableau ressemble à un pointeur et à une longueur (comme C). Ce sera toujours au moins 3 x 3.
Le code le plus court en octets dans chaque langue gagne.
Entrée et sortie
Vous pouvez choisir l’un des formats suivants pour recevoir des entrées:
- Une matrice dans le type de matrice natif (si votre langue en a une)
- Un tableau 2D 1 (un tableau de tableaux 1D, chacun correspondant à une ligne)
- Un tableau 1D (puisque la matrice est toujours carrée)
- Une chaîne (vous avez choisi l'espacement, mais s'il vous plaît, n'abusez pas de cette manière).
Lorsqu'il s'agit de fournir une sortie, vous pouvez signaler une valeur de vérité / fausseté conformément à la définition standard du problème de décision ou choisir deux valeurs distinctes et cohérentes.
De plus, vous pouvez entrer et donner des sorties à l'aide de n'importe quelle méthode standard , dans n'importe quel langage de programmation , tout en prenant note que ces failles sont interdites par défaut. Si vous voulez choisir un autre format ou si vous n'êtes pas sûr de quelque chose, veuillez le demander dans les commentaires.
1: ou l'équivalent de votre langue (liste, vecteur, etc.)
Exemples
Regardons les exemples suivants:
1 2 2 2 2 1 0 0 3 0 1 0 4 0 0 1
Il s'agit d'une matrice en pointe de flèche (vos programmes doivent indiquer une valeur de vérité), car les éléments de la diagonale principale sont 1 1 1 1
, ceux de la ligne supérieure sont 1 2 2 2
et ceux de la colonne la plus à gauche 1 2 3 4
. Toutes les autres entrées sont 0 , cela satisfait donc toutes les conditions.
3 5 6 7 1 0 8 0 0
Cette matrice n'est pas une flèche car il y a un 0 sur la diagonale principale.
9 9 9 9 9 9 0 0 9 7 9 0 9 0 0 9
Celui-ci n'est pas non plus une pointe de flèche, car il contient un 7 à la place d'un 0 .
Plus de cas de test
Vérité
[[1, 1, 1], [1, 1, 0], [1, 0, 1]] [[1, 2, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 2, 2, 2], [2, 1, 0, 0], [3, 0, 1, 0], [4, 0, 0, 1]] [[34, 11, 35, 5], [56, 567, 0, 0], [58, 0, 679, 0], [40, 0, 0, 7]]
Fausseté:
[[3, 5, 6], [7, 1, 0], [8, 0, 0]] [[9, 9, 9, 9], [9, 9, 0, 0], [9, 7, 9, 0], [9, 0, 0, 9]] [[1, 0, 3, 4], [1, 1, 0, 0], [1, 0, 1, 0], [1, 0, 0, 1]] [[1, 6, 3, 4], [13, 2, 0, 6], [29, 0, 1, 0], [2, 0, 0, 4]]
Réponses:
Javascript (ES6),
4847 octetsEnregistré 1 octet grâce à edc65
Retourne
false
pour les matrices en pointe de flèche ettrue
pour les matrices sans pointe de flèche (autorisé, car deux valeurs distinctes peuvent être utilisées pour représenter vrai et faux)Cas de test:
Afficher l'extrait de code
la source
f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
f=
bien sûr;-)
J ,
2120191715 octets-4 octets grâce à @GalenIvanov.
Prend les entrées sous forme de matrice (tableau de rang 2).
Essayez-le en ligne!
Explication
Laissez l’historique des modifications vous servir de leçon pour ne pas jouer au golf et rédigez une explication en même temps.
Explication visuelle
Notez que ceci est fait sur le REPL (les entrées sont données en commençant par trois espaces et les sorties sont données sans espaces en tête). Pour cette raison, j’ignore parfois les fonctions de composition comme
@
et&
puisque les éléments de la réplique sont évalués de droite à gauche (les fonctions sont plus complexes).Supposons que vous ayez l'exemple de matrice suivant:
Tout d’abord, je voudrais expliquer (et saluer) @ la façon très intelligente de GalenIvanov de générer la matrice d’identité, qui est la suivante
=&/:@}.
.Tout d'abord, nous décapitons la matrice d'entrée (
}.
).Ensuite, nous obtenons les indices dans
/:
lesquels chaque ligne se trouverait si les lignes étaient triées avec -grade up.Notez que les index résultants sont uniques : la liste ne contient aucun élément en double (et pourquoi? Il n'y a aucun moyen de placer deux éléments à la même position dans un tableau).
Enfin, nous utilisons la niche mais utile
=
-self-classify. Cette monade compare chaque élément unique à tous les autres éléments d'un tableau. N'oubliez pas que j'ai mentionné qu'il était important que les indicateurs résultants soient uniques. Puisque=
-self-classify effectue les comparaisons dans l'ordre dans lequel les éléments uniques apparaissent dans la liste, le résultat obtenu sera la matrice d'identité pour une entrée unique (c'est pourquoi=@i.
vous pouvez créer une matrice d'identité d'une longueur donnée).Une fois que nous avons la matrice d'identité, il suffit d'ajouter une rangée et une colonne, ce qui est fait très simplement (si un atome est attribué - c'est-à-dire un seul élément - la
,
famille le répétera pour le remplir quand il sera ajouté) :Ensuite, nous comparons simplement la matrice de pointe de flèche générée au signe de la matrice d’entrée.
la source
*
assez au lieu de0@<
(pour 17 octets)? Essayez-le=&/:
quand je l’ai combinée}.
, j’ai eu cela*-:1,1,.=&/:@}.
pour 15 octets Essayez-le en ligne!/:
-grade et}.
-behead), merci encore! Je vais l'éditer.*-:1,1,.=@}.
fonctionne très bien - pas besoin de manière sophistiquée de trouver la matrice d'identité. Vous pouvez générer une matrice d'identité à partir de la matrice carrée elle-même simplement par=
. Donc, supprimez une ligne avec}.
, créez la matrice d’identité avec=
, ajoutez une ligne et une colonne avec1
et ainsi de suite.Wolfram Language (Mathematica) , 47 octets
Essayez-le en ligne!
Explication:
Clip@#
remplace tous les nombres non nuls de la matrice par 1, puis on compare cela à un tableau de dimensions{1,1}Tr[1^#]
={Length@#, Length@#}
avec 0 en positioni,j
quand1 < i != j > 1
, et 1 sinon.(Approximativement basé sur la réponse d'Uriel .)
Voici une autre idée de 16 octets de plus - n'hésitez pas à la voler si vous pouvez jouer au golf:
Essayez-le en ligne!
la source
APL (Dyalog Classic) ,
19161513 octets-1 octet grâce à @ErikTheOutgolfer
(
⎕IO←0
)Essayez-le en ligne!
-2 octets grâce à @ngn et @ H.PWiz
Comment?
(Matrice d'entrée 2D S )
×≡
Vérifiez si S est positif uniquement sur ...(∧=⌊
... les diagonales ou la rangée du haut et la colonne de gauche ...)/¨∘⍳∘⍴
... de S .la source
⍳∘⍴
pour produit cartésien.×≡(=/∨1∊⊢)¨∘⍳∘⍴
(=/∨1∊⊢)
->(~≠⌊⌊)/
(∧=⌊)/
bien sûr, les deux nécessitent⎕IO←0
PowerShell ,
112108 octetsEssayez-le en ligne!
Accepte les entrées et les manipule sous forme de tableau de tableaux, étant donné que PowerShell ne prend pas en charge les matrices (en dehors de la prise en charge des matrices de transformation .NET Direct3D, ce qui est totalement différent).
L’ensemble de l’algorithme est basé sur le fait que les nombres non nuls sont vrais et que zéro est falsey dans PowerShell, et que l’on utilise la multiplication pour déterminer ces valeurs vérité / falsey.
Nous prenons d’abord la première ligne
$a[0]
et vérifions si ce tableau0
est stocké-in
dans notre$o
variable utput. Si quelque chose dans cette ligne est zéro, alors le$o
est aussi zéro, sinon c'est un, fait par une conversion rapide avec int+
.Boucle suivante nous de
1
jusqu'à$a.count-1
, la mise$x
sur le chemin - nous allons être une boucle à travers chaque ligne un à la fois.À chaque itération, nous définissons une variable d'assistance
$i
pour garder une trace de la ligne sur laquelle nous nous trouvons, puis d'une boucle0
à$x
pour itérer chaque élément de cette ligne. Dans la boucle interne, nous nous multiplions à nouveau$o
, cette fois en sélectionnant une configuration de tuple en tant qu'opérateur pseudo-ternaire.Le tuple est conditionnel,
!$_-or$_-eq$i
indique "lorsque nous sommes sur la 0ème colonne, ou que la colonne correspond à la ligne (c'est-à-dire la diagonale principale)" pour sélectionner la seconde moitié du tuple lorsque la vérité est ou la première moitié lorsque Falsey. Le tuple est composé de!($y=$a[$i][$_]), $y
. La première moitié définit$y
pour jouer au golf la seconde moitié, mais de toute façon, nous sélectionnons l'élément actuel. La première moitié effectue une négation booléenne dessus, alors que la seconde moitié prend l'élément tel quel. Ainsi, si nous ne sommes pas sur la 0e colonne ni sur la diagonale principale, nous nous assurons que l'élément est à zéro en prenant le booléen-not. De même, nous nous assurons que la 0ème colonne ou diagonale principale est non nulle en la prenant simplement.Donc, maintenant que nous avons parcouru tous les éléments de la matrice, cela
$o
peut être le0
cas si un élément est incorrect ou un entier non nul s'il s'agit d'une matrice en tête de flèche. Nous double-Boolean - pas cela pour obtenir l'unFalse
ou l' autreTrue
, pour rendre notre sortie cohérente, et cela reste sur le pipeline où l'impression est implicite.la source
+
=[int]
? C'est bien.Gelée ,
14 à12 octets-2 octets de Pietu1998
Essayez-le en ligne!
Explication
Utilisez la matrice ci-dessus comme exemple d'entrée.
la source
APL (Dyalog) ,
211817 octetsEssayez-le en ligne!
Comment?
Celui-ci va dans l'autre sens -
=/¨∘⍳
- crée la matrice d'identité1-⍨⍴
- pourn - 1
1⍪1,
- ajoute une colonne et une ligne de 1≡
- compare avec×
- la matrice d'origine, après avoir passé au niveau élémentairela source
MATL , 15 octets
L'entrée est une matrice (utilisant
;
comme séparateur de lignes). La sortie est1
pour la pointe de la flèche,0
sinon.Essayez-le en ligne! Ou vérifiez tous les cas de test .
Explication
la source
C (gcc) ,
8075 octetsEssayez-le en ligne!
5 octets sauvés grâce à scottinet!
Réutilisé le code de test de cette réponse .
Analyse linéairement le tableau à la recherche de valeurs incorrectes, en renvoyant 0 pour une matrice en tête de flèche et 1 sinon. Nous vérifions en calculant l'exclusivité ou si l'élément à une position donnée est zéro et si cette position est sur la flèche.
Le codage des informations du tableau 2D dans une dimension conduit à un ensemble de conditions relativement simple. Si nous laissons
i
être notre index de base 0 dans len
tableau dimensionnel, alorsi<n
décrit la première ligne. De même,i%n==0
décrit la première colonne eti/n==i%n
décrit la diagonale.La meilleure astuce que j'ai trouvée pour gérer le retour consiste à définir la dimension à zéro en cas d'erreur. Cela provoque la fin de la boucle immédiatement, puis le retour de la négation logique de la dimension nous donnera l'une des deux valeurs distinctes. Scottinet a trouvé le moyen de faire revenir GCC plus facilement.
la source
Python 2 , 75 octets
Essayez-le en ligne!
Python 2 , 85 octets
En prenant le tableau comme une matrice 1D:
Essayez-le en ligne!
la source
R ,
787069685453 octetsEssayez-le en ligne!
Porting La réponse de Luis Mendo est beaucoup plus courte que mon ancienne approche.
Merci à rturnbull pour avoir signalé un bug et avoir joué un octet!
réponse ancienne, 68 octets:
Essayez-le en ligne!
La réponse de duckmayr vérifie que toutes les entrées de la diagonale principale et de la première ligne / colonne (
m[i]
) sont non nulles et que les autres (m[-i]
) sont égales à zéro, en utilisant une belle arithmétique pour obtenir la diagonale et la première ligne.Cette réponse, cependant, vérifie que (1) zéro entrée ne figure pas sur la diagonale principale ou la première ligne / colonne, et (2) qu’il existe, avec une
n x n
matrice, des3*n-2
entrées non nulles.which
renvoie les index où son entrée estTRUE
, et avec l'option optionnellearr.ind=T
, retourne un tableau d'indices pour chaque dimension de tableau, dans ce cas, deux.Donc, quand
any(i[,1]==i[,2])
, il existe un zéro sur la diagonale, et quandany(i==1)
, il existe un zéro dans la première ligne ou la première colonne.Enfin, un peu d'arithmétique montre que le nombre d'entrées non nulles doit être
3*n-2
, àn
partir de la première colonne,n-1
de la diagonale etn-1
de la première ligne.la source
all(!m==!d)
dans la dernière ligne?(!!m)==d
mais!
a une préséance inférieure à celle==
. Je pense qued==!!m
devrait faire l'affaire, cependant.d!=!m
pareil, pour un octet en moins. Vous pouvez enregistrer un autre octet en utilisant lapryr::f
syntaxe plutôt quefunction
trop.Python 2 ,
9290 octetsEssayez-le en ligne!
Crédits
la source
Haskell , 62 octets
-3 octets grâce à M. Xcoder. -13 octets grâce à user28667. -5 octets grâce à Zgarb.
Essayez-le en ligne!
la source
<1
et de telles astuces? : P(x==y||x==0||y==0)==(m!!y!!x/=0)
devrait être plus courtx*y<1
.Gelée , 10 octets
Essayez-le en ligne!
la source
Python 3 ,
7271 octetsMerci à @xnor d'avoir joué 1 octet!
Essayez-le en ligne!
la source
0<i!=j>0
sauve un octet,Pyth,
22 à21 octetsCe n'est certainement pas le langage pour manipuler la matrice.
Pour chaque ligne
b
et son indexk
dans la matrice (.e
), saisit les première etk
ième entrées (côté gauche et diagonale) avec,@bkh
et (+
) toutes les autres entrées avec.Db,0k
. Sik
est de 0 pour correspondre à la première ligne (Wk
), puis!
pasM
toutes ces entrées. Une fois que tous ceux-ci ont été sélectionnés, assurez-vous qu'ils sont tous vrais. (.As
) S'il y a un 0 où il ne devrait pas y en avoir, alors l'emplacement correspondant sera saisi tel quel et gâcher le et, et s'il y a un non nul où il ne devrait pas y en avoir, il sera!
noté à 0, qui est aussi faux.Suite de tests.
-1 octets pour permuter les commandes.
la source
@VQUQ
ou.DVQUQ
Pour les diagonales / supprimer des diagonales. Mais cela nécessiterait une approche complètement différente. Pas sûr cependant ... (BTW a oublié de mettre à jour le lien?)VQUQ
idée:>.A++hCQhQ.(VQUQsstCt
. Cela semble très redondant, cependant. Vous pourrez peut-être le modifier pour économiser quelques octets.Pip ,
312322 octetsC'est une fonction qui prend une liste de nombres imbriquée en 2D. Essayez-le en ligne!
Explication
Beaucoup de comparaisons sont faites ici. La première chose à savoir est que les opérateurs de comparaison dans Pip peuvent être chaînés ensemble, comme dans Python:
5>4>3
is5>4 and 4>3
(true), not(5>4)>3
(false). La seconde est que cela ne s'applique pas à==
l'opérateur "exactement égal à". Une autre différence: comparaisons régulières ont une priorité plus élevée que les opérateurs de cartographieMC
etMM
et peuvent être utilisés dans les expressions lambda, tout==
a une priorité plus faible et ne peut pas.Pour générer la première matrice, nous utilisons
MC
"map-coords". Cet opérateur prend un nombre, génère une grille de coordonnées carrées de cette taille et mappe une fonction sur chaque paire de coordonnées (x, y) en renvoyant une liste de listes de résultats. Par exemple,{a+b} MC 3
donnerait le résultat[[0; 1; 2]; [1; 2; 3]; [2; 3; 4]]
.Ici, la taille de la grille est
#a
la taille de notre argument initial. La fonction est0<_!=B>0
, ce qui est une manière plus courte d'écrire{0 < a != b > 0}
:Cela retourne 0 pour la première ligne / colonne et la diagonale principale, et 1 ailleurs.
la source
Husk ,
12 à11 octetsEssayez-le en ligne!
Explication
L'idée est que Husk définit 0 à la puissance de 0 sur 1, de sorte que le produit externe comporte 1 sur la première ligne et la première colonne. De plus, 1 à la puissance de tout nombre est 1, ainsi le produit extérieur a 1 sur la diagonale. Les autres entrées sont 0 à la puissance d'un nombre positif, ce qui est 0. Cela donne une matrice de tête de flèche binaire, que nous comparons à l'entrée avec
≡
.la source
APL + WIN,
3633 octetsInvites pour la saisie à l'écran d'une matrice APL 2d.
la source
Clojure,
128959285 octetsIl est toujours excitant de voir deux parenthèses d’ouverture consécutives.
Version originale:
La première partie fonctionne en intégrant
assoc
à zéro les éléments diagonaux de la sous-matrice et en vérifiant que toutes les lignes sont égales :) J'ai utilisé une astuce similaire à la méthode jacobienne .concat
Cette dernière partie indique la diagonale + la première ligne et la colonne et vérifie qu’elles sont positives.la source
Javascript (ES6), 58 octets
Ma solution pour Javascript:
Pas aussi intelligent que la réponse de Herman , mais je me suis juste dit que je devrais la poster ici aussi.
Afficher l'extrait de code
la source
Clojure,
212206188 octets-6 octets en supprimant certains espaces manquants et raccourcis
range
. Je devrais peut-être laisser cela de côté pour pouvoir penser à un meilleur moyen.-18 octets grâce à @NikoNyrh, et création de raccourcis pour
map
.Horrible, juste horrible. Je ne sais pas pourquoi je ne peux pas me résoudre une solution raisonnable.
Prend un vecteur imbriqué en entrée.
J'ai essayé de réécrire cela à partir de zéro en utilisant une méthode différente, et ça a fini plus longtemps. Au lieu de découper manuellement les sections "restantes" de la matrice, j'ai plutôt décidé d'essayer de générer toutes les coordonnées de la matrice, en générant les coordonnées de la pointe de la flèche, puis de les utiliser
clojure.set/difference
pour obtenir les cellules autres que la tête de la flèche. Malheureusement, l'appel à cette fonction intégrée est coûteux:223 octets
la source
#(drop 1 %)
c'est pareilrest
et#(not(zero? %))
c'est pareilpos?
(comme nous avons des nombres non négatifs). Vous voudrez peut-être consulter ma réponse de 128 octets, qui présente une approche similaire à celle-ci. Après avoir implémenté cela, je me suis rendu compte qu'il est beaucoup plus difficile de gérer un accès basé sur un index dans une boucle for.rest
. Je devrais probablement simplement abandonner cette tentative et réessayer.Stax , 11 octets CP437
Essayez-le en ligne!
Version décompressée avec 13 octets:
Enfin, Husk est attaché et battu par Jelly d'un octet à la fois ...
Explication
la source
R ,
8179 octets-2 octets merci à M. Xcoder
Essayez-le en ligne!
la source
C, 117 octets
Essayez-le en ligne!
la source
PowerShell , 186 octets
Essayez-le en ligne!
la source
param($a)
pour prendre des entrées, ils-contains
peuvent être échangés contre un-in
et tous-eq0
peuvent être échangés!
. Enfin, vous pouvez effectuer une boucle de1
haut en$a.length
bas et vous débarrasser duif($_-ne0)
corps dans la boucle.Perl 5 , 136 + 2 (
-ap
) = 138 octetsEssayez-le en ligne!
la source
Propre , 79 octets
Essayez-le en ligne!
la source
Japt , 16 octets
Testez-le en ligne!
Cela me ramène au bon vieux temps où Japt était régulièrement beaucoup plus long que les autres langues de golf ...
la source
K (oK) ,
27 à30 octetsSolution:
Essayez-le en ligne!
Explication:
Je dois faire quelque chose de stupide, car les solutions APL représentent moins de la moitié du nombre d'octets ...
24 octets consacrés à la création de la pointe de flèche.
or
ensemble les trois matrices suivantes:Ventilation complète:
la source