Bangun Matriks Identitas

44

Tantangannya sangat sederhana. Diberikan input integer n, output n x nmatriks identitas. Matriks identitas adalah matriks yang 1membentang dari kiri atas ke kanan bawah. Anda akan menulis program atau fungsi yang akan mengembalikan atau menampilkan matriks identitas yang Anda buat. Output Anda mungkin berupa array 2D, atau angka yang dipisahkan oleh spasi / tab dan baris baru.

Contoh input dan output

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.

Ini adalah , jadi kode terpendek dalam byte menang.

Seadrus
sumber
1
Diberikan input bilangan bulat n ... - Saya anggap Anda maksud angka alami?
Jonathan Frech

Jawaban:

26

MATL, 2 byte

Xy

Terjemahan dari jawaban Oktaf saya.

Cobalah online.

Versi 4 byte tanpa built-in (terima kasih kepada Luis Mendo):

:t!=
:     take input n and a generate row array [1,2,...n]
 t    duplicate
  !   zip
   =  thread compare over the result
sebuah spaghetto
sumber
7
Pasti sulit, menerjemahkan kode yang sangat canggih ini: D
flawr
11
@ flawr Anda tidak tahu. Ini benar-benar maha karya saya.
spaghetto
1
Sekarang saya mengerti mengapa Anda bertanya! :-D
Luis Mendo
5
Tanpa bawaan::t!=
Luis Mendo
20

TI-BASIC, 2 byte

identity(Ans

Fakta menyenangkan: Cara terpendek untuk mendapatkan daftar {N,N}adalah dim(identity(N.

Inilah cara terpendek tanpa builtin, dalam 8 byte:

randM(Ans,Ans)^0

randM(membuat matriks acak dengan entri semua bilangan bulat antara -9 dan 9 inklusif (yang terdengar aneh karena itu). Kami kemudian mengambil matriks ini ke kekuatan 0.

lirtosiast
sumber
1
" Kedengarannya aneh karena spesifik " TI-BASIC aneh. O_o
Gagang Pintu
Yeah. TI-DASAR. +1
bearacuda13
bukan cara terpendek untuk mendapatkan daftar {N,N}, umm {N,N},?
Cyoce
1
@Cyoce Tidak; dim(dan identity(masing-masing satu byte karena TI-BASIC adalah tokenized.
lirtosiast
19

Julia, 9 3 byte

eye

Ini hanya fungsi bawaan yang menerima integer ndan mengembalikan nxn Array{Float64,2}(yaitu array 2D). Sebut saja seperti eye(n).

Perhatikan bahwa pengiriman formulir ini dapat diterima sesuai kebijakan ini .

Alex A.
sumber
Saya melihat apa yang Anda lakukan di sana! Yang bagus!
Ismael Miguel
Ini juga berfungsi di Math.JS
ATaco
16

APL, 5 byte

∘.=⍨⍳

Ini adalah kereta fungsi monadik yang menerima integer di sebelah kanan dan mengembalikan matriks identitas.

Coba di sini

Alex A.
sumber
14

Oktaf, 10 4 byte

@eye

Mengembalikan fungsi anonim yang mengambil angka ndan mengembalikan matriks identitas.

sebuah spaghetto
sumber
@eyeCukup.
flawr
@ flawr Terima kasih, saya tahu ada cara untuk melakukannya seperti itu tetapi saya selalu lupa: P
a spaghetto
eyemenghasilkan matriks identitas dalam banyak / beberapa bahasa yang berorientasi numerik.
flawr
Apa yang @dilakukan?
Cyoce
@Cyoce @adalah "operator fungsi pegangan", berfungsi seperti lambdadan juga sebagai referensi ke fungsi tertentu, jadi misalnya, @(x)x.^2adalah fungsi kuadrat dan @sqrtmerupakan referensi ke fungsi akar kuadrat. Anda dapat membaca lebih lanjut tentang itu di sini
Giuseppe
12

R, 4 byte

diag

Ketika diberi matriks, diagmengembalikan diagonal matriks. Namun, ketika diberi bilangan bulat n, diag(n)mengembalikan matriks identitas.

Cobalah online

Alex A.
sumber
12

Python 2, 42 byte

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

Fungsi anonim, menghasilkan keluaran seperti [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Pertama, buat daftar ([1]+[0]*n)*n, yang n=3terlihat seperti

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

Menggunakan trik zip / iter zip(*[iter(_)]*n untuk membuat kelompok nmemberi

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

Perhatikan bahwa 1muncul satu indeks nanti setiap kali, memberikan matriks identitas. Tapi, ada baris ekstra semua nol, yang dihapus dengan [:n].

Tidak
sumber
1
Sialan trik zip / iter itu cerdik
seequ
10

Jelly, 4 byte

R=€R

Tidak menggunakan built-in. Cobalah online!

Bagaimana itu bekerja

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
sumber
25
Kode ini terlalu panjang.
flawr
5
@ flawr Dua kali panjang yang terpendek. Itu memang pertemuan yang tidak biasa.
Rainer P.
1
@flawr Ya, dan tidak lebih pendek dari J . GAGAL!
Adám
2
Dalam versi modern Jelly, dua byte, dan mengolok-olok jawaban yang lebih panjang.
Lynn
@ Lynn Itu masih dua kali lebih lama dari yang terpendek.
Adám
10

J, 4 byte

=@i.

Ini adalah fungsi yang mengambil integer dan mengembalikan matriks.

marinus
sumber
Saya pikir Anda bisa melakukannya dalam 3:=i.
Sam Elliott
@ SamElliott itu tidak berhasil. Sebagai contoh, (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce
9

Haskell, 43 37 byte

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

Cukup mudah, meskipun saya pikir seseorang dapat melakukan lebih baik (tanpa bahasa yang sudah memiliki fungsi ini built in, seperti yang telah dilakukan banyak orang).

Sunting: turun beberapa byte berkat Ørjan Johansen

Sheridan Grant
sumber
7
Anda bisa menipu fromEnumas sum[1|x==y].
xnor
cukup yakin Anda dapat menghapus ruang difromEnum (y==x)
Cyoce
@xnor Satu byte lebih pendek dari itu: 0^abs(x-y).
Ørjan Johansen
1
@ xnor Oh, Anda baru saja menggunakan 0^(x-y)^2jawaban lain, bahkan lebih pendek.
Ørjan Johansen
@ ØrjanJohansen Ya, melihat komentar Anda adalah waktu yang tepat :)
xnor
8

Pyth, 7 byte

XRm0Q1Q

Cobalah online: Demonstrasi

Membuat matriks nol dan mengganti elemen diagonal dengan yang satu.

Jakube
sumber
Anda dapat menyimpan satu byte dengan menghapus finalQ
Jim
1
@ Jim Terima kasih, tapi itu sebenarnya tidak akan diizinkan. Fitur (Q implisit di akhir) diimplementasikan setelah tantangan diposting.
Jakube
7

JavaScript ES6, 68 62 52 byte

Disimpan 10 byte berkat trik yang rapi dari @Neil

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

Mencoba pendekatan yang berbeda dari @ Cᴏɴᴏʀ O'Bʀɪᴇɴ. Mungkin bisa ditingkatkan.

Produksi ETH
sumber
Ini persis seperti apa yang saya tulis sebelum saya gulir ke bawah untuk mengetahui bahwa Anda telah mengalahkan saya.
Neil
Jadi, sebagai tanggapan atas tantangan Anda, saya memberi Anda (di belakang) jelas x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))untuk menghemat 10 byte.
Neil
@Neil Terima kasih banyak! Saya akan menyebutkan bahwa itu adalah trik Anda dalam jawabannya.
ETHproduk
x=>[...Array(x)].map((_,y,x)=>x.map(_=>+!y--))
14m2
7

Retina , 25

Kredit ke @randomra dan @Martin untuk golf ekstra.

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

Cobalah online.

Catatan ini mengambil input sebagai unary. Jika ini tidak dapat diterima, maka input desimal dapat diberikan sebagai berikut:

Retina, 34

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

Cobalah online.

Trauma Digital
sumber
3
... whoa. Retina menjadi kuat sebagai bahasa lebih dari sekadar regex.
ETHproduksi
@ ETHproductions ya, meskipun ini adalah jawaban hampir semua pengganti regex. Satu-satunya hal khusus adalah penggunaan $*0untuk mengganti nomor n dengan n 0s.
Trauma Digital
6

Haskell, 54 byte

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

fmengembalikan matriks identitas untuk input n. Jauh dari optimal.

ThreeFx
sumber
Anda dapat menyimpan beberapa byte menggunakan pemahaman daftar alih-alih mappanggilan.
MathematicOrchid
6

Lua, 77 75 65 byte

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

Yah, aku tidak yakin apakah lua adalah bahasa terbaik untuk ini dengan penggabungan dua periode ... Tapi, hei, ada kesempatan untuk itu. Saya akan melihat apakah ada perbaikan yang harus dilakukan.

EDIT:

Saya menemukan sesuatu pada kecelakaan yang menurut saya agak aneh, tetapi berhasil.

Di Lua, semua orang tahu Anda memiliki kemampuan untuk menetapkan fungsi ke variabel. Ini adalah salah satu fitur CodeGolf yang lebih berguna.

Ini berarti bukannya:

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

Kamu bisa melakukan ini:

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

Tapi tunggu, Lua memungkinkan sejumlah OOP. Jadi, Anda bahkan berpotensi melakukan:

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

Itu akan bekerja juga dan memotong karakter.

Sekarang inilah bagian yang aneh. Anda bahkan tidak perlu menetapkan string di titik mana pun. Cukup melakukan:

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

Akan bekerja.


Agar Anda dapat melihat perbedaannya secara visual, lihat hasil golf ini:

Menggunakan string.sub (88 karakter)

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

Menetapkan string.sub ke variabel (65 karakter)

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

Menetapkan string.sub menggunakan pendekatan OOP (64 karakter)

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

Menetapkan string.sub menggunakan pendekatan .. nil? (60 karakter)

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

Jika seseorang tahu mengapa ini berhasil, saya akan tertarik.

Skyl3r
sumber
Baris "z.rep" melanggar saya. Saya bertaruh harus ada az = '' di suatu tempat? Varian yang lebih pendek dari z = '' z.rep hanya akan menjadi ('') .rep. Anda juga dapat menggunakan cmdline ... untuk membaca input, dan menuliskan bytecount ke 57 sebagai berikut: z = '0'untuk i = 1, ... lakukan cetak (z: rep (i-1) .. 1 ..z: rep (...- i)) end
thenumbernine
Saya menemukan seseorang yang menyarankan ("") .rep sebelumnya, tetapi saya tidak dapat membuatnya berfungsi. Itu selalu kesalahan keluar. Mungkin penerjemah saya adalah masalahnya di sini. Saya kesulitan menemukan dokumentasi apa pun pada input baris perintah ini, apakah Anda tahu di mana itu dapat ditemukan?
Skyl3r
6

Python 3, 48

Disimpan 1 byte berkat sp3000.

Saya suka tantangan yang bisa saya selesaikan dalam satu baris. Cukup sederhana, buat garis dari 1 dan 0 sama dengan panjang int yang dilewatkan. Output sebagai array 2d. Jika Anda membungkus bagian setelah: di '\n'.join(), itu akan cukup mencetaknya.

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

C, 59 atau 59 56 atau 56

Dua versi dengan panjang yang identik.

3 byte disimpan karena saran dari anatolyg: (n+1)->~n

Berganti idari n*n-1nol. Mencetak 1 jika i% (n + 1) adalah nol, jika tidak, maka 0. Mencetak baris baru jika i%n= 0 jika tidak spasi.

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
sumber
1
n+1terlalu membosankan. Gunakan ~nsebagai gantinya!
anatolyg
Terima kasih! Saya seharusnya melihat itu, karena itu terjadi pada saya ketika saya melihat tantangan NBZ hari ini.
Level River St
Saya tidak terlalu akrab dengan C. Apa fungsinya i;?
Cyoce
@Cyoce i;hanya mendeklarasikan variabel i. Dalam C Anda selalu harus mendeklarasikan variabel sebelum menggunakannya, menunjukkan tipe sehingga kompiler tahu berapa banyak memori yang dialokasikan. Dengan kompiler GCC, jika Anda tidak menentukan tipe yang diasumsikan int.
Level River St
1
Anda dapat melepas 1 byte lagi dari yang kedua, karena tab diperbolehkan, Anda dapat mengganti 32, dengan 9.
Bijan
5

Mata, 4 byte

I(3)

Keluaran

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

Mata adalah bahasa pemrograman matriks yang tersedia dalam paket statistik Stata. I (n) membuat matriks identitas dengan ukuran n * n

Tamu0101
sumber
5
Selamat datang di Programming Puzzles dan Code Golf Stack Exchange. Ini jawaban yang bagus; (ab) penggunaan bawaan sangat bagus untuk bermain golf. Saya perhatikan bahwa jawaban Anda sebenarnya 1 byte:, Idan 3 byte lainnya hanya memanggil fungsi. Itu akan membuat jawaban Anda salah satu yang terendah pada tantangan ini! :-)
wizzwizz4
4

Pyth, 8 byte

mmsqdkQQ

Coba di sini .

lirtosiast
sumber
1
Saya harus mengatakan, itu sangat tidak biasa bahwa jawaban Pyth adalah empat kali lebih lama dari jawaban terpendek ...
ETHproduksi
Hrm, ini adalah yang terbaik yang saya bisa dapatkan yang terlihat 100% valid, tapi saya menemukan qRRQQyang tampaknya berfungsi kecuali Anda dapatkan Truedan Falsebukannya 1dan 0, namun memperbaiki afaik ini membutuhkan menggunakan tiga byte sMMyang tidak membantu ...
FryAmTheEggman
@FryAmTheEggman Saya juga menemukan qRRQQ. Saya sudah mencoba sejumlah program lain, dan tidak ada yang lebih pendek.
lirtosiast
4

Python 3.5 dengan NumPy - 57 49 30 byte

import numpy
numpy.identity

NumPy.identity mengambil integer, n, dan mengembalikan sebuah matriks identitas n. Jawaban ini diizinkan melalui kebijakan ini .

linkian209
sumber
4
Sebenarnya saya percaya import numpy\nnumpy.identityadalah jawaban yang sah .
FryAmTheEggman
Terima kasih atas tipnya @MorganThrapp! Dan @FryAmTheEggman, maksud Anda, jawaban saya mungkin import numpy\nnumpy.identity()30 byte?
linkian209
Saya jadi sangat bingung oleh \ nnumpy lol ... Ini juga valid, @FryAmTheEggman, bukan? from numpy import identity. 26 byte.
Ogaday
Juga, lihat jawaban saya yang serupa
Ogaday
@Ogaday Saya tidak berpikir itu benar, baris yang Anda berikan tidak mengevaluasi ke suatu fungsi. Anda perlu melakukan from numpy import identidy\nidentity(dalam hal ini akan lebih pendek untuk digunakan *daripada builtin spesifik)
FryAmTheEggman
4

Mathematica, 35 Bytes

tanpa menggunakan IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&
A Simmons
sumber
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
sumber
4

Japt, 14 12 10 byte

Uo £Z®¥X|0

Uji secara online! Catatan: versi ini memiliki beberapa byte tambahan untuk mencetak keluaran dengan cantik.

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
Produksi ETH
sumber
4

Brain-Flak , 206 170 162 byte

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

Cobalah online!

Wisaya Gandum
sumber
3

K, 7 byte

t=\:t:!

Ambil produk persamaan silang dari dua vektor yang mengandung [0, n).

Beraksi:

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

Java, 60 byte

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

Membuat array 2D dan menggantikan elemen dengan baris dan kolom yang sama dengan 1.

TNT
sumber
Anda tidak perlu menambahkan tanda titik koma ke byte-count untuk Java lambda jawaban.
Kevin Cruijssen
3

CJam, 7 byte

{,_ff=}

Ini adalah blok kode yang mengeluarkan bilangan bulat dari tumpukan dan mendorong array 2D sebagai imbalannya.

Cobalah online!

Dennis
sumber
3

Mathematica, 14 byte

IdentityMatrix

Kasus cobaan

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

Perl, 39 33 byte

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

Terima kasih kepada Ton Hospel untuk menghemat 6 byte

Berlari dengan -Eperlrun:

$ echo 3 | perl -E'@%=1..<>;$a=$_,say map{$a==$_|0}@%for@%'
100
010
001
andlrc
sumber
Bermain golf lebih banyak: /$/,say map$`==$_|0,@%for@%=1..<>atau bahkan lebih baik //,say map$'==$_|0,@%for@%=1..<>tetapi Anda tidak bisa lagi menuliskannya dalam satu tanda kutip
Ton Hospel
@TonHospel Wow itu keren, terima kasih. Nantinya akan membutuhkan penggunaan printalih-alih mengatakan, karena -Ehanya gratis di baris perintah.
andlrc