Construir la matriz de identidad

44

El desafío es muy simple. Dada una entrada entera n, salida de la n x nmatriz de identidad. La matriz de identidad es una que se 1extiende desde la parte superior izquierda hasta la parte inferior derecha. Escribirás un programa o una función que devolverá o generará la matriz de identidad que construiste. Su salida puede ser una matriz 2D o números separados por espacios / pestañas y líneas nuevas.

Ejemplo de entrada y salida

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.

Este es el , por lo que gana el código más corto en bytes.

Seadrus
fuente
1
Dada una entrada entera n ... - ¿Supongo que te refieres a un número natural?
Jonathan Frech

Respuestas:

26

MATL, 2 bytes

Xy

Una traducción de mi respuesta Octave.

Pruébalo en línea.

Una versión de 4 bytes sin elementos integrados (gracias a Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result
un espagueti
fuente
77
Debe haber sido difícil traducir este código muy sofisticado: D
flawr
11
@flawr No tienes idea. Esta es realmente mi obra maestra.
un spaghetto
1
¡Ahora veo por qué preguntabas! :-D
Luis Mendo
55
Sin construcciones::t!=
Luis Mendo
20

TI-BASIC, 2 bytes

identity(Ans

Dato curioso: la forma más corta de obtener una lista {N,N}es dim(identity(N.

Aquí está el camino más corto sin el incorporado, en 8 bytes:

randM(Ans,Ans)^0

randM(crea una matriz aleatoria con entradas de todos los enteros entre -9 y 9 inclusive (eso suena extrañamente específico porque lo es). Luego llevamos esta matriz a la potencia 0.

lirtosiast
fuente
1
" eso suena extrañamente específico porque es " TI-BASIC es extraño. O_o
puerta
Oh sí. TI-BASIC. +1
bearacuda13
no es el camino más corto para obtener una lista {N,N}, umm, {N,N}?
Cyoce
1
@Cyoce No; dim(y identity(son de un byte porque TI-BASIC está tokenizado.
lirtosiast
19

Julia, 9 3 bytes

eye

Esta es solo una función incorporada que acepta un número entero ny devuelve un nxn Array{Float64,2}(es decir, una matriz 2D). Llámalo como eye(n).

Tenga en cuenta que los envíos de este formulario son aceptables según esta política .

Alex A.
fuente
¡Veo lo que hiciste alli! ¡Buena esa!
Ismael Miguel
Esto también funciona en Math.JS
ATaco
16

APL, 5 bytes

∘.=⍨⍳

Este es un tren de funciones monádicas que acepta un número entero a la derecha y devuelve la matriz de identidad.

Pruébalo aquí

Alex A.
fuente
14

Octava, 10 4 bytes

@eye

Devuelve una función anónima que toma un número ny devuelve la matriz de identidad.

un espagueti
fuente
@eyees suficiente.
flawr
@flawr Gracias, sabía que había una manera de hacerlo así, pero siempre me olvido: P
un espagueti
eyeproduce la matriz de identidad en muchos / algunos lenguajes numéricamente orientados.
flawr
¿Qué hace el @?
Cyoce
@Cyoce @es el "operador de manejador de funciones", funciona como ay lambdatambién como una referencia a una función particular, por ejemplo, @(x)x.^2es la función de cuadratura y @sqrtes una referencia a la función de raíz cuadrada. Puedes leer más sobre eso aquí
Giuseppe
12

R, 4 bytes

diag

Cuando se le da una matriz, diagdevuelve la diagonal de la matriz. Sin embargo, cuando se le da un número entero n, diag(n)devuelve la matriz de identidad.

Pruébalo en línea

Alex A.
fuente
12

Python 2, 42 bytes

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

Una función anónima, produce resultados como [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Primero, crea la lista ([1]+[0]*n)*n, que para n=3parece

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

Usando el truco zip / iter zip(*[iter(_)]*n para hacer grupos de ndonaciones

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

Tenga en cuenta que 1cada vez viene un índice, que da la matriz de identidad. Pero, hay una fila extra de cero, que se elimina con [:n].

xnor
fuente
1
Maldita ese zip / iter truco es ingeniosa
seequ
10

Jalea, 4 bytes

R=€R

No utiliza un incorporado. Pruébalo en línea!

Cómo funciona

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
fuente
25
Este código es inaceptablemente largo.
flawr
55
@flawr El doble de largo que el más corto. Ese es de hecho un encuentro inusual.
Rainer P.
1
@flawr Sí, y no más corto que J . ¡FALLAR!
Adám
2
En las versiones modernas de Jelly, tiene dos bytes y se burla de las respuestas más largas.
Lynn
@ Lynn Eso sigue siendo el doble que el más corto.
Adám
10

J, 4 bytes

=@i.

Esta es una función que toma un número entero y devuelve la matriz.

marinus
fuente
Creo que puedes hacerlo en 3:=i.
Sam Elliott
@SamElliott que no funciona. Por ejemplo, (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce
9

Haskell, 43 37 bytes

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

Bastante sencillo, aunque creo que uno puede hacerlo mejor (sin un lenguaje que ya tenga esta función incorporada, como muchos lo han hecho).

Editar: cayó algunos bytes gracias a Ørjan Johansen

Sheridan Grant
fuente
77
Puedes engañar al fromEnumas sum[1|x==y].
xnor
bastante seguro de que puedes eliminar el espacio enfromEnum (y==x)
Cyoce
@xnor Un byte más corto que: 0^abs(x-y).
Ørjan Johansen
1
@xnor Oh, te acabas de usar 0^(x-y)^2en otra respuesta, incluso más corta.
Ørjan Johansen
@ ØrjanJohansen Sí, ver tu comentario fue un buen momento :)
xnor
8

Pyth, 7 bytes

XRm0Q1Q

Pruébalo en línea: demostración

Creando una matriz de ceros y reemplazando los elementos diagonales con unos.

Jakube
fuente
Puede guardar un byte eliminando la finalQ
Jim
1
@ Jim Gracias, pero eso en realidad no estaría permitido. La característica (Q implícita al final) se implementó después de que se publicó el desafío.
Jakube
7

JavaScript ES6, 68 62 52 bytes

Ahorró 10 bytes gracias a un buen truco de @Neil

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

Intentando un enfoque diferente al de @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Posiblemente podría mejorarse.

ETHproducciones
fuente
Esto fue exactamente lo que escribí antes de desplazarme hacia abajo para descubrir que me habías derrotado.
Neil
Entonces, en respuesta a su desafío, le doy lo (en retrospectiva) obvio x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))para un ahorro de 10 bytes.
Neil
@Neil ¡Muchas gracias! Mencionaré que es tu truco en la respuesta.
ETHproductions
x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
l4m2
7

Retina , 25

Crédito a @randomra y @Martin por golf extra.

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

Pruébalo en línea.

Tenga en cuenta que esto toma la entrada como unario. Si esto no es aceptable, entonces la entrada decimal se puede dar de la siguiente manera:

Retina, 34

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

Pruébalo en línea.

Trauma digital
fuente
3
... whoa La retina se está volviendo poderosa como lenguaje para algo más que expresiones regulares.
ETHproductions
@ETHproductions sí, aunque esta es la respuesta a casi todas las sustituciones de expresiones regulares. Lo único especial es el uso de $*0para reemplazar un número n con n 0s.
Trauma digital
6

Haskell, 54 bytes

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

fdevuelve la matriz de identidad para la entrada n. Lejos de ser óptimo.

ThreeFx
fuente
Puede guardar un puñado de bytes utilizando una comprensión de la lista en lugar de una mapllamada.
MathematicalOrchid
6

Lua, 77 75 65 bytes

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

Bueno, no estoy seguro de si lua es el mejor lenguaje para esto con la concatenación de dos períodos ... Pero bueno, hay una oportunidad. Veré si hay alguna mejora que hacer.

EDITAR:

Descubrí algo por accidente que encuentro bastante extraño, pero funciona.

En Lua, todos saben que tienes la capacidad de asignar funciones a variables. Esta es una de las características más útiles de CodeGolf.

Esto significa en lugar 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

Puedes hacerlo:

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

Pero espera, Lua permite cierta cantidad de POO. Por lo tanto, incluso podría hacer:

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

Eso también funcionará y cortará personajes.

Ahora aquí viene la parte extraña. Ni siquiera necesita asignar una cadena en ningún punto. Simplemente haciendo:

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

Trabajará.


Para que pueda ver la diferencia visualmente, eche un vistazo a los resultados de golf de esto:

Usando string.sub (88 caracteres)

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

Asignación de string.sub a una variable (65 caracteres)

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

Asignación de string.sub usando un enfoque OOP (64 caracteres)

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

Asignación de string.sub usando un enfoque nulo? (60 caracteres)

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

Si alguien sabe por qué esto funciona, estaría interesado.

Skyl3r
fuente
La línea "z.rep" se está rompiendo en la mía. Apuesto a que debería haber az = '' en alguna parte? Una variante más corta de z = '' z.rep sería simplemente ('') .rep. También puede usar el cmdline ... para leer la entrada y reducir el bytecount a 57 de la siguiente manera: z = '0'para i = 1, ... do print (z: rep (i-1) .. 1 ..z: rep (...- i)) final
thenumbernine
Encontré a alguien sugiriendo ("") .rep antes, pero no pude hacerlo funcionar. Siempre es un error. Quizás mi intérprete es el problema aquí. Estoy luchando por encontrar cualquier documentación sobre esta entrada de línea de comando, ¿sabes dónde se puede encontrar?
Skyl3r
6

Pitón 3, 48

Guardado 1 byte gracias a sp3000.

Me encantan los desafíos que puedo resolver en una sola línea. Bastante simple, construya una línea de 1 y 0 igual a la longitud del int pasado. Salidas como una matriz 2d. Si envuelve la parte después de: in '\n'.join(), la imprimirá bastante.

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

C, 59 o 59 56 o 56

Dos versiones de idéntica longitud.

3 bytes guardados debido a una sugerencia de anatolyg: (n+1)->~n

Itera ide n*n-1a cero. Imprime un 1 si i% (n + 1) es cero, de lo contrario 0. Luego imprime una nueva línea si i%n= 0 de lo contrario un espacio.

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
fuente
1
n+1es demasiado aburrido Use en su ~nlugar!
anatolyg
¡Gracias! Debería haberlo visto, porque se me ocurrió cuando miré el desafío de NBZ hoy.
Level River St el
No estoy muy familiarizado con C. ¿Qué hace i;?
Cyoce
@Cyoce i;solo declara la variable i. En C siempre tiene que declarar una variable antes de usarla, indicando el tipo para que el compilador sepa cuánta memoria asignar. Con el compilador GCC, si no especifica un tipo, se supone que es int.
Level River St el
1
Puede quitar 1 byte más del segundo, ya que las pestañas están permitidas, puede reemplazar 32, con 9.
Bijan
5

Mata, 4 bytes

I(3)

Salida

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

Mata es el lenguaje de programación matricial disponible dentro del paquete estadístico Stata. I (n) crea una matriz de identidad de tamaño n * n

Invitado0101
fuente
55
Bienvenido a Programming Puzzles y Code Golf Stack Exchange. Esta es una buena respuesta; (ab) el uso de elementos integrados es ideal para jugar al golf. Noté que su respuesta es en realidad 1 byte: Iy los otros 3 bytes simplemente están llamando a la función ¡Eso haría que tu respuesta sea una de las más bajas en este desafío! :-)
wizzwizz4
4

Pyth, 8 bytes

mmsqdkQQ

Probarlo aquí .

lirtosiast
fuente
1
Debo decir que es muy inusual que la respuesta Pyth sea cuatro veces más larga que la respuesta más corta ...
ETHproductions
Hrm, esto fue lo mejor que pude obtener que parece 100% válido, pero encontré qRRQQque parece funcionar, excepto que obtienes Truey en Falselugar de 1y 0, sin embargo, para solucionar este afaik requiere el uso de tres bytes, sMMlo que no ayuda ...
FryAmTheEggman
@FryAmTheEggman También encontré qRRQQ. He probado varios otros programas, y ninguno de ellos fue más corto.
lirtosiast
4

Python 3.5 con NumPy - 57 49 30 bytes

import numpy
numpy.identity

NumPy.identity toma un número entero, n, y devuelve una matriz de identidad por n. Esta respuesta está permitida a través de esta política .

linkian209
fuente
44
En realidad, creo que import numpy\nnumpy.identityes una respuesta legítima .
FryAmTheEggman
Gracias por el consejo @MorganThrapp! Y @FryAmTheEggman, ¿quieres decir que mi respuesta podría ser de import numpy\nnumpy.identity()30 bytes?
linkian209
Me confundí mucho con \ nnumpy lol ... Esto también sería válido, @FryAmTheEggman, ¿no? from numpy import identity. 26 bytes.
Ogaday
Además, vea mi respuesta algo similar
Ogaday,
@Ogaday No creo que sea correcto, la línea que has dado no evalúa una función. Tendría que hacerlo from numpy import identidy\nidentity(en cuyo caso sería más corto de usar en *lugar del específico incorporado)
FryAmTheEggman
4

Mathematica, 35 Bytes

sin usar IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&
Un simmons
fuente
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
fuente
4

Japt, 14 12 10 bytes

Uo £Z®¥X|0

¡Pruébalo en línea! Nota: esta versión tiene algunos bytes adicionales para imprimir la salida.

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
ETHproducciones
fuente
4

Brain-Flak , 206 170 162 bytes

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

Pruébalo en línea!

Asistente de trigo
fuente
3

K, 7 bytes

t=\:t:!

Tome el producto cruzado de igualdad de dos vectores que contienen [0, n).

En acción:

  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
fuente
3

Java, 60 bytes

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

Crea una matriz 2D y reemplaza elementos donde la fila y la columna son iguales 1.

TNT
fuente
No tiene que agregar el punto y coma final al conteo de bytes para las respuestas lambda de Java.
Kevin Cruijssen
3

CJam, 7 bytes

{,_ff=}

Este es un bloque de código que saca un número entero de la pila y empuja una matriz 2D a cambio.

Pruébalo en línea!

Dennis
fuente
3

Mathematica, 14 bytes

IdentityMatrix

Caso de prueba

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

Perl, 39 33 bytes

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

Gracias a Ton Hospel por guardar 6 bytes.

Corriendo con el -Eperlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001
andlrc
fuente
Jugar un poco más al golf: /$/,say map$`==$_|0,@%for@%=1..<>o incluso mejor, //,say map$'==$_|0,@%for@%=1..<>pero así ya no se puede poner entre comillas simples
Ton Hospel
@TonHospel Wow eso es genial, gracias. El último requeriría el uso de en printlugar de decir, porque -Esolo es gratis en la línea de comando.
andlrc