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.


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

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.


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 .


¡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í


14

Octava, 10 4 bytes

@eye

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


@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


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


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.

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.


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


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.


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.


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.


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.


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.


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

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);}

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


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


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 .


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,#}]&

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>


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


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)

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.


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


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}} *)

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

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
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.