Construir a matriz de identidade


43

O desafio é muito simples. Dada uma entrada inteira n, produza a n x nmatriz de identidade. A matriz de identidade é aquela que se 1estende da parte superior esquerda até a parte inferior direita. Você escreverá um programa ou uma função que retornará ou produzirá a matriz de identidade que você construiu. Sua saída pode ser uma matriz 2D ou números separados por espaços / tabulações e novas linhas.

Exemplo de entrada e saída

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.

Isso é , então o código mais curto em bytes vence.


1
Dada uma entrada inteira n ... - Presumo que você queira dizer um número natural?
Jonathan Frech

Respostas:


26

MATL, 2 bytes

Xy

Uma tradução da minha resposta de oitava.

Experimente online.

Uma versão de 4 bytes sem built-ins (graças a Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result

7
Deve ter sido difícil traduzir esse código muito sofisticado: D
flawr

11
@ flawr Você não tem ideia. Esta é realmente minha obra-prima.
a spaghetto


1
Agora eu vejo porque você estava perguntando! :-D
Luis Mendo 28/01

5
Sem builtins::t!=
Luis Mendo

20

TI-BASIC, 2 bytes

identity(Ans

Curiosidade: A maneira mais curta de obter uma lista {N,N}é dim(identity(N.

Aqui está o caminho mais curto sem o builtin, em 8 bytes:

randM(Ans,Ans)^0

randM(cria uma matriz aleatória com entradas com todos os números inteiros entre -9 e 9, inclusive (isso soa estranhamente específico porque é). Em seguida, levamos essa matriz à 0ª potência.


1
" isso soa estranhamente específico porque é " TI-BASIC é estranho. O_o
Maçaneta da porta

Claro que sim. TI-BASIC. +1
bearacuda13

não é a maneira mais curta de obter uma lista {N,N}, hum {N,N}?
Cyoce 2/07

1
@Cyoce No; dim(e identity(são cada um byte porque o TI-BASIC é tokenizado.
lirtosiast

19

Julia, 9 3 bytes

eye

Esta é apenas uma função interna que aceita um número inteiro ne retorna um nxn Array{Float64,2}(ou seja, uma matriz 2D). Chame assim eye(n).

Observe que os envios deste formulário são aceitáveis ​​por esta política .


Eu vi o que você fez lá! Agradável!
Ismael Miguel

Isso também funciona em Math.JS
ATaco

16

APL, 5 bytes

∘.=⍨⍳

Este é um trem de função monádico que aceita um número inteiro à direita e retorna a matriz de identidade.

Experimente aqui


14

Oitava, 10 4 bytes

@eye

Retorna uma função anônima que pega um número ne retorna a matriz de identidade.


@eyeé suficiente.
flawr

@ flawr Obrigado, eu sabia que havia uma maneira de fazer isso assim, mas eu sempre esqueço: P
um spaghetto

eyeproduz a matriz de identidade em várias linguagens orientadas numericamente.
flawr

O que @faz?
Cyoce 2/07

O @Cyoce @é o "operador do identificador de função", funciona como a lambdae também como referência a uma função específica, por exemplo, @(x)x.^2é a função quadrática e @sqrté uma referência à função raiz quadrada. Você pode ler mais sobre isso aqui
Giuseppe

12

R, 4 bytes

diag

Quando recebe uma matriz, diagretorna a diagonal da matriz. No entanto, quando determinado um número inteiro n, diag(n)retorna a matriz de identidade.

Experimente online


11

Python 2, 42 bytes

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

Uma função anônima produz saída como [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Primeiro, cria a lista ([1]+[0]*n)*n, que n=3parece

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

Usando o zip / iter enganar zip(*[iter(_)]*n para fazer grupos de n

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

Observe que o 1índice vem um depois a cada vez, fornecendo a matriz de identidade. Mas, há uma linha extra zero, que é removida com [:n].


1
Droga que zip / iter truque é engenhosa
seequ

10

Gelatina, 4 bytes

R=€R

Não usa um built-in. Experimente online!

Como 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 é inaceitavelmente longo.
flawr

5
@flawr Duas vezes o comprimento do menor. Esse é realmente um encontro incomum.
Rainer P.

1
@flawr Sim, e não inferior a J . FALHOU!
Adám

2
Nas versões modernas do Jelly, tem dois bytes e tira sarro das respostas mais longas.
Lynn

@ Lynn Isso ainda é duas vezes maior que o menor.
Adám 21/08/16

10

J, 4 bytes

=@i.

Esta é uma função que pega um número inteiro e retorna a matriz.


Eu acho que você pode fazê-lo em 3:=i.
Sam Elliott

@SamElliott que não funciona. Por exemplo, (=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]]

Bem direto, embora eu ache que alguém possa fazer melhor (sem uma linguagem que já tenha essa função incorporada, como muitos fizeram).

Edit: caiu alguns bytes graças a Ørjan Johansen


7
Você pode enganar o fromEnumas sum[1|x==y].
Xnor

certeza que você pode remover o espaço emfromEnum (y==x)
Cyoce

@xnor Um byte mais curto do que isso: 0^abs(x-y).
Ørjan Johansen

1
@xnor Oh, você acabou de 0^(x-y)^2se usar em outra resposta, ainda mais curta.
Ørjan Johansen

@ ØrjanJohansen Sim, vendo o seu comentário foi bom tempo :)
xnor

8

Pitão, 7 bytes

XRm0Q1Q

Experimente online: Demonstração

Criando uma matriz de zeros e substituindo os elementos diagonais por outros.


Você pode salvar um byte removendo a finalQ
Jim

1
@ Jim Obrigado, mas isso realmente não seria permitido. O recurso (Q implícito no final) foi implementado após o lançamento do desafio.
21417 Jakeline

7

JavaScript ES6, 68 62 52 bytes

Economizou 10 bytes graças a um truque da @Neil

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

Tentando uma abordagem diferente da @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Possivelmente poderia ser melhorado.


Foi exatamente o que eu escrevi antes de rolar para baixo para descobrir que você tinha me derrotado.
Neil

Portanto, em resposta ao seu desafio, dou-lhe o (em retrospectiva) óbvio x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))para economizar 10 bytes.
Neil

@ Neil Muito obrigado! Vou mencionar que é o seu truque na resposta.
ETHproductions

x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
L4m2

7

Retina , 25

Crédito para @randomra e @Martin por golfe extra.

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

Experimente online.

Observe que isso leva a entrada como unária. Se isso não for aceitável, a entrada decimal pode ser fornecida da seguinte maneira:

Retina, 34

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

Experimente online.


3
...Uau. A retina está se tornando poderosa como idioma por mais do que a expressão regular.
ETHproductions

@ETHproductions sim, embora isso seja resposta praticamente toda a substituição de regex. A única coisa especial é o uso de $*0para substituir um número n por n 0s.
Digital Trauma

6

Haskell, 54 bytes

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

fretorna a matriz de identidade para a entrada n. Longe de ser o ideal.


Você pode salvar um punhado de bytes usando uma compreensão de lista em vez de uma mapchamada.
MatemáticoOrchid

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

Bem, não tenho certeza se lua é a melhor linguagem para isso com a concatenação de dois períodos ... Mas ei, há uma chance disso. Vou ver se há alguma melhoria a ser feita.

EDITAR:

Eu descobri algo sobre acidente que eu acho bastante estranho, mas funciona.

Em Lua, todo mundo sabe que você tem a capacidade de atribuir funções a variáveis. Este é um dos recursos mais úteis do CodeGolf.

Isso significa, em vez 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

Você consegue fazer isso:

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

Mas espere, Lua permite uma certa quantidade de POO. Então você pode potencialmente fazer:

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

Isso também funcionará e reduzirá os caracteres.

Agora aqui vem a parte estranha. Você nem precisa atribuir uma string a qualquer momento. Simplesmente fazendo:

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

Vai funcionar.


Para que você possa ver visualmente a diferença, dê uma olhada nos resultados deste jogo:

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)

Atribuindo string.sub a uma variável (65 caracteres)

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

Atribuindo string.sub usando uma abordagem OOP (64 caracteres)

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

Atribuindo string.sub usando uma abordagem .. nil? (60 caracteres)

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

Se alguém souber por que isso funciona, eu estaria interessado.


A linha "z.rep" está quebrando na minha. Aposto que deve haver az = '' em algum lugar? Uma variante mais curta de z = '' z.rep seria apenas ('') .rep. Você também pode usar o cmdline ... para ler a entrada e aumentar o número de bytes até 57 da seguinte maneira: z = '0'para i = 1, ... imprima (z: rep (i-1) .. 1 ..z: rep (...- i)) end
thenumbernine 22/03

Encontrei alguém sugerindo ("") .rep antes, mas não consegui fazê-lo funcionar. Sempre erro. Talvez meu intérprete seja o problema aqui. Estou lutando para encontrar qualquer documentação sobre esta entrada de linha de comando, você sabe onde pode ser encontrada?
Skyl3r

6

Python 3, 48

Economizou 1 byte graças ao sp3000.

Adoro desafios que posso resolver em uma linha. Muito simples, construa uma linha de 1 e 0 igual ao comprimento do int passado. Saída como uma matriz 2D. Se você envolver a peça após o: in '\n'.join(), ela será impressa.

lambda x:[[0]*i+[1]+[0]*(x+~i)for i in range(x)]

2
x-i-1 -> x+~i
SP3000

5

C, 59 ou 59 56 ou 56

Duas versões de comprimento idêntico.

3 bytes salvos devido a sugestão de anatolyg: (n+1)->~n

Repete ide n*n-1para zero. Imprime 1 se i% (n + 1) for zero, caso contrário, 0. Em seguida, imprime uma nova linha se i%n= 0, caso contrário, um espaço.

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+1é muito chato. Use em ~nvez disso!
Anatolyg

Obrigado! Eu deveria ter percebido isso, porque ocorreu-me quando olhei para o desafio do NBZ hoje.
Level River St

Não estou muito familiarizado com C. O que i;faz?
precisa saber é o seguinte

@Cyoce i;apenas declara a variável i. Em C, você sempre precisa declarar uma variável antes de usá-la, indicando o tipo para que o compilador saiba quanta memória alocar. Com o compilador GCC, se você não especificar um tipo, ele será assumido int.
Level River St

1
Você pode tirar mais 1 byte do segundo, uma vez que as guias são permitidas, você pode substituir 32 por 9. #
Bijan

5

Mata, 4 bytes

I(3)

Resultado

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

Mata é a linguagem de programação matricial disponível no pacote estatístico Stata. I (n) cria uma matriz de identidade de tamanho n * n


5
Bem-vindo à Programação de quebra-cabeças e troca de pilha de código de golfe. Esta é uma boa resposta; (ab) o uso de embutidos é ótimo para jogar golfe. Notei que sua resposta é realmente 1 byte:, Ie os outros 3 bytes estão apenas chamando a função. Isso tornaria sua resposta uma das mais baixas desse desafio! :-)
wizzwizz4


4

Pitão, 8 bytes

mmsqdkQQ

Experimente aqui .


1
Devo dizer, é altamente incomum que a resposta Pyth é quatro vezes maior do que a resposta mais curta ...
ETHproductions

Hrm, este foi o melhor que consegui parecer 100% válido, mas achei o qRRQQque parece funcionar, exceto o que você obtém Truee, em Falsevez de 1e 0, no entanto, corrigir esse afaik requer o uso de três bytes, o sMMque não ajuda ...
FryAmTheEggman

@FryAmTheEggman Eu também encontrei qRRQQ. Eu tentei vários outros programas e nenhum deles era mais curto.
precisa saber é o seguinte

4

Python 3.5 com NumPy - 57 49 30 bytes

import numpy
numpy.identity

NumPy.identity recebe um número inteiro n e retorna uma matriz de identidade n. Esta resposta é permitida através desta política .


4
Na verdade, acredito que import numpy\nnumpy.identityseja uma resposta legítima .
FryAmTheEggman

Obrigado pela dica @MorganThrapp! E @FryAmTheEggman, você quer dizer que minha resposta poderia ser apenas import numpy\nnumpy.identity()30 bytes?
precisa saber é o seguinte

Fiquei tão confuso com \ nnumpy lol ... Isso também seria válido, @FryAmTheEggman, não? from numpy import identity. 26 bytes.
Ogaday

Além disso, veja a minha resposta algo semelhante #
02/07/16 Ogaday

@ Hoje não acho que isso esteja correto, a linha que você forneceu não avalia uma função. Você precisaria fazer from numpy import identidy\nidentity(caso em que seria mais curto para usar *em vez do builtin específica)
FryAmTheEggman

4

Mathematica, 35 bytes

sem usar o 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

Japonês, 14 12 10 bytes

Uo £Z®¥X|0

Teste online! Nota: esta versão possui alguns bytes extras para imprimir a saída.

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 o produto cruzado de igualdade de dois vetores contendo [0, n).

Em ação:

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

Cria uma matriz 2D e substitui elementos em que linha e coluna são iguais 1.


Você não precisa adicionar o ponto e vírgula à direita na contagem de bytes para respostas Java lambda.
Kevin Cruijssen

3

CJam, 7 bytes

{,_ff=}

Este é um bloco de código que exibe um número inteiro da pilha e empurra uma matriz 2D em troca.

Experimente online!


3

Mathematica, 14 bytes

IdentityMatrix

Caso de teste

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

Agradecimentos a Ton Hospel por salvar 6 bytes

Executando com o -Eperlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001

Prática de golfe um pouco mais: /$/,say map$`==$_|0,@%for@%=1..<>ou melhor ainda //,say map$'==$_|0,@%for@%=1..<>, mas como que você não pode colocá-lo entre aspas simples mais
Ton Hospel

@TonHospel Uau, isso é legal, obrigado. O último exigiria o uso de em printvez de dizer, porque -Eé gratuito na linha de comando.
22716 Andlrc
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.