항등 행렬 구성


43

도전은 매우 간단합니다. 정수 입력이 주어지면 항등 행렬을 n출력합니다 n x n. 항등 행렬은 1왼쪽 상단에서 오른쪽 하단에 걸쳐 있습니다. 생성 한 항등 표를 반환하거나 출력하는 프로그램이나 함수를 작성합니다. 출력은 2D 배열이거나 공백 / 탭과 줄 바꿈으로 구분 된 숫자 일 수 있습니다.

입력 및 출력 예

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.

이것은 이므로 바이트 단위의 가장 짧은 코드가 이깁니다.


1
정수 입력이 주어지면 ... ... 나는 자연수를 의미한다고 가정합니까?
Jonathan Frech

답변:


26

MATL, 2 바이트

Xy

내 옥타브 답변의 번역.

온라인으로 사용해보십시오.

내장되지 않은 4 바이트 버전 (Luis Mendo 덕분에) :

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

7
이 매우 복잡한 코드를 번역하는 것은 어려웠을 것입니다 : D
flawr

11
@flawr 당신은 모른다. 이것은 정말로 내 걸작입니다.
스파게티


1
이제 왜 당신이 묻는 지 알 겠어요! :-D
Luis Mendo

5
내장없이 ::t!=
루이스 멘도

20

TI-BASIC, 2 바이트

identity(Ans

재미있는 사실 : 목록을 얻는 가장 짧은 방법 {N,N}dim(identity(N입니다.

8 바이트 단위로 내장되지 않은 가장 짧은 방법은 다음과 같습니다.

randM(Ans,Ans)^0

randM(-9에서 9 사이의 정수를 모두 포함하는 임의 행렬을 만듭니다 (이것은 이상하게 들립니다). 그런 다음이 행렬을 0 제곱으로 만듭니다.


1
" TI-BASIC이 이상 하기 때문에 특이하게 들립니다 . O_o
Doorknob

당근 빠따 지. TI-BASIC. +1
bearacuda13.

목록을 얻을 수있는 가장 짧은 방법이 아니다 {N,N}음은 {N,N}?
Cyoce

1
@Cyoce No; dim(그리고 identity(TI-BASIC이 토큰 화되어 있기 때문에 각각의 바이트입니다.
lirtosiast

19

줄리아, 9 3 바이트

eye

이것은 정수를 받아들이고 (즉, 2D 배열)을 n반환하는 내장 함수 일뿐 nxn Array{Float64,2}입니다. 처럼 부르십시오 eye(n).

이 정책에 따라이 양식을 제출할 수 있습니다.


난 당신이 무슨 짓을했는지 참조! 좋은 것!
Ismael Miguel

이것은 또한 Math.JS
ATaco


14

옥타브, 10 4 바이트

@eye

숫자를 취하고 n항등 행렬을 반환하는 익명 함수를 반환합니다.


@eye충분하다.
flawr

@flawr 고마워, 나는 그렇게 할 수있는 방법이 있다는 것을 알았지 만 항상 잊어 버린다 : P
스파게티

eye로트 / 일부 숫자 지향 언어로 항등 행렬을 생성합니다.
flawr

무엇을 @합니까?
Cyoce

@Cyoce @는 "함수 핸들 연산자"이며 a처럼 작동 lambda하며 특정 함수에 대한 참조로도 사용됩니다. 예를 들어, @(x)x.^2제곱 함수 @sqrt이고 제곱근 함수에 대한 참조입니다. 이에 대한 자세한 내용은 여기
Giuseppe


11

파이썬 2, 42 바이트

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

익명 함수는 다음과 같은 출력을 생성합니다 [(1, 0, 0), (0, 1, 0), (0, 0, 1)].

첫째, 목록을 만들고 ([1]+[0]*n)*n,하는 n=3등의 모습

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

zip / iter 트릭 zip(*[iter(_)]*n 을 사용하여 n제공 그룹 만들기

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

(가) 있습니다 1단위 행렬을주고 나중에마다 하나 개의 인덱스가 제공됩니다. 그러나 0으로 끝나는 행이 추가되어 [:n]있습니다.


1
우편 번호 / iter 트릭은 독창적입니다
20 분 58 초 참조

10

젤리, 4 바이트

R=€R

내장을 사용하지 않습니다. 온라인으로 사용해보십시오!

작동 원리

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
이 코드는 너무 길다.
flawr

5
@flawr 가장 짧은 길이의 두 배입니다. 그것은 실제로 특이한 만남입니다.
Rainer P.

1
@flawr 예, J 보다 짧지 않습니다 . 불합격!
Adám

2
젤리의 현대 버전에서는 두 바이트, 그리고 긴 답변의 재미를합니다.
Lynn

@Lynn 그것은 여전히 가장 짧은 것의 두 배입니다.
Adám

10

J, 4 바이트

=@i.

정수를 취하고 행렬을 반환하는 함수입니다.


나는 당신이 3시에 그것을 할 수 있다고 생각합니다=i.
Sam Elliott

@SamElliott 작동하지 않습니다. 예를 들어 (=i.) 10=>0 0 0 0 0 0 0 0 0 0
Cyoce

9

하스켈, 43 37 바이트

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

꽤 간단하지만, (많은 사람들이 한 것처럼 이미이 기능이 내장 된 언어없이) 더 잘 할 수 있다고 생각합니다.

편집 : Ørjan Johansen 덕분에 약간의 바이트가 떨어졌습니다.


7
당신은 fromEnumas 를 속일 수 있습니다 sum[1|x==y].
xnor

꽤 공간을 제거 할 수 있습니다 fromEnum (y==x)
Cyoce

@xnor 1 바이트보다 짧은 바이트 : 0^abs(x-y).
Ørjan Johansen

1
@ xnor 오, 당신은 0^(x-y)^2더 짧은 다른 대답으로 자신을 사용 했습니다.
Ørjan Johansen

@ ØrjanJohansen 네, 귀하의 의견을 보는 것은 좋은 타이밍이었습니다 :)
xnor

8

Pyth, 7 바이트

XRm0Q1Q

온라인으로 사용해보십시오 : 데모

0의 행렬을 만들고 대각선 요소를 1로 바꿉니다.


마지막을 제거하여 1 바이트를 절약 할 수 있습니다Q
Jim

1
@ Jim 감사합니다, 그러나 실제로는 허용되지 않습니다. 챌린지가 게시 된 후 기능 (끝의 암시 적 Q)이 구현되었습니다.
Jakube

7

자바 스크립트 ES6, 68 62 52 바이트

@Neil의 깔끔한 트릭 덕분에 10 바이트 절약

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

@ Cᴏɴᴏʀ O'Bʀɪᴇɴ와 다른 접근법을 시도합니다. 아마도 개선 될 수있었습니다.


이것은 내가 당신이 저를 때렸다는 것을 알기 위해 아래로 스크롤하기 전에 쓴 것입니다.
Neil

따라서 귀하의 도전에 부응하여 x=>[...Array(x)].map((_,y,x)=>x.map((_,z)=>+(y==z)))10 바이트를 절약 할 수있는 확실한 것을 뒷받침 합니다.
Neil

@ 닐 감사합니다! 답이 당신의 트릭이라고 언급하겠습니다.
ETHproductions

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

7

망막 , 25

추가 골프는 @randomra와 @Martin에게 감사드립니다.

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

온라인으로 사용해보십시오.

이 입력은 단항으로 입력됩니다. 이것이 허용되지 않으면 다음과 같이 십진수 입력이 주어질 수 있습니다.

망막, 34

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

온라인으로 사용해보십시오.


3
우와 Retina는 정규식 이상의 언어로 강력 해지고 있습니다.
ETHproductions

@ETHproductions 예, 거의 모든 정규식 대체 답변입니다. 유일한 특별한 것은 $*0숫자 n을 n으로 대체하는 것입니다 0.
Digital Trauma

6

하스켈, 54 바이트

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

f입력 n에 대한 항등 행렬을 반환합니다. 최적에서 멀다.


map호출 대신 목록 이해를 사용하여 소수의 바이트를 저장할 수 있습니다 .
MathematicalOrchid

6

루아, 77 75 65 바이트

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

글쎄, 루아가 두 기간의 연결로이 언어에 가장 적합한 언어인지 확실하지 않습니다 ...하지만 이봐. 개선이 있는지 살펴 보겠습니다.

편집하다:

나는 다소 이상한 것을 발견했을 때 우연히 무언가를 알아 냈지만 작동합니다.

루아에서는 모든 사람이 함수를 변수에 할당 할 수 있다는 것을 알고 있습니다. 이것은 더 유용한 CodeGolf 기능 중 하나입니다.

이것은 다음 대신을 의미합니다.

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

당신은 이것을 할 수 있습니다 :

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

그러나 루아는 약간의 OOP를 허용합니다. 따라서 잠재적으로 다음을 수행 할 수 있습니다.

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

그것은 잘 작동하고 캐릭터를 자릅니다.

이제 이상한 부분이 온다. 어떤 시점에서도 문자열을 할당 할 필요가 없습니다. 단순히하기 :

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

작동합니다.


따라서 차이점을 시각적으로 볼 수 있으며 골프 결과를 살펴보십시오.

string.sub 사용 (88 자)

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

string.sub를 변수에 할당 (65 자)

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

OOP 접근 방식을 사용하여 string.sub 할당 (64 자)

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

nil 접근 방식을 사용하여 string.sub를 할당 하시겠습니까? (60 자)

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

이것이 왜 작동하는지 누군가가 알고 있다면 관심이 있습니다.


"z.rep"줄이 깨졌습니다. 어딘가에 az =``가 있어야한다고 내기하고 있습니까? z = ''z.rep의 짧은 변형은 ( '') .rep 일뿐입니다. cmdline ...을 사용하여 입력을 읽고 다음과 같이 바이트 수를 57까지 낮출 수 있습니다. ..z : 담당자 (...- I)) 끝
thenumbernine

전에 ( "") .rep을 제안하는 사람을 찾았지만 제대로 작동하지 못했습니다. 항상 오류가 발생합니다. 어쩌면 내 통역사가 문제가 될 수 있습니다. 이 명령 행 입력에 대한 문서를 찾는 데 어려움을 겪고 있습니다. 어떻게 찾을 수 있는지 알고 있습니까?
Skyl3r

6

파이썬 3, 48

sp3000 덕분에 1 바이트가 절약되었습니다.

한 줄로 해결할 수있는 과제를 좋아합니다. 아주 간단합니다. 전달 된 int의 길이와 동일한 1과 0으로 라인을 만듭니다. 2d 배열로 출력합니다. : in 다음 부분을 감싸면 '\n'.join()꽤 인쇄됩니다.

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

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

5

C, 59 또는 59 56 또는 56

동일한 길이의 두 가지 버전.

anatolyg의 제안으로 인해 3 바이트가 절약되었습니다 (n+1).->~n

0 i에서 반복 n*n-1합니다. i % (n + 1)이 0이면 1을 인쇄하고, 그렇지 않으면 0을 인쇄합니다 i%n. 그렇지 않으면 = 0이면 개행을 인쇄합니다 .

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너무 둔하다. ~n대신 사용하십시오 !
anatolyg

감사! 나는 오늘 NBZ의 도전을 볼 때 그것이 나에게 일어났기 때문에 그 점을 발견했을 것입니다.
Level River St

나는 C에 익숙하지 않다. 무엇을 i;하는가?
Cyoce

@Cyoce i;는 변수를 선언합니다 i. C에서는 변수를 사용하기 전에 항상 변수를 선언해야 유형을 표시하여 컴파일러가 할당 할 메모리 양을 알 수 있습니다. GCC 컴파일러를 사용하면 유형을 지정하지 않으면로 간주됩니다 int.
Level River St

1
탭이 허용되므로 32를 9로 바꿀 수 있습니다.
Bijan

5

마타, 4 바이트

I(3)

산출

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

Mata는 Stata 통계 패키지에서 사용 가능한 매트릭스 프로그래밍 언어입니다. I (n)은 n * n 크기의 항등 행렬을 만듭니다.


5
프로그래밍 퍼즐 및 코드 골프 스택 교환에 오신 것을 환영합니다. 이것은 좋은 대답입니다. (ab) 내장 사용은 골프에 좋습니다. 귀하의 답변이 실제로 1 바이트 : I이고 다른 3 바이트가 함수를 호출하는 것으로 나타났습니다 . 그것은 당신의 대답이이 도전에서 가장 낮은 것 중 하나가 될 것입니다! :-)
wizzwizz4


4

Pyth, 8 바이트

mmsqdkQQ

여기서 사용해보십시오 .


1
Pyth 답변이 가장 짧은 답변보다 4 배 더 길다 는 것은 매우 드문 일입니다 ...
ETHproductions

HRM,이 내가 100 % 유효 그 모습을 얻을 수 있었다 최고였다, 그러나 나는 발견했다 qRRQQ당신이 얻을 제외하고 작동하는 것 같다 TrueFalse대신 1하고 0, 그러나이 AFAIK를 해결하기 위해 3 바이트 사용해야합니다 sMM도움이되지 않는를 ...
FryAmTheEggman

@FryAmTheEggman 또한 qRRQQ를 찾았습니다. 나는 다른 많은 프로그램을 시도했지만 더 짧은 프로그램은 없었습니다.
lirtosiast

4

파이썬 NumPy와 3.5 - 57 49 30 바이트

import numpy
numpy.identity

NumPy.identity는 정수 n을 취하여 n x n 개의 행렬을 반환합니다. 이 답변은 이 정책을 통해 허용됩니다 .


4
사실 저는 믿습니다 import numpy\nnumpy.identityA는 합법적 인 대답은 .
FryAmTheEggman

팁 @MorganThrapp에 감사드립니다! 그리고 @FryAmTheEggman, 당신은 내 대답 import numpy\nnumpy.identity()이 30 바이트 일 수 있다는 것을 의미 합니까?
linkian209

나는 \ nnumpy lol에 너무 혼란스러워 ... 이것은 또한 유효합니다, @FryAmTheEggman, 아니? from numpy import identity. 26 바이트
Ogaday

또한, 내 대답이 비슷한
Ogaday

@Ogaday 나는 그것이 옳지 않다고 생각합니다. 주어진 줄이 함수로 평가되지 않습니다. 당신은해야 할 것입니다 from numpy import identidy\nidentity(이 경우 *특정 내장 대신 사용 하는 것이 더 짧을 것입니다)
FryAmTheEggman

4

매스 매 티카, 35 바이트

IdentityMatrix를 사용하지 않고

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

4

자바 스크립트, 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 바이트

Uo £Z®¥X|0

온라인으로 테스트하십시오! 참고 :이 버전에는 출력을 예쁘게 인쇄하기 위해 몇 바이트가 더 있습니다.

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 바이트

t=\:t:!

[0, 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

자바, 60 바이트

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

2D 배열을 만들고 행과 열이 같은 요소를 바꿉니다 1.


Java 람다 응답의 바이트 수에 후미 세미콜론을 추가하지 않아도됩니다.
Kevin Cruijssen 2016 년


3

수학, 14 바이트

IdentityMatrix

테스트 사례

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

3

펄, 39 33 바이트

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

Ton Hospel 덕분에6 바이트를 절약 한 에게 합니다

-Eperlrun으로 실행 :

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

조금 더 골프 : /$/,say map$`==$_|0,@%for@%=1..<>또는 더 나은 //,say map$'==$_|0,@%for@%=1..<>하지만 더 이상 작은 따옴표로 넣을 수 없습니다
톤 호 s

@TonHospel 와우 감사합니다. 후자는 커맨드 라인에서만 무료 print이기 때문에 대신 에 대신 사용해야 -E합니다.
andlrc
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.