O desafio é muito simples. Dada uma entrada inteira n
, produza a n x n
matriz de identidade. A matriz de identidade é aquela que se 1
estende 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 é código-golfe , então o código mais curto em bytes vence.
code-golf
math
matrix
linear-algebra
binary-matrix
code-challenge
polyglot
code-golf
restricted-source
programming-puzzle
expression-building
apl
code-challenge
image-processing
compression
code-golf
puzzle-solver
code-golf
grid
code-golf
number
number-theory
code-golf
array-manipulation
sorting
code-golf
string
balanced-string
code-golf
puzzle-solver
code-golf
string
decision-problem
code-golf
path-finding
puzzle-solver
graph-theory
code-golf
string
encode
networking
code-golf
code-golf
string
chemistry
code-golf
date
code-golf
decision-problem
graph-theory
code-golf
ascii-art
graph-theory
code-golf
string
Seadrus
fonte
fonte
Respostas:
MATL, 2 bytes
Uma tradução da minha resposta de oitava.
Experimente online.
Uma versão de 4 bytes sem built-ins (graças a Luis Mendo):
fonte
:t!=
TI-BASIC, 2 bytes
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(
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.fonte
{N,N}
, hum{N,N}
?dim(
eidentity(
são cada um byte porque o TI-BASIC é tokenizado.Julia,
93 bytesEsta é apenas uma função interna que aceita um número inteiro
n
e retorna umnxn Array{Float64,2}
(ou seja, uma matriz 2D). Chame assimeye(n)
.Observe que os envios deste formulário são aceitáveis por esta política .
fonte
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
fonte
Oitava,
104 bytesRetorna uma função anônima que pega um número
n
e retorna a matriz de identidade.fonte
@eye
é suficiente.eye
produz a matriz de identidade em várias linguagens orientadas numericamente.@
faz?@
é o "operador do identificador de função", funciona como alambda
e 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 aquiR, 4 bytes
Quando recebe uma matriz,
diag
retorna a diagonal da matriz. No entanto, quando determinado um número inteiron
,diag(n)
retorna a matriz de identidade.Experimente online
fonte
Python 2, 42 bytes
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
, quen=3
pareceUsando o zip / iter enganar
zip(*[iter(_)]*n
para fazer grupos den
dá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]
.fonte
Gelatina, 4 bytes
Não usa um built-in. Experimente online!
Como funciona
fonte
=þ
tem dois bytes e tira sarro das respostas mais longas.J, 4 bytes
Esta é uma função que pega um número inteiro e retorna a matriz.
fonte
=i.
(=i.) 10
=>0 0 0 0 0 0 0 0 0 0
Haskell,
4337 bytesBem 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
fonte
fromEnum
assum[1|x==y]
.fromEnum (y==x)
0^abs(x-y)
.0^(x-y)^2
se usar em outra resposta, ainda mais curta.Pitão, 7 bytes
Experimente online: Demonstração
Criando uma matriz de zeros e substituindo os elementos diagonais por outros.
fonte
Q
JavaScript ES6,
686252 bytesEconomizou 10 bytes graças a um truque da @Neil
Tentando uma abordagem diferente da @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Possivelmente poderia ser melhorado.
fonte
x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))
para economizar 10 bytes.x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
Retina , 25
Crédito para @randomra e @Martin por golfe extra.
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
Experimente online.
fonte
$*0
para substituir um número n por n0
s.Haskell, 54 bytes
f
retorna a matriz de identidade para a entrada n. Longe de ser o ideal.fonte
map
chamada.Lua,
77 7565 bytesBem, 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:
Você consegue fazer isso:
Mas espere, Lua permite uma certa quantidade de POO. Então você pode potencialmente fazer:
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:
Vai funcionar.
Para que você possa ver visualmente a diferença, dê uma olhada nos resultados deste jogo:
Usando string.sub (88 caracteres)
Atribuindo string.sub a uma variável (65 caracteres)
Atribuindo string.sub usando uma abordagem OOP (64 caracteres)
Atribuindo string.sub usando uma abordagem .. nil? (60 caracteres)
Se alguém souber por que isso funciona, eu estaria interessado.
fonte
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.fonte
x-i-1 -> x+~i
C,
59 ou 5956 ou 56Duas versões de comprimento idêntico.
3 bytes salvos devido a sugestão de anatolyg:
(n+1)
->~n
Repete
i
den*n-1
para zero. Imprime 1 se i% (n + 1) for zero, caso contrário, 0. Em seguida, imprime uma nova linha sei%n
= 0, caso contrário, um espaço.fonte
n+1
é muito chato. Use em~n
vez disso!i;
faz?i;
apenas declara a variáveli
. 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á assumidoint
.Mata, 4 bytes
Resultado
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
fonte
I
e os outros 3 bytes estão apenas chamando a função. Isso tornaria sua resposta uma das mais baixas desse desafio! :-)K6 , 1 byte
=
é exatamente issoExperimente online!
fonte
Pitão, 8 bytes
Experimente aqui .
fonte
qRRQQ
que parece funcionar, exceto o que você obtémTrue
e, emFalse
vez de1
e0
, no entanto, corrigir esse afaik requer o uso de três bytes, osMM
que não ajuda ...Python 3.5 com NumPy -
574930 bytesNumPy.identity recebe um número inteiro n e retorna uma matriz de identidade n. Esta resposta é permitida através desta política .
fonte
import numpy\nnumpy.identity
seja uma resposta legítima .import numpy\nnumpy.identity()
30 bytes?from numpy import identity
. 26 bytes.from numpy import identidy\nidentity
(caso em que seria mais curto para usar*
em vez do builtin específica)Mathematica, 35 bytes
sem usar o IdentityMatrix
fonte
Javascript, 40
fonte
Japonês,
141210 bytesTeste online! Nota: esta versão possui alguns bytes extras para imprimir a saída.
fonte
Brain-Flak ,
206170162 bytesExperimente online!
fonte
K, 7 bytes
Tome o produto cruzado de igualdade de dois vetores contendo [0, n).
Em ação:
fonte
Java, 60 bytes
Cria uma matriz 2D e substitui elementos em que linha e coluna são iguais
1
.fonte
CJam, 7 bytes
Este é um bloco de código que exibe um número inteiro da pilha e empurra uma matriz 2D em troca.
Experimente online!
fonte
Mathematica, 14 bytes
Caso de teste
fonte
Perl,
3933 bytesAgradecimentos a Ton Hospel por salvar 6 bytes
Executando com o
-E
perlrun:fonte
/$/,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 maisprint
vez de dizer, porque-E
é gratuito na linha de comando.