Construire la matrice d'identité

44

Le défi est très simple. Avec une entrée entière n, sortez la n x nmatrice d'identité. La matrice d'identité est une matrice qui 1s'étend du haut à gauche au bas à droite. Vous allez écrire un programme ou une fonction qui renverra ou sortira la matrice d’identité que vous avez construite. Votre sortie peut être un tableau 2D ou des nombres séparés par des espaces / tabulations et des nouvelles lignes.

Exemple d'entrée et de sortie

1: [[1]]
2: [[1, 0], [0, 1]]
3: [[1, 0, 0], [0, 1, 0], [0, 0, 1]]
4: [[1, 0, 0, 0], [0, 1, 0, 0], [0, 0, 1, 0], [0, 0, 0, 1]]
5: [[1, 0, 0, 0, 0], [0, 1, 0, 0, 0], [0, 0, 1, 0, 0], [0, 0, 0, 1, 0], [0, 0, 0, 0, 1]]

1
===
1

2
===
1 0
0 1

3
===
1 0 0
0 1 0
0 0 1

etc.

C'est le , donc le code le plus court en octets gagne.

Seadrus
la source
1
Étant donné une entrée entière n ... - Je suppose que vous voulez dire un nombre naturel?
Jonathan Frech

Réponses:

26

MATL, 2 octets

Xy

Une traduction de ma réponse Octave.

Essayez-le en ligne.

Une version de 4 octets sans construit (grâce à Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result
un spaghetto
la source
7
Il a dû être difficile de traduire ce code très sophistiqué: D
flawr
11
@flawr Vous n'avez aucune idée. C'est vraiment mon chef d'oeuvre.
un spaghetto
1
Maintenant je vois pourquoi tu demandais! :-D
Luis Mendo
5
Sans éléments intégrés::t!=
Luis Mendo le
20

TI-BASIC, 2 octets

identity(Ans

Anecdote: Le moyen le plus rapide d’obtenir une liste {N,N}est dim(identity(N.

Voici le chemin le plus court sans l'integrin, en 8 octets:

randM(Ans,Ans)^0

randM(crée une matrice aléatoire avec des entrées comprenant tous les nombres entiers compris entre -9 et 9 inclus (cela peut paraître étrange parce que c'est le cas). Nous prenons ensuite cette matrice à la puissance 0.

lirtosiast
la source
1
" Cela semble étrangement spécifique parce que c'est " TI-BASIC est étrange. O_o
Doorknob
Putain, oui. TI-BASIC. +1
bearacuda13
n'est pas le plus court chemin pour obtenir une liste {N,N}, humm, {N,N}?
Cyoce
1
@Cyoce No; dim(et identity(sont chacun un octet car TI-BASIC est segmenté.
lirtosiast
19

Julia, 9 3 octets

eye

Ceci est juste une fonction intégrée qui accepte un entier net renvoie un nxn Array{Float64,2}(c'est-à-dire un tableau 2D). Appelez ça comme eye(n).

Notez que les soumissions de ce formulaire sont acceptables selon cette politique .

Alex A.
la source
Je vois ce que tu as fait là! Joli!
Ismael Miguel
Cela fonctionne également dans Math.JS
ATaco
16

APL, 5 octets

∘.=⍨⍳

Il s'agit d'un train de fonctions monadique qui accepte un entier à droite et renvoie la matrice d'identité.

Essayez ici

Alex A.
la source
14

Octave, 10 4 octets

@eye

Renvoie une fonction anonyme qui prend un nombre net renvoie la matrice d'identité.

un spaghetto
la source
@eyeest suffisant.
Flawr
@flawr Merci, je savais qu'il y avait un moyen de faire comme ça mais j'oublie toujours: P
un spaghetto
eyeproduit la matrice d’identité dans un grand nombre / certains langages orientés numériquement.
mardi
Qu'est-ce que le @fait?
Cyoce
@Cyoce @est l'opérateur de descripteur de fonction, il fonctionne comme une lambdaréférence et également comme une référence à une fonction particulière. Ainsi, par exemple, @(x)x.^2la fonction @sqrtcarrée est une référence à la fonction racine carrée. Vous pouvez en lire plus à ce sujet ici
Giuseppe
12

R, 4 octets

diag

Quand une matrice est donnée, diagretourne la diagonale de la matrice. Cependant, lorsqu'un entier est attribué n, diag(n)retourne la matrice d'identité.

Essayez-le en ligne

Alex A.
la source
12

Python 2, 42 octets

lambda n:zip(*[iter(([1]+[0]*n)*n)]*n)[:n]

Une fonction anonyme produit une sortie telle que [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Tout d'abord, crée la liste ([1]+[0]*n)*n, qui n=3ressemble à

[1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0]

Utilisation de l’ astuce zip / iter zip(*[iter(_)]*n pour créer des groupes de ncadeaux

[(1, 0, 0), (0, 1, 0), (0, 0, 1), (0, 0, 0)]

Notez que le 1vient un index plus tard à chaque fois, donnant la matrice d'identité. Mais, il y a une ligne tout à zéro supplémentaire, qui est supprimée avec [:n].

Xnor
la source
1
Bon sang, cette astuce zip / iter est ingénieuse
seequ
10

Gelée, 4 octets

R=€R

N'utilise pas d'intégré. Essayez-le en ligne!

Comment ça marche

R=€R    Main link. Input: n

R       Range; yield [1, ..., n].
   R    Range; yield [1, ..., n].
 =€     Compare each.
        This compares each element of the left list with the right list, so it
        yields [1 = [1, ..., n], ..., n = [1, ..., n]], where comparison is
        performed on the integers.
Dennis
la source
25
Ce code est trop long.
mardi
5
@flawr Deux fois la longueur du plus court. C'est en effet une rencontre inhabituelle.
Rainer P.
1
@flawr Oui, et pas plus courte que J . ÉCHOUER!
Adám
2
Dans les versions modernes de Jelly, deux octets sont utilisés et se moque des réponses les plus longues.
Lynn
@ Lynn C'est encore deux fois plus longtemps que le plus court des oneS.
Adám
10

J, 4 octets

=@i.

C'est une fonction qui prend un entier et retourne la matrice.

marinus
la source
Je pense que vous pouvez le faire en 3:=i.
Sam Elliott
@SamElliott ça ne marche pas. Par exemple, (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce
9

Haskell, 43 37 octets

f n=[[0^abs(x-y)|y<-[1..n]]|x<-[1..n]]

C'est assez simple, même si je pense que l'on peut faire mieux (sans un langage qui intègre déjà cette fonction, comme beaucoup l'ont fait).

Edit: laissé tomber quelques octets grâce à Ørjan Johansen

Sheridan Grant
la source
7
Vous pouvez tricher le fromEnumcomme sum[1|x==y].
xnor
vous êtes sûr de pouvoir supprimer l'espacefromEnum (y==x)
Cyoce
@xnor Un octet plus court que: 0^abs(x-y).
Ørjan Johansen
1
@xnor Oh, vous venez de vous utiliser 0^(x-y)^2dans une autre réponse, même plus courte.
Ørjan Johansen
@ ØrjanJohansen Oui, voir votre commentaire était un bon timing :)
xnor
8

Pyth, 7 octets

XRm0Q1Q

Essayez-le en ligne: démonstration

Créer une matrice de zéros et remplacer les éléments diagonaux par des uns.

Jakube
la source
Vous pouvez économiser un octet en supprimant la finaleQ
Jim
1
@ Jim Merci, mais ce ne serait pas autorisé. La fonctionnalité (Q implicite à la fin) a été mise en œuvre après la publication du défi.
Jakube
7

JavaScript ES6, 68 62 52 octets

10 octets sauvés grâce à une astuce de @Neil

x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))

Essayer une approche différente de celle de @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Pourrait éventuellement être amélioré.

ETHproductions
la source
C’est exactement ce que j’ai écrit avant de faire défiler pour découvrir que vous m’y avez battu.
Neil
Donc, en réponse à votre défi, je vous donne (avec le recul) une évidence x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))pour une économie de 10 octets.
Neil
@Neil Merci beaucoup! Je vais mentionner que c'est votre astuce dans la réponse.
ETHproductions
x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
l4m2
7

Rétine , 25

Crédit à @randomra et @Martin pour le golf supplémentaire.

\B.
 0
+`(.*) 0$
$0¶0 $1

Essayez-le en ligne.

Notez que cela prend une entrée unaire. Si cela n’est pas acceptable, l’entrée décimale peut être donnée comme suit:

Rétine, 34 ans

.+
$0$*1
\B.
 0
+`(.*) 0$
$0¶0 $1

Essayez-le en ligne.

Trauma numérique
la source
3
... whoa. Retina est en train de devenir un langage puissant pour plus que la regex.
ETHproductions
@ETHproductions oui, bien que ce soit la réponse à peu près toute substitution de regex. La seule chose spéciale est l’utilisation de $*0pour remplacer un nombre n par n 0s.
Digital Trauma
6

Haskell, 54 octets

(#)=replicate
f n=map(\x->x#0++[1]++(n-x-1)#0)[0..n-1]

frenvoie la matrice d'identité pour l'entrée n. Loin d'être optimal.

ThreeFx
la source
Vous pouvez enregistrer une poignée d'octets en utilisant une liste de compréhension au lieu d'un mapappel.
MathematicalOrchid
6

Lua, 77 75 65 octets

x,v=z.rep,io.read()for a=1,v do print(x(0,a-1)..'1'..x(0,v-a))end

Eh bien, je ne suis pas sûr que Lua soit la meilleure langue pour cela avec la concaténation en deux périodes ... Mais bon, on a une chance. Je verrai s'il y a des améliorations à apporter.

MODIFIER:

J'ai trouvé quelque chose par hasard que je trouve assez étrange, mais ça marche.

En Lua, tout le monde sait que vous avez la possibilité d’attribuer des fonctions à des variables. C'est l'une des fonctionnalités les plus utiles de CodeGolf.

Cela signifie au lieu de:

string.sub("50", 1, 1) -- = 5
string.sub("50", 2, 2) -- = 0
string.sub("40", 1, 1) -- = 4
string.sub("40", 2, 2) -- = 0

Tu peux le faire:

s = string.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

Mais attendez, Lua permet une certaine quantité de POO. Donc, vous pourriez même potentiellement faire:

z=""
s = z.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

Cela fonctionnera aussi bien et coupe les caractères.

Maintenant, voici la partie étrange. Vous n'avez même pas besoin d'attribuer une chaîne à un moment donné. Faire simplement:

s = z.sub
s("50", 1, 1) -- = 5
s("50", 2, 2) -- = 0
s("40", 1, 1) -- = 4
s("40", 2, 2) -- = 0

Marchera.


Pour que vous puissiez voir visuellement la différence, jetez un coup d’œil aux résultats obtenus:

Utilisation de string.sub (88 caractères)

string.sub("50", 1, 1)string.sub("50", 2, 2)string.sub("40", 1, 1)string.sub("40", 2, 2)

Affectation de string.sub à une variable (65 caractères)

s=string.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

Affectation de string.sub en utilisant une approche POO (64 caractères)

z=""s=z.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

Assigner string.sub en utilisant une approche .. nil? (60 caractères)

s=z.sub s("50", 1, 1)s("50", 2, 2)s("40", 1, 1)s("40", 2, 2)

Si quelqu'un sait pourquoi cela fonctionne, je serais intéressé.

Skyl3r
la source
La ligne "z.rep" se brise sur le mien. Je parie qu'il devrait y avoir un z = '' quelque part? Une variante plus courte de z = '' z.rep serait simplement ('') .rep. Vous pouvez également utiliser la ligne de commande ... pour lire une entrée et réduire le nombre à 57 de la manière suivante: z = '0' pour i = 1, ... est imprimé (z: rep (i-1) .. 1 ..z: rep (...- i)) end
thenumbernine
J'ai trouvé quelqu'un suggérant ("") .rep auparavant, mais j'étais incapable de le faire fonctionner. Ce serait toujours une erreur. Peut-être que mon interprète est le problème ici. J'ai du mal à trouver de la documentation sur cette entrée de ligne de commande, savez-vous où elle peut être trouvée?
Skyl3r
6

Python 3, 48

Sauvegardé 1 octet grâce à sp3000.

J'adore les défis que je peux résoudre en une ligne. Assez simple, construisez une ligne à partir de 1 et 0 égale à la longueur de l'int transmis. Sortie en tant que tableau 2d. Si vous emballez la partie après le: in '\n'.join(), ça va bien l’imprimer.

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]
Morgan Thrapp
la source
2
x-i-1 -> x+~i
Sp3000
5

C, 59 ou 59 56 ou 56

Deux versions de longueur identique.

3 octets sauvés grâce à une suggestion de anatolyg: (n+1)->~n

Itère ide n*n-1zéro. Imprime un 1 si i% (n + 1) est égal à zéro, sinon 0. Imprime une nouvelle ligne si i%n= 0 sinon un espace.

i;f(n){for(i=n*n;i--;)printf(i%n?"%d ":"%d\n",!(i%~n));}

i;f(n){for(i=n*n;i--;)printf("%d%c",!(i%~n),i%n?32:10);}
Level River St
la source
1
n+1est trop terne. Utilisez à la ~nplace!
Anatolyg
Merci! J'aurais dû le remarquer parce que cela m'est arrivé lorsque j'ai examiné le défi de NBZ aujourd'hui.
Level River St
Je ne connais pas trop C. Qu'est-ce que ça i;fait?
Cyoce
@Cyoce i;déclare simplement la variable i. En C, vous devez toujours déclarer une variable avant de l’utiliser, en indiquant le type afin que le compilateur sache combien de mémoire allouer. Avec le compilateur GCC, si vous ne spécifiez pas un type, il est supposé être int.
Level River St
1
Vous pouvez supprimer 1 octet supplémentaire du deuxième, car les onglets sont autorisés, vous pouvez remplacer 32 par 9. 9.
Bijan
5

Mata, 4 octets

I(3)

Sortie

[symmetric]
       1   2   3
    +-------------+
  1 |  1          |
  2 |  0   1      |
  3 |  0   0   1  |
    +-------------+

Mata est le langage de programmation matriciel disponible dans le progiciel statistique Stata. I (n) crée une matrice d'identité de taille n * n

Guest0101
la source
5
Bienvenue dans Programmation Puzzles et Code Golf Stack Exchange. C'est une bonne réponse. (ab) l'utilisation des éléments intégrés est idéale pour le golf. J'ai remarqué que votre réponse est en fait 1 octet:, Iet les 3 autres octets appellent simplement la fonction. Cela ferait de votre réponse l’une des plus faibles de ce défi! :-)
wizzwizz4
4

Pyth, 8 octets

mmsqdkQQ

Essayez ici .

lirtosiast
la source
1
Je dois dire qu'il est très inhabituel que la réponse Pyth soit quatre fois plus longue que la réponse la plus courte ...
ETHproductions
Hrm, c’est le meilleur que j’ai pu obtenir, qui a l’air 100% valide, mais j’ai trouvé qRRQQce qui semble fonctionner sauf si vous obtenez Trueet Falseau lieu de, 1et 0cependant, résoudre ce problème autant que vous le souhaitez nécessite l’utilisation de trois octets, sMMce qui n’aide en rien ...
FryAmTheEggman
@FryAmTheEggman J'ai aussi trouvé qRRQQ. J'ai essayé un certain nombre d'autres programmes, et aucun d'entre eux n'était plus court.
lirtosiast
4

Python 3.5 avec NumPy - 57 49 30 octets

import numpy
numpy.identity

NumPy.identity prend un entier, n, et retourne une matrice d'identité par n. Cette réponse est autorisée via cette politique .

linkian209
la source
4
En fait, je crois que import numpy\nnumpy.identityc'est une réponse légitime .
FryAmTheEggman
Merci pour le conseil @MorganThrapp! Et @FryAmTheEggman, vous voulez dire que ma réponse pourrait bien être de import numpy\nnumpy.identity()30 octets?
linkian209
\ Nnumpy lol m'a confondu ... Cela serait également valable, @FryAmTheEggman, non? from numpy import identity. 26 octets.
Ogaday
Aussi, voir ma réponse quelque chose de similaire
Ogaday
@Ogaday Je ne pense pas que ce soit correct, la ligne que vous avez donnée ne correspond pas à une fonction. Vous auriez besoin de faire from numpy import identidy\nidentity(dans ce cas, il serait plus court d'utiliser *au lieu de la commande intégrée spécifique)
FryAmTheEggman le
4

Mathematica, 35 octets

sans utiliser IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&
Un simmons
la source
4

Javascript, 40

f=
n=>'0'.repeat(n).replace(/./g,"$`1$'\n")

I.oninput=_=>O.innerHTML=f(+I.value)
I.oninput()
<input id=I value=5>
<pre id=O>

Washington Guedes
la source
4

Japt, 14 12 10 octets

Uo £Z®¥X|0

Testez-le en ligne! Remarque: cette version dispose de quelques octets supplémentaires pour imprimer en jolie sortie.

Uo £Z®¥X|0    // Implicit: U = input integer
Uo £          // Create the range [0..U). Map each item X and the full array Z to:
    Z®        //  Take the full array Z, and map each item Z to:
      ¥X|0    //   (X == Z) converted to a number. 1 for equal, 0 for non-equal.
              // Implicit: output result of last expression
ETHproductions
la source
4

Brain-Flak , 206 170 162 octets

(([{}])){({}<>(())<><(({})<{({}()(<>)<>)}{}>)>)}{}(({}<><(())>)){({}()<({[()]<({}()<({}<>((((()()()()){}){}){})((()()()()){}){})<>>)>}{})>)<>((()()()()()){})<>}<>

Essayez-le en ligne!

Assistant de blé
la source
3

K, 7 octets

t=\:t:!

Prenons le produit croisé d'égalité de deux vecteurs contenant [0, n).

En action:

  t=\:t:!3
(1 0 0
 0 1 0
 0 0 1)
  t=\:t:!5
(1 0 0 0 0
 0 1 0 0 0
 0 0 1 0 0
 0 0 0 1 0
 0 0 0 0 1)
JohnE
la source
3

Java, 60 octets

n->{int[][]i=new int[n][n];for(;n-->0;)i[n][n]=1;return i;};

Crée un tableau 2D et remplace les éléments où rangée et colonne sont égaux 1.

TNT
la source
Il n'est pas nécessaire d'ajouter le point-virgule final au nombre d'octets pour les réponses lambda Java.
Kevin Cruijssen
3

CJam, 7 octets

{,_ff=}

Il s'agit d'un bloc de code qui extrait un entier de la pile et pousse un tableau 2D en retour.

Essayez-le en ligne!

Dennis
la source
3

Mathematica, 14 octets

IdentityMatrix

Cas de test

IdentityMatrix[4]
(* {{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}} *)
njpipeorgan
la source
3

Perl, 39 33 octets

/$/,say map$`==$_|0,@%for@%=1..<>

Merci à Ton Hospel d' avoir sauvé 6 octets

Courir avec le -Eperlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001
andlrc
la source
Golf un peu plus: /$/,say map$`==$_|0,@%for@%=1..<>ou même mieux, //,say map$'==$_|0,@%for@%=1..<>mais comme ça, vous ne pouvez plus le citer entre guillemets
Ton Hospel
@TonHospel Wow c'est cool, merci. Ce dernier nécessiterait l’utilisation de printau lieu de dire, car elle -En’est libre que sur la ligne de commande.
andlrc