Xây dựng ma trận danh tính


43

Thử thách rất đơn giản. Cho một đầu vào số nguyên n, đầu ra n x nma trận danh tính. Ma trận danh tính là một ma trận có 1s kéo dài từ trên cùng bên trái xuống dưới cùng bên phải. Bạn sẽ viết một chương trình hoặc một hàm sẽ trả về hoặc xuất ra ma trận danh tính mà bạn đã xây dựng. Đầu ra của bạn có thể là một mảng 2D hoặc các số được phân tách bằng dấu cách / tab và dòng mới.

Ví dụ đầu vào và đầu ra

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.

Đây là , vì vậy mã ngắn nhất tính bằng byte sẽ thắng.


1
Cho một đầu vào số nguyên n ... - Tôi giả sử bạn có nghĩa là một số tự nhiên?
Jonathan Frech

Câu trả lời:


26

MATL, 2 byte

Xy

Một bản dịch của câu trả lời Octave của tôi.

Hãy thử trực tuyến.

Phiên bản 4 byte không tích hợp sẵn (nhờ Luis Mendo):

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

7
Chắc là rất khó, để dịch mã rất tinh vi này: D
flawr

11
@flawr Bạn không có ý kiến ​​gì. Đây thực sự là kiệt tác của tôi.
một spaghetto


1
Bây giờ tôi hiểu tại sao bạn hỏi! :-D
Luis Mendo

5
Không có nội dung::t!=
Luis Mendo

20

TI-BASIC, 2 byte

identity(Ans

Sự thật thú vị: Cách ngắn nhất để có được một danh sách {N,N}dim(identity(N.

Đây là cách ngắn nhất mà không có nội dung, trong 8 byte:

randM(Ans,Ans)^0

randM(tạo một ma trận ngẫu nhiên với các mục nhập bao gồm tất cả các số nguyên nằm trong khoảng từ -9 đến 9 (nghe có vẻ cụ thể vì nó là). Chúng tôi sau đó đưa ma trận này đến sức mạnh thứ 0.


1
" Nghe có vẻ kỳ quặc bởi vì nó là " TI-BASIC thật kỳ lạ. O_o
Doorknob

Đồng ý luôn. TI-CƠ BẢN. +1
bearacuda13

không phải là cách ngắn nhất để có được một danh sách {N,N}, umm , {N,N}?
Cyoce

1
@Cyoce Không; dim(identity(mỗi một byte vì TI-BASIC được token hóa.
lirtosiast

19

Julia, 9 3 byte

eye

Đây chỉ là một hàm dựng sẵn chấp nhận một số nguyên nvà trả về một nxn Array{Float64,2}(tức là một mảng 2D). Gọi nó như thế eye(n).

Lưu ý rằng các bài nộp của mẫu này được chấp nhận theo chính sách này .


Tôi thấy những gì bạn đã làm ở đó! Đẹp quá
Ismael Miguel

Điều này cũng hoạt động trong Math.JS
ATaco

16

APL, 5 byte

∘.=⍨⍳

Đây là một hàm chức năng đơn âm chấp nhận một số nguyên ở bên phải và trả về ma trận danh tính.

Hãy thử nó ở đây


14

Octave, 10 4 byte

@eye

Trả về một hàm ẩn danh lấy một số nvà trả về ma trận danh tính.


@eyelà đủ.
flawr

@flawr Cảm ơn, tôi biết có một cách để làm điều đó nhưng tôi luôn quên: P
một spaghetto

eyetạo ra ma trận danh tính trong rất nhiều / một số ngôn ngữ định hướng số.
flawr

Làm gì @?
Cyoce

@Cyoce @là "toán tử xử lý hàm", nó hoạt động như một lambdavà cũng như một tham chiếu đến một hàm cụ thể, ví dụ, @(x)x.^2là hàm bình phương và @sqrtlà một tham chiếu đến hàm căn bậc hai. Bạn có thể đọc thêm về điều đó ở đây
Giuseppe

12

R, 4 byte

diag

Khi được cung cấp một ma trận, diagtrả về đường chéo của ma trận. Tuy nhiên, khi được cung cấp một số nguyên n, diag(n)trả về ma trận danh tính.

Dùng thử trực tuyến


11

Python 2, 42 byte

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

Một hàm ẩn danh, tạo đầu ra như [(1, 0, 0), (0, 1, 0), (0, 0, 1)],

Đầu tiên, tạo danh sách ([1]+[0]*n)*n, n=3trông giống như

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

Sử dụng thủ thuật zip / iter zip(*[iter(_)]*n để tạo các nhóm ncho

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

Lưu ý rằng 1một chỉ số đến sau mỗi lần, đưa ra ma trận danh tính. Nhưng, có thêm một hàng hoàn toàn bằng không, được loại bỏ bằng [:n].


1
Chết tiệt, thủ thuật zip / iter thật tài tình
xem

10

Thạch, 4 byte

R=€R

Không sử dụng tích hợp. Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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
Mã này dài không được chấp nhận.
flawr

5
@flawr Hai lần chiều dài của cái ngắn nhất. Đó thực sự là một cuộc gặp gỡ bất thường.
Rainer P.

1
@flawr Vâng, và không có ngắn hơn so với J . THẤT ​​BẠI!
Adám

2
Trong các phiên bản hiện đại của Jelly, là hai byte tạo ra niềm vui cho các câu trả lời dài hơn.
Lynn

@Lynn Điều đó vẫn dài gấp đôi so với một giây ngắn nhất.
Adám

10

J, 4 byte

=@i.

Đây là một hàm lấy một số nguyên và trả về ma trận.


Tôi nghĩ bạn có thể làm điều đó trong 3:=i.
Sam Elliott

@SamElliott không hoạt động. Ví dụ: (=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]]

Khá đơn giản, mặc dù tôi nghĩ rằng người ta có thể làm tốt hơn (không có ngôn ngữ đã được tích hợp chức năng này, như nhiều người đã làm).

Chỉnh sửa: giảm một số byte nhờ rjan Johansen


7
Bạn có thể gian lận fromEnumnhư sum[1|x==y].
xnor

khá chắc chắn rằng bạn có thể xóa không gian trongfromEnum (y==x)
Cyoce

@xnor Một byte ngắn hơn đó : 0^abs(x-y).
Ørjan Johansen

1
@xnor ơi, bạn vừa dùng 0^(x-y)^2chính mình trong một câu trả lời khác, thậm chí còn ngắn hơn.
Ørjan Johansen

@ RjanJohansen Vâng, thấy nhận xét của bạn là thời điểm tốt đẹp :)
xnor

8

Bình thường, 7 byte

XRm0Q1Q

Dùng thử trực tuyến: Trình diễn

Tạo một ma trận các số không và thay thế các phần tử đường chéo bằng các phần tử.


Bạn có thể lưu một byte bằng cách xóa trận chung kếtQ
Jim

1
@jim Cảm ơn, nhưng điều đó thực sự sẽ không được phép. Tính năng (ẩn Q ở cuối) đã được triển khai sau khi thử thách được đăng.
Jakube

7

JavaScript ES6, 68 62 52 byte

Đã lưu 10 byte nhờ một thủ thuật gọn gàng từ @Neil

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

Thử một cách tiếp cận khác với @ Cᴏɴᴏʀ O'Bʀɪᴇɴ's. Có thể có thể được cải thiện.


Đây chính xác là những gì tôi đã viết trước khi tôi cuộn xuống và phát hiện ra rằng bạn đã đánh bại tôi với nó.
Neil

Vì vậy, để đối phó với thử thách của bạn, tôi cung cấp cho bạn (rõ ràng) x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))để tiết kiệm 10 byte.
Neil

@Neil Cảm ơn rất nhiều! Tôi sẽ đề cập rằng đó là mẹo của bạn trong câu trả lời.
Sản phẩm điện tử

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

7

Võng mạc , 25

Tín dụng cho @randomra và @Martin để chơi gôn thêm.

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

Hãy thử trực tuyến.

Lưu ý điều này có đầu vào là một unary. Nếu điều này không được chấp nhận, thì đầu vào thập phân có thể được cung cấp như sau:

Võng mạc, 34

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

Hãy thử trực tuyến.


3
... Whoa. Retina đang trở nên mạnh mẽ như một ngôn ngữ cho nhiều hơn regex.
Sản phẩm điện tử

@ETHproductions có, mặc dù đây là câu trả lời khá nhiều thay thế regex. Điều đặc biệt duy nhất là việc sử dụng $*0để thay thế một số n bằng n 0s.
Chấn thương kỹ thuật số

6

Haskell, 54 byte

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

ftrả về ma trận danh tính cho đầu vào n. Xa tối ưu.


Bạn có thể lưu một số byte bằng cách hiểu danh sách thay vì mapcuộc gọi.
Toán học,

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

Chà, tôi không chắc lua có phải là ngôn ngữ tốt nhất cho việc này với sự kết hợp hai giai đoạn không ... Nhưng này, có một phát súng vào nó. Tôi sẽ xem nếu có bất kỳ cải tiến sẽ được thực hiện.

BIÊN TẬP:

Tôi đã tìm ra một cái gì đó tình cờ mà tôi thấy khá kỳ lạ, nhưng, nó hoạt động.

Trong Lua, mọi người đều biết bạn có khả năng gán các hàm cho các biến. Đây là một trong những tính năng hữu ích của CodeGolf.

Điều này có nghĩa thay vì:

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

Bạn có thể làm được việc này:

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

Nhưng chờ đã, Lua cho phép một số lượng OOP. Vì vậy, bạn thậm chí có thể làm:

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

Điều đó sẽ làm việc tốt và cắt giảm nhân vật.

Bây giờ đến phần kỳ lạ. Bạn thậm chí không cần phải gán một chuỗi tại bất kỳ điểm nào. Đơn giản chỉ cần làm:

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

Sẽ làm việc.


Vì vậy, bạn có thể thấy sự khác biệt một cách trực quan, hãy xem kết quả đánh gôn của điều này:

Sử dụng chuỗi.sub (88 ký tự)

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

Gán chuỗi.sub cho một biến (65 ký tự)

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

Chỉ định chuỗi.sub bằng cách sử dụng phương pháp OOP (64 ký tự)

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

Chỉ định chuỗi.sub bằng cách sử dụng phương pháp .. không? (60 ký tự)

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

Nếu ai đó biết tại sao điều này hoạt động, tôi sẽ quan tâm.


Dòng "z.rep" đang phá vỡ của tôi. Tôi đang cá cược nên có az = '' ở đâu đó? Một biến thể ngắn hơn của z = '' z.rep sẽ chỉ là ('') .rep. Bạn cũng có thể sử dụng cmdline ... để đọc đầu vào và đánh lừa số lượng giảm xuống còn 57 như sau: z = '0'for i = 1, ... hãy in (z: rep (i-1) .. 1 ..z: rep (...- i)) kết thúc
thenumbernine

Tôi đã tìm thấy ai đó đề xuất ("") .rep trước đây, nhưng tôi không thể làm cho nó hoạt động. Nó luôn luôn lỗi. Có lẽ thông dịch viên của tôi là vấn đề ở đây. Tôi đang vật lộn để tìm bất kỳ tài liệu nào về đầu vào dòng lệnh này, bạn có biết nó có thể được tìm thấy ở đâu không?
Skyl3r

6

Trăn 3, 48

Đã lưu 1 byte nhờ sp3000.

Tôi thích những thách thức tôi có thể giải quyết trong một dòng. Khá đơn giản, xây dựng một dòng trong số 1 và 0 bằng với độ dài của int được truyền vào. Kết quả là một mảng 2d. Nếu bạn bọc phần sau: in '\n'.join(), nó sẽ in đẹp.

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

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

5

C, 59 hoặc 59 56 hoặc 56

Hai phiên bản có chiều dài giống hệt nhau.

3 byte được lưu do đề xuất từ ​​anatolyg: (n+1)->~n

Lặp lại itừ n*n-1không. In 1 nếu i% (n + 1) bằng 0, ngược lại 0. Sau đó in một dòng mới if i%n= 0 nếu không là khoảng trắng.

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+1quá buồn tẻ Sử dụng ~nthay thế!
anatolyg

Cảm ơn! Tôi nên đã phát hiện ra điều đó, bởi vì nó xảy ra với tôi khi tôi nhìn vào thử thách của NBZ ngày hôm nay.
Cấp sông St

Tôi không quá quen thuộc với C. Làm gì i;?
Cyoce

@Cyoce i;chỉ khai báo biến i. Trong C, bạn luôn phải khai báo một biến trước khi sử dụng nó, chỉ ra loại để trình biên dịch biết cần phân bổ bao nhiêu bộ nhớ. Với trình biên dịch GCC, nếu bạn không chỉ định loại thì nó được giả sử là int.
Cấp sông St

1
Bạn có thể lấy thêm 1 byte của cái thứ hai, vì các tab được cho phép, bạn có thể thay thế 32, bằng 9.
Bijan

5

Mata, 4 byte

I(3)

Đầu ra

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

Mata là ngôn ngữ lập trình ma trận có sẵn trong gói thống kê Stata. I (n) tạo ma trận danh tính có kích thước n * n


5
Chào mừng bạn đến với Câu đố lập trình và trao đổi mã Golf. Đây là một câu trả lời tốt; (ab) sử dụng tích hợp rất tốt cho việc chơi gôn. Tôi nhận thấy rằng câu trả lời của bạn thực sự là 1 byte : I, và 3 byte còn lại chỉ đang gọi hàm. Điều đó sẽ làm cho câu trả lời của bạn trở thành một trong những điểm thấp nhất trong thử thách này! :-)
wizzwizz4


4

Bình thường, 8 byte

mmsqdkQQ

Hãy thử nó ở đây .


1
Tôi phải nói rằng, thật bất thường khi câu trả lời của Pyth dài hơn bốn lần so với câu trả lời ngắn nhất ...
Sản phẩm ETH

Hrm, đây là cách tốt nhất tôi có thể có được trông có vẻ hợp lệ 100%, nhưng tôi đã tìm thấy qRRQQcái nào có vẻ hoạt động trừ khi bạn nhận được TrueFalsethay vì 10, tuy nhiên, việc khắc phục afaik này yêu cầu sử dụng ba byte sMMmà không giúp ...
FryAmTheEggman

@FryAmTheEggman Tôi cũng tìm thấy qRRQQ. Tôi đã thử một số chương trình khác, và không có chương trình nào ngắn hơn.
lirtosiast

4

Python 3.5 với NumPy - 57 49 30 byte

import numpy
numpy.identity

NumPy.identity nhận một số nguyên, n và trả về một ma trận danh tính theo n. Câu trả lời này được cho phép thông qua chính sách này .


4
Thật ra tôi tin import numpy\nnumpy.identitylà một câu trả lời chính đáng .
FryAmTheEggman

Cảm ơn vì tiền boa @MorganThrapp! Và @FryAmTheEggman, ý bạn là câu trả lời của tôi chỉ có thể import numpy\nnumpy.identity()là 30 byte?
linkian209

Tôi đã rất bối rối bởi \ nnumpy lol ... Điều này cũng hợp lệ, @FryAmTheEggman, phải không? from numpy import identity. 26 byte.
Ogaday

Ngoài ra, hãy xem câu trả lời của tôi tương tự
Ogaday

@Ogaday Tôi không nghĩ đó là chính xác, dòng bạn đưa ra không đánh giá chức năng. Bạn sẽ cần phải làm from numpy import identidy\nidentity(trong trường hợp đó sẽ ngắn hơn để sử dụng *thay vì dựng sẵn cụ thể)
FryAmTheEggman

4

Toán học, 35 byte

không sử dụng IdentityMatrix

Table[Boole[i==j],{i,1,#},{j,1,#}]&


4

Japt, 14 12 10 byte

Uo £Z®¥X|0

Kiểm tra nó trực tuyến! Lưu ý: phiên bản này có thêm một vài byte để in ra đầu ra.

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 byte

t=\:t:!

Lấy sản phẩm chéo bằng của hai vectơ chứa [0, n).

Trong hành động:

  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 byte

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

Tạo một mảng 2D và thay thế các phần tử trong đó hàng và cột bằng nhau 1.


Bạn không cần phải thêm dấu chấm phẩy vào số đếm byte cho các câu trả lời lambda của Java.
Kevin Cruijssen


3

Toán học, 14 byte

IdentityMatrix

Trường hợp thử nghiệm

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

3

Perl, 39 33 byte

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

Cảm ơn TonMedel đã lưu 6 byte

Chạy với -Eperlrun:

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

Chơi gôn nhiều hơn một chút: /$/,say map$`==$_|0,@%for@%=1..<>hoặc thậm chí tốt hơn //,say map$'==$_|0,@%for@%=1..<>nhưng như thế bạn không thể đặt nó trong dấu ngoặc đơn nữa
TonMedel

@TonH rửa Wow thật tuyệt, cảm ơn. Cái sau sẽ yêu cầu sử dụng printthay vì nói, vì -Echỉ miễn phí trên dòng lệnh.
andlrc
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.