Est ma flèche de matrice?

33

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 2et 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]]
M. Xcoder
la source
1
Est-il possible que la matrice contienne des nombres négatifs?
Zacharý
2
@ Zacharý Non, vous pouvez supposer qu'ils sont tous non négatifs .
M. Xcoder
Pedant: Un tableau à deux dimensions et une matrice ne sont pas la même chose, ni un tableau de tableaux. Une entrée en tant que tableau bidimensionnel est-elle acceptable si la langue de votre choix est suffisamment civilisée pour prendre en charge des tableaux multidimensionnels?
Ian Bush
@IanBush Oui, un tableau 2D convient parfaitement.
M. Xcoder
9
@ Mr.Xcoder Ce serait un défi suffisamment différent et intéressant si la pointe de la flèche pouvait pointer dans n'importe quelle direction
dylnan

Réponses:

15

Javascript (ES6), 48 47 octets

Enregistré 1 octet grâce à edc65

m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))

Retourne falsepour les matrices en pointe de flèche et truepour 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:

Herman L
la source
Voilà une approche vraiment intelligente!
M. Xcoder
1
cela pourrait-il fonctionner? f=m=>m.some((r,y)=>r.some((c,x)=>(x*y&&x!=y)^!c))
edc65
@ edc65 Sans le f=bien sûr;-)
Neil
11

J , 21 20 19 17 15 octets

-4 octets grâce à @GalenIvanov.

*-:1,1,.=&/:@}.

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.

* -: 1, 1,. = & /: @ }.  Let m be the input matrix.
            = & /: @ }.  Identity matrix 1 smaller than m.
                     }.    Behead (m without its first row).
                   @       Composed with.
                /:         Grade up (get len(m) - 1 unique elements)
              &            Composed with.
            =              Self-classify (compare equality with
                           unique elements)
        1,.              Prepend a column of 1s
     1,                  Prepend a row of 1s
*                        Signum (0 becomes 0, n > 0 becomes 1)
  -:                     Does it match the generated arrowhead matrix?

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:

   ] m =. 4 4 $ 1 2 3 4 1 1 0 0 1 0 1 0 1 0 0 1
1 2 3 4
1 1 0 0
1 0 1 0
1 0 0 1

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 ( }.).

   }. m
1 1 0 0
1 0 1 0
1 0 0 1

Ensuite, nous obtenons les indices dans /:lesquels chaque ligne se trouverait si les lignes étaient triées avec -grade up.

   /: }. m
2 1 0

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).

   = /: }. m
1 0 0
0 1 0
0 0 1
   NB. This is what is happening
   (2 = 2 1 0) , (1 = 2 1 0) ,: (0 = 2 1 0)
1 0 0
0 1 0
0 0 1

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é) :

   1,. (=&/:@}. m)
1 1 0 0
1 0 1 0
1 0 0 1
   1, (1,. =&/:@}. m)
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1

Ensuite, nous comparons simplement la matrice de pointe de flèche générée au signe de la matrice d’entrée.

   * m
1 1 1 1
1 1 0 0
1 0 1 0
1 0 0 1
   (* m) -: (1, 1,. =&/:@}. m)
1
Cole
la source
2
N'est-ce pas *assez au lieu de 0@<(pour 17 octets)? Essayez-le
Galen Ivanov
1
@GalenIvanov bonne prise, je pense que oui. Merci! Il est temps de rééditer l'explication lol.
cole
1
Je pense avoir trouvé un nouveau moyen de générer la matrice d’identité: =&/:quand je l’ai combinée }., j’ai eu cela *-:1,1,.=&/:@}.pour 15 octets Essayez-le en ligne!
Galen Ivanov
1
@ GalenIvanov brillante approche (à la fois l'utilisation de /:-grade et }.-behead), merci encore! Je vais l'éditer.
cole
Hmm, en fait *-: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 avec 1et ainsi de suite.
Galen Ivanov
9

Wolfram Language (Mathematica) , 47 octets

Clip@#==Array[If[1<#!=#2>1,0,1]&,{1,1}Tr[1^#]]&

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 position i,jquand 1 < 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:

Union@@Array[{1,#}~Tuples~2&,Length@#]==Most@Keys@ArrayRules@#&

Essayez-le en ligne!

Pas un arbre
la source
8

APL (Dyalog Classic) , 19 16 15 13 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 .
Zacharý
la source
belle utilisation de ⍳∘⍴pour produit cartésien.
Uriel
×≡(=/∨1∊⊢)¨∘⍳∘⍴
Erik l'Outgolfer
1
(=/∨1∊⊢)->(~≠⌊⌊)/
NDGN
2
@ngn Encore mieux:, (∧=⌊)/bien sûr, les deux nécessitent⎕IO←0
H.PWiz
7

PowerShell , 112 108 octets

param($a)$o=+!(0-in$a[0]);1..($x=$a.count-1)|%{$i=$_;0..$x|%{$o*=(!($y=$a[$i][$_]),$y)[!$_-or$_-eq$i]}};!!$o

Essayez-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 tableau 0est stocké -indans notre $ovariable utput. Si quelque chose dans cette ligne est zéro, alors le $oest aussi zéro, sinon c'est un, fait par une conversion rapide avec int +.

Boucle suivante nous de 1jusqu'à $a.count-1, la mise $xsur le chemin - nous allons être une boucle à travers chaque ligne un à la fois.

À chaque itération, nous définissons une variable d'assistance $ipour garder une trace de la ligne sur laquelle nous nous trouvons, puis d'une boucle 0à $xpour 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$iindique "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 $ypour 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 $opeut être le 0cas 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'un Falseou l' autre True, pour rendre notre sortie cohérente, et cela reste sur le pipeline où l'impression est implicite.

AdmBorkBork
la source
+= [int]? C'est bien.
racine
@root L'un des conseils PowerShell .
AdmBorkBork
7

Gelée , 14 à 12 octets

ŒDµḢ;Ḣ€Ȧ>FẸ$

-2 octets de Pietu1998

Essayez-le en ligne!

Explication

[[9,7,1],
 [7,1,0],
 [7,0,1]]

Utilisez la matrice ci-dessus comme exemple d'entrée.

ŒDµḢ;Ḣ€Ȧ>FẸ$
ŒD              Diagonals → [[9, 1, 1], [7, 0], [1], [7], [7, 0]]
  µ             New monadic link
   Ḣ            Head → [9, 1, 1]. Alters diagonals list.
    ;Ḣ€         Append with the head of each of the other diagonals → [9, 1, 1, 7, 1, 7, 7]
       Ȧ        Logical all → 1
         FẸ$    Flatten what's left in diagonals then take logical any → [[0],[],[],[0]] → [0,0] → 0
        >       Matrix is an arrowhead iff result of Ȧ > result of Ẹ
Dylnan
la source
@ wizzwizz4 Je ne suis pas sûr de ce que tu veux dire
dylnan
@ wizzwizz4 ce code montre comment les éléments de la matrice sont regroupés. Il prend la diagonale supérieure, gauche et principale. Est-ce que c'est ce que vous vouliez dire?
dylnan
Je voulais dire la représentation visuelle réelle du code que vous avez fourni dans votre explication. J'essayais d'être drôle mais ça ne fonctionnait évidemment pas. Je vais nettoyer ces commentaires.
wizzwizz4
7

APL (Dyalog) , 21 18 17 octets

×≡11,(=/¨∘⍳1-⍨⍴)

Essayez-le en ligne!

Comment?

Celui-ci va dans l'autre sens -

=/¨∘⍳ - crée la matrice d'identité

1-⍨⍴ - pour n - 1

1⍪1, - ajoute une colonne et une ligne de 1

- compare avec

× - la matrice d'origine, après avoir passé au niveau élémentaire

Uriel
la source
6

MATL , 15 octets

gtZyXy,!llY(]X=

L'entrée est une matrice (utilisant ;comme séparateur de lignes). La sortie est 1pour la pointe de la flèche, 0sinon.

Essayez-le en ligne! Ou vérifiez tous les cas de test .

Explication

g        % Implicit input. Convert to logical values (nonzero becomes true and
         % zero becomes false)
t        % Duplicate
Zy       % Size
Xy       % Identity matrix of that size
,        % Do twice
  !      %   Transpose
  ll     %   Push 1 twice
  Y(     %   Write 1 at all entries of row 1
]        % End
X=       % Are the two matrices (input and constructed) equal? Implicit display
Luis Mendo
la source
1
Quelle est exactement la matrice Indeity ?
Erik the Outgolfer
13
@EriktheOutgolfer évidemment une matrice contenant une divinité.
Cole
5
@cole peut-être liée à une matrice sur le champ Elysian
jld
5

C (gcc) ,80 75 octets

i;f(A,n)int*A;{for(i=0;i<n*n;i++)n=A[i]>0^(i<n||i%n<1||i/n==i%n)?0:n;n=!n;}

Essayez-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 le ntableau dimensionnel, alors i<ndécrit la première ligne. De même, i%n==0décrit la première colonne et i/n==i%ndé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.

FryAmTheEggman
la source
-2 octets avec un peu plus de golf
scottinet
et -4 octets supplémentaires en abusant de la manière dont gcc
rend les
@scottinet Merci! J'avais du mal à déterminer quelle valeur je devrais utiliser pour utiliser cette astuce.
FryAmTheEggman
En fait, je ne crois pas que votre premier golf fonctionne. Il a réussi les tests, car il n'y a jamais eu de zéro en première position. Ajout d'un cas et annulé ce changement.
FryAmTheEggman
int test0 [] = {0, 1, 1, 1, 1, 0, 1, 0, 1}; printf ("% d \ n", f (test0, 3)); Doit retourner 0 pas 1 (si est le 3x3 matrx 011 110 101) car un [0,0] est 0
RosLuP
5

Python 2 , 75 octets

lambda m,E=enumerate:all((x[j]>0)-(i>0<j!=i)for i,x in E(m)for j,y in E(m))

Essayez-le en ligne!

Python 2 , 85 octets

En prenant le tableau comme une matrice 1D:

def f(m):s=len(m)**.5;print all((v<1)^(0in(p>s,p%s,p//s-p%s))for p,v in enumerate(m))

Essayez-le en ligne!

FlipTack
la source
Voulez-vous dire "matrice 1D" dans la solution supérieure?
NikoNyrh
@NikoNyrh oups, corrigé
FlipTack
5

R , 78 70 69 68 54 53 octets

function(m){d=diag(nrow(m))
d[1,]=d[,1]=1
all(d!=!m)}

Essayez-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:

function(m,i=which(!m,T))all(i[,1]-i[,2],i!=1,sum(m>0)==3*nrow(m)-2)

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 nmatrice, des 3*n-2entrées non nulles.

whichrenvoie les index où son entrée est TRUE, et avec l'option optionnelle arr.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 quand any(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, à npartir de la première colonne, n-1de la diagonale et n-1de la première ligne.

Giuseppe
la source
Cela ne semble pas fonctionner pour les matrices de flèches où les valeurs ne sont pas 1. Voulez-vous dire all(!m==!d)dans la dernière ligne?
rturnbull
@rturnbull ah! Merci. La syntaxe de l'opérateur R est tellement bizarre. Je voulais vraiment dire (!!m)==dmais !a une préséance inférieure à celle ==. Je pense que d==!!mdevrait faire l'affaire, cependant.
Giuseppe
On dirait que c'est d!=!mpareil, pour un octet en moins. Vous pouvez enregistrer un autre octet en utilisant la pryr::fsyntaxe plutôt que functiontrop.
rturnbull
J'ai essayé de jouer au golf, mais le mieux que je puisse faire est toujours de 53 ans .
JayCe
@JayCe nah, votre réponse et la mienne peuvent être jouées à 52, et je ne sais pas pourquoi cela ne m'est pas venu à l'esprit auparavant ... J'afficherais la vôtre séparément; l'approche en une ligne est assez agréable et je soupçonne qu'il pourrait y avoir encore de la place pour l'amélioration chez vous
Giuseppe
3

Python 2 , 92 90 octets

def f(m):l=len(m);return all((m[a%l][a/l]<1)^any([a<l,a%l<1,a/l==a%l])for a in range(l*l))

Essayez-le en ligne!

Crédits

Neil
la source
3

Haskell , 62 octets

-3 octets grâce à M. Xcoder. -13 octets grâce à user28667. -5 octets grâce à Zgarb.

z=zip[0..]
f m=and[(i==j||i*j<1)==(a>0)|(i,r)<-z m,(j,a)<-z r]

Essayez-le en ligne!

totalement humain
la source
1
80 octets .... Vous oubliez presque toujours <1et de telles astuces? : P
M. Xcoder
1
(x==y||x==0||y==0)==(m!!y!!x/=0)devrait être plus court
user28667
1
62 octets en zippant au lieu d’indexer et de faire x*y<1.
Zgarb
3

Python 3 , 72 71 octets

lambda x,e=enumerate:any(0**n^(0<i!=j>0)for i,r in e(x)for j,n in e(r))

Merci à @xnor d'avoir joué 1 octet!

Essayez-le en ligne!

Dennis
la source
Je pense que 0<i!=j>0sauve un octet,
xnor
@xnor Merci! Je ne pense pas avoir déjà réutilisé un numéro dans une chaîne de comparaison ...
Dennis
2

Pyth, 22 à 21 octets

Ce n'est certainement pas le langage pour manipuler la matrice.

.As.e+!MWk.Db,0k,@bkh

Pour chaque ligne bet son index kdans la matrice ( .e), saisit les première et kième entrées (côté gauche et diagonale) avec ,@bkhet ( +) toutes les autres entrées avec .Db,0k. Si kest de 0 pour correspondre à la première ligne ( Wk), puis !pas Mtoutes 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.

Steven H.
la source
1
Wow cette solution est vraiment agréable étant donné que Pyth est assez parallèle à la manipulation de la matrice. Probablement pour un autre duel Pyth demain: P
M. Xcoder
Vous pourrez peut-être raccourcir ceci en utilisant @VQUQou .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?)
Mr. Xcoder
@ Mr.Xcoder Lien fixe, je vais essayer de jouer avec d'autres stratégies demain.
Steven H.
Je suis arrivé à un 21 byter alternatif en utilisant mon VQUQidée: >.A++hCQhQ.(VQUQsstCt. Cela semble très redondant, cependant. Vous pourrez peut-être le modifier pour économiser quelques octets.
M. Xcoder
2

Pip , 31 23 22 octets

{0<_!=B>0MC#a==0=_MMa}

C'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>3is 5>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 cartographie MCet MMet peuvent être utilisés dans les expressions lambda, tout ==a une priorité plus faible et ne peut pas.

{                    }  Define a function with argument a:
 0<_!=B>0MC#a            Generate a matrix (as nested lists) that has 0 on the first row,
                          first column, and main diagonal, and 1 elsewhere (see below for
                          details)
               0=_MMa    Map the function 0=_ to the elements of the elements of a,
                          generating a matrix that is 0 where a is nonzero and vice versa
             ==          Test if the two matrices are equal, returning 0 or 1 accordingly

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 3donnerait le résultat [[0; 1; 2]; [1; 2; 3]; [2; 3; 4]].

Ici, la taille de la grille est #ala taille de notre argument initial. La fonction est 0<_!=B>0, ce qui est une manière plus courte d'écrire {0 < a != b > 0}:

{        }  Function; a and b are the arguments (in our case, row and column)
 0<a        Return 1 (truthy) if a is greater than 0
    !=b     and a is not equal to b
       >0   and b is greater than 0

Cela retourne 0 pour la première ligne / colonne et la diagonale principale, et 1 ailleurs.

DLosc
la source
2

Husk , 12 à 11 octets

S≡ȯ´Ṫ§^*=ŀL

Essayez-le en ligne!

Explication

S≡ȯ´Ṫ§^*=ŀL  Input is a k×k array A.
          L  The length, k.
         ŀ   The range [0,1..k-1].
  ȯ´Ṫ        Outer product with itself by this function:
              Arguments are two numbers x and y.
        =     Equality of x and y
     §^       to the power of
       *      x times y.
S≡           Does the result have the same shape and distribution of truthy values as A?

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 .

Zgarb
la source
2

APL + WIN, 36 33 octets

(↑⍴m)=+/(+⌿m)=+/m←×m×n∘.×n←⍳↑⍴m←⎕

Invites pour la saisie à l'écran d'une matrice APL 2d.

Graham
la source
2

Clojure, 128 95 92 85 octets

#(every? neg?(for[R[(range(count %))]i R j R]((if((set[i(- i j)j])0)- dec)((% i)j))))

Il est toujours excitant de voir deux parenthèses d’ouverture consécutives.

Version originale:

#(and(apply =(map assoc(for[i(rest %)](subvec i 1))(range)(repeat 0)))(every? pos?(concat(map nth %(range))(% 0)(map first %))))

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 .

concatCette dernière partie indique la diagonale + la première ligne et la colonne et vérifie qu’elles sont positives.

NikoNyrh
la source
2

Javascript (ES6), 58 octets

Ma solution pour Javascript:

m=>m.some((r,i)=>m[0][i]*r[0]*r[i]==0|r.filter(c=>i*c)[2])

Pas aussi intelligent que la réponse de Herman , mais je me suis juste dit que je devrais la poster ici aussi.

Pedro Corso
la source
3
Bienvenue chez PPCG!
Steadybox
2

Clojure, 212 206 188 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.

(fn[m](let[r range a map z zero?](and(every? #(not(z %))(concat(m 0)(rest(a #(% 0)m))(a get m(r))))(every? z(apply concat(into(a #(take(dec %)%2)(r)(a rest m))(a take-last(r)(reverse(rest m)))))))))

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.

(defn arrowhead? [matrix]
  (let [; Get the 0th cell of the 0th row, then the 1st cell of the 1st row...
        main-diagonal (map get matrix (range))

        ; Get the 0th cell of each row
        first-col (rest (map #(% 0) matrix))
        arrowhead (concat (matrix 0) first-col main-diagonal)

        ;
        right-rest (map take-last (range) (reverse (rest matrix)))
        left-rest (map #(take (dec %) %2) (range) (map rest matrix))
        rest-matrix (apply concat (into left-rest right-rest))]

    ; And check them
    (and (every? pos? %) arrowhead
         (every? zero? rest-matrix))))

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/differencepour 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

(fn[m](let[l(range(count m))g #(get-in m(reverse %))e every? a(for[y l x l][x y])k #(map % l)r(concat(k #(do[% %]))(k #(do[0%]))(k #(do[% 0])))](and(e #(zero?(g %))(clojure.set/difference(set a)(set r)))(e #(pos?(g %)))r)))

(defn arrowhead? [matrix]
  (let [length-range (range (count matrix))
        get-cell #(get-in matrix (reverse %))
        all-coords (for [y length-range
                         x length-range]
                     [x y])

        k #(map % length-range)

        diag (k #(do[% %]))
        top-side (k #(do [0 %]))
        left-side (k #(do [% 0]))
        arrowhead (concat diag top-side left-side)

                   ; 22 bytes! Ouch
        rest-cells (clojure.set/difference (set all-coords) (set arrowhead))]

    (and (every? #(zero? (get-cell %)) rest-cells)
         (every? #(pos? (get-cell %)) arrowhead))))
Carcigenicate
la source
Il y a beaucoup de marge d'amélioration, par exemple, #(drop 1 %)c'est pareil restet #(not(zero? %))c'est pareil pos?(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.
NikoNyrh
@NikoNyrh Ya, je n'étais pas dans un très bon rythme ce jour-là. Je ne sais pas comment j'ai oublié rest. Je devrais probablement simplement abandonner cette tentative et réessayer.
Carcigenicate
2

Stax , 11 octets CP437

ä¢⌠┐xⁿtH↔BU

Essayez-le en ligne!

Version décompressée avec 13 octets:

B|AsF:10i^\=*

Enfin, Husk est attaché et battu par Jelly d'un octet à la fois ...

Explication

B                Push tail (all except 1st row) of the input array, then push the head (1st row)
 |A              All elements in the head are truthy
                 This will be used as an accumulator
   sF            For each element in the tail, execute the rest of the program
     :1          All truthy indices
       0i^\      Expected truthy indices (0 and the current row number)
           =     The truthy indices are as expected
            *    Perform logical "and" with the accumulator
                 Implicit output of the final accumulator
Weijun Zhou
la source
1

R , 81 79 octets

function(x){n=nrow(x);i=c(seq(1,n^2,n+1),1:n,seq(1,n^2,n));all(x[i]>0,x[-i]<1)}

-2 octets merci à M. Xcoder

Essayez-le en ligne!

duckmayr
la source
79 octets .
M. Xcoder
Très agréable; J'ai réussi à trouver un 78 octets qui fait quelque chose de très étrange, mais j'ai aussi trouvé un golf de 76 octets .
Giuseppe
69 octets mais j'ai amélioré le mien à 68!
Giuseppe
1

C, 117 octets

i,j,r;f(A,n)int*A;{for(i=r=0;i<n;++i)for(j=-1;++j<n;(!i||!j||i==j)&&!A[i*n+j]&&++r)i*j&&i-j&&A[i*n+j]&&++r;return!r;}

Essayez-le en ligne!

Steadybox
la source
1

PowerShell , 186 octets

$a=$($args);if($a[0]-contains0){0;exit};0..($a.Length-1)|%{if($a[$_][0]-eq0-or$a[$_][$_]-eq0){0;exit};$r=$a[$_];$d=$_;if($_-ne0){1..($r.Length-1)|%{if($r[$_]-ne0-and$_-ne$d){0;exit}}}};1

Essayez-le en ligne!

racine
la source
2
Certains golfs - utilisent param($a)pour prendre des entrées, ils -containspeuvent être échangés contre un -inet tous -eq0peuvent être échangés !. Enfin, vous pouvez effectuer une boucle de 1haut en $a.lengthbas et vous débarrasser du if($_-ne0)corps dans la boucle.
AdmBorkBork
1

Perl 5 , 136 + 2 ( -ap) = 138 octets

push@a,[@F]}{push@b,"@{$a[0]}"=~/\b0\b/;map{//;map$a[$'][$_]=!$a[$'][$_],0,$';shift@{$a[$']};push@b,@{$a[$']}}1..$#a;say!("@b"=~y/ 0//c)

Essayez-le en ligne!

Xcali
la source
1

Japt , 16 octets

Ëe@!X^!(E*Y*nE
e

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 ...

ETHproductions
la source
1

K (oK) , 27 à 30 octets

Solution:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x:

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. orensemble les trois matrices suivantes:

/ assume 4x4 matrix
=#x
1 0 0 0
0 1 0 0
0 0 1 0
0 0 0 1

+(a:1,(#1_x)#0)
1 0 0 0
1 0 0 0
1 0 0 0
1 0 0 0

a
1 1 1 1
0 0 0 0
0 0 0 0
0 0 0 0

Ventilation complète:

x~a*x|a:a|+(a:1,(#1_x)#0)|=#x: / the solution
                            x: / save input as x
                           #   / count length
                          =    / identity matrix
                         |     / or with
           (            )      / do this together
                      #0       / take from 0
                ( 1_x)         / drop first of x
                 #             / count
              1,               / prepend 1
            a:                 / save as a
          +                    / flip rows/cols
         |                     / or with
        a                      / a
      a:                       / save as a
     |                         / or with
    x                          / x
  a*                           / multiply by arrowhead
x~                             / matches input?
streetster
la source