N 차원 적 정체성“행렬”


30

양의 정수가 주어지면 , 인덱스의 모든 구성 요소가 동일하고 그렇지 않은 배열 인 차원 ID "행렬"을 n출력하십시오 . N-N-N-N-N-by -...을 의미합니다.NN^N10N^N

1 -> [1]

2 -> [[1,0],[0,1]]

3 -> [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,1,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,1]]]

4 -> [[[[1,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,1,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]]],[[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,0]],[[0,0,0,0],[0,0,0,0],[0,0,0,0],[0,0,0,1]]]]

예를 들어,이 a는 IS 4차원의 정체성 "매트릭스", 다음 유일한 항목이 1될 것이다 a[0][0][0][0], a[1][1][1][1], a[2][2][2][2],와 a[3][3][3][3].

이것은 입니다. 바이트 단위의 최단 답변이 이깁니다. 표준 허점이 적용됩니다.



11
여기 MATL 답변이 내장되어 있습니다 ...
caird coinheringaahing

답변:



9

젤리 , 8 바이트

×=¥þ’¡`Ṡ

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

오, @Dennis를 자신의 언어로 다시 outgolf하는 것처럼 보입니다.

이것은 1 인수 함수입니다. 중첩 목록에 대한 Jelly의 기본 출력 형식은 약간 모호하기 때문에 사양을 전체 프로그램으로 충족시키지 못할 수도 있습니다.

설명

×=¥þ’¡`Ṡ
     ¡    Repeatedly apply the following operation,
    ’     {input-1} times in total:
   þ        For each element of the current value {perhaps made into a range}
      `     and of {the range from 1 to the} {input}:
 =            Compare corresponding elements, giving 0 for equal or 1 for unequal
× ¥           then multiply by one of the elements
       Ṡ  then replace each element with its sign

이를 이해하기 위해서는 중간 단계를 살펴 보는 것이 도움이됩니다. 3을 입력하면 다음과 같은 중간 단계가 수행됩니다.

  1. [1,2,3](에 의해 암시 적으로 범위 내에서 입력 þ)
  2. [[1,0,0],[0,2,0],[0,0,3]](로 표를 만들고, [1,2,3]동등성을 비교 [[1,0,0],[0,1,0],[0,0,1]]한 다음 비교 한 값 중 하나를 곱하십시오.)
  3. [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,2,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,3]]] (다시 같은 생각)
  4. [[[1,0,0],[0,0,0],[0,0,0]],[[0,0,0],[0,1,0],[0,0,0]],[[0,0,0],[0,0,0],[0,0,1]]](를 사용하여 각 요소를 부호로 바꿉니다. )

입력이 1 차원으로 시작한다는 것은 입력 -1 차원을 추가하기 위해 (입력 1) 시간을 반복하여 입력 차원 목록을 생성한다는 것을 의미합니다.

재미있는 사실 :이 프로그램에는 연속으로 5 개의 퀵이 포함되어 있습니다 ¥þ’¡`. (빠른 동작을 수정하거나 다른 링크와 결합하는 데 사용되는 "링크"또는 내장의 수정 자입니다.)


젤리에서 데니스를 이겼 기 때문에 +!
Zacharý

7

Mathematica, 30 바이트

Array[Boole@*Equal,#~Table~#]&

1
@FryAmTheEggman 두 번째 인수로 정수 매개 변수 Table가 최근 추가되었습니다. 수학에는 여전히 싱글 톤리스트가 필요합니다 : tio.run/##y00sychMLv7/P83WsagosTLaKT8/…
Martin Ender

1
@FryAmTheEggman Mathics Array[Boole@*Equal,#~Table~{#}]&에서 작동 하도록 변경해야 할 것 같습니다. 이전 버전의 Mathematica는에 대한 두 번째 인수로 정수를 지원하지 않으며 TableMathics가이를 기반으로하는 것 같습니다.
ngenisis

1
@MartinEnder Pinch, poke, 당신은 나에게 콜라를 빚지고 있습니다 :)
ngenisis


5

젤리 , 9 바이트

ðṗE€ṁ+þ’¡

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

작동 원리

작업을 직접 달성하는 것은 어려운 것처럼 보이지만 (나는 방법을 찾지 못했습니다) 동일한 숫자의 배열과 같은 모양의 배열을 구성하는 것은 매우 쉽습니다.

ð체인을 이진으로 만들고 정수 입력 n 은 체인의 왼쪽 및 오른쪽 인수로 사용됩니다. 대신 모나 딕 체인을 사용하는 것이 가능하지만, 2 차원 체인에 대한 구문 분석 규칙은 여기에 3 바이트를 저장합니다 (에 대한 2 개의 계산 후 ð).

직교 전력 원자 좌우 인자가 동일하여, N 길이의 벡터의 모든 어레이를 구성 N 의 요소를 구성하는 [1, ..., N] , 전적으로 정렬.

n = 3 일 때

[[1, 1, 1], [1, 1, 2], [1, 1, 3], [1, 2, 1], [1, 2, 2], [1, 2, 3], [1, 3, 1], [1, 3, 2], [1, 3, 3], [2, 1, 1], [2, 1, 2], [2, 1, 3], [2, 2, 1], [2, 2, 2], [2, 2, 3], [2, 3, 1], [2, 3, 2], [2, 3, 3], [3, 1, 1], [3, 1, 2], [3, 1, 3], [3, 2, 1], [3, 2, 2], [3, 2, 3], [3, 3, 1], [3, 3, 2], [3, 3, 3]]

각각 동일 퀵 링크가 E€어떤지 모든 구성된 벡터의 요소를 테스트한다.

n = 3 일 때

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

3 차원 항등 행렬의 요소 인 평면 배열입니다.

이항 퀵 링크 +þ’¡는 왼쪽 인수와 오른쪽 인수 n으로 호출됩니다 . 빠른 ¡것은 감소 원자를 호출하여 n-1 을 생성 한 다음 추가 테이블 빠른 링크를 n-1 번 호출합니다 .

처음에 인수 는 모두 n 입니다. 각 호출 후 오른쪽 인수는 왼쪽 인수로 바뀌고 왼쪽 인수는 호출의 반환 값으로 바뀝니다.

표는 빠른 부르는 추가 원자 +반환 값의 테이블 / 매트릭스를 구성하는 그 왼쪽 인자의 각 요소와 그 오른쪽 인자의 각 요소에 대한합니다. 초기 정수 인수 n[1, ... n] 범위로 승격됩니다 .

n = 3 일 때 승격 후 첫 반복 전에 두 인수는 모두

[1, 2, 3]

이 배열의 각 정수를이 배열의 각 정수에 추가하면

[[2, 3, 4], [3, 4, 5], [4, 5, 6]]

다음 호출에서이 배열 각각을 [1, 2, 3] 의 정수에 추가합니다 . 덧셈은 벡터화 (배열에 정수를 추가하면 각 요소에 추가)하여

[[[3, 4, 5], [4, 5, 6], [5, 6, 7]],
 [[4, 5, 6], [5, 6, 7], [6, 7, 8]],
 [[5, 6, 7], [6, 7, 8], [7, 8, 9]]]

이 배열은 3 차원 항등 행렬과 같은 모양이지만 올바른 요소는 아닙니다.

마지막으로 금형 원자 는 결과의 정수 항목을 오른쪽으로 버리고 결과를 왼쪽의 요소로 순서대로 바꿉니다.


4

파이썬 , 70 바이트

f=lambda n,l=[]:[f(n,l+[i])for i in(len(l)<n)*range(n)]or+(l==l[:1]*n)

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

재귀 솔루션. 행렬을 1 차원 더 작은 행렬 목록으로 생각하면 해당 목록을 반복하여 트리로 내려갑니다. 이 글은 고른 인덱스를 기억 l하고, 할 때 n인덱스가 포착 한, 우리는 할당 할 1또는 0그들이 모두 동일 여부에 따라.


파이썬 2 , 73 바이트

n=input();r=0
exec'r=eval(`[r]*n`);'*n+('n-=1;r'+'[n]'*n+'=1;')*n
print r

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

0으로 행렬을 만든 다음 대각선에 1을 할당하는 totallyhuman의 방법 이 개선되었습니다 .


파이썬 2 , 88 바이트

n=input()
t=tuple(range(n))
print eval('['*n+'+(i0'+'==i%d'*n%t+')'+'for i%d in t]'*n%t)

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

와 넌센스 eval, 중첩 목록 생성 및 문자열 형식 대체. 평가할 문자열은 다음과 같습니다.

[[[+(i0==i0==i1==i2)for i0 in t]for i1 in t]for i2 in t]

4

Python 2 + NumPy , 80 72 70 바이트

이제 최고의 Python 답변과 연결되었습니다!

from numpy import*
n=input()
a=zeros((n,)*n)
a[[range(n)]*n]=1
print a

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

Andras Deak 덕분에 8 바이트 절약, officialaimm으로 2 개 절약


2
a[[range(n)]*n]=1exec 대신 fancy indexing을 사용 하십시오.
Andras Deak 2016 년

(실제로이 fill_diagonal(a,1)목적이 있지만 1 바이트 더 깁니다)
Andras Deak

1
예쁜 출력의 경우 +1 그리고 i2 바이트를 절약 해야하는 변수 사용을 보지 못했습니다 .
officialaimm

3

파이썬 2 , 99 93 90 바이트

대한로드 덕분에 일부 는 작업도 면도 6 바이트 내려서 더욱 도움이! xnor 덕분에 -3 바이트

n=input()
r=eval(`eval('['*n+'0'+']*n'*n)`)
for i in range(n):exec'r'+`[i]`*n+'=1'
print r

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


1
def/returninput/print(가장 좋은 시나리오에서는 동일 함) 보다 더 나아진 적이 없다면, 93 바이트()('[%d]'%i)줄이면됩니다.
Rod

1
'[%d]'%i의 문자열 담당자가 [i]됩니다.
xnor

2

자바 스크립트 (ES6), 67 바이트

f=(n,d=n-1,i)=>[...Array(n)].map((_,j)=>d?f(n,d-1,j-i?n:j):j-i?0:1)

설명 : i셀이 기본 대각선에 있는지 여부를 추적하는 데 사용됩니다. 처음에 이후의 재귀 호출에 우리는 현재 차원 지수는 이전의 모든 크기와 동일한 경우에 그것을 통과하는 동안 그래서 첫 번째 재귀 호출에 우리가 항상, 첫 번째 차원을 통과 그렇지 않으면 우리의 인덱스 통과, 정의되지 않은 n모든 것을 나타냅니다를 재귀 셀은 0이어야합니다.


2

Brainfuck , 61 바이트

>,[->+>+<<]>[-<<+>>]>-[->+.-<<<<[->+>+<<]>[-<+>]>[->>.<<]>]+.

언 골프

꺾쇠 괄호 뒤의 숫자는 머리가 끝난 셀을 나타냅니다.

>,                   read n to 1
[->+>+<<]            move 1 to 2 and 3
>2[-<<+>>]>3         move 2 to 0 
                     (tape: n 0 0 n 0)
-[                   while cell 3 {
    -                  dec 3
    >4+.-<3            print \x1
    <<<0[->+>+<<]      move 0 to 1 and 2
    >1[-<+>]>2         move 1 to 0
                       (tape: 0 0 n rows_left 0)
    [                  while cell 2 {
        -                dec 2
        >>4.<<           print \x0
    ]>3                }
]                    }
+.                   print \x1

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

입력은 이진수입니다. 출력은 행 주요 순서로 저장된 행렬입니다.


이미 답변에 몇 가지 출력 형식이 있으므로 "일부 표준 매트릭스 표현"만 요구한다고 가정합니다. 특정 형식이어야하는 경우 그에 따라 코드를 수정합니다.
Ray

이 특별한 경우에 행 전공이 열 전공과
Octopus

@Octopus 실제로, 프로그램은 Brainfuck 인터프리터가 작성되는 언어를 기반으로 행 메이저 또는 컬럼 메이저 순서 여야하는지 여부를 결정합니다. 광산은 C로 작성되므로 자연스럽게 매트릭스를 행 메이저 순서로 출력합니다. 그러나 Fortran 또는 MATLAB으로 작성된 인터프리터를 사용하면이를 인식하여 자동으로 열 주요 순서로 전환됩니다. (Brainfuck 자체로 작성된 통역사를 사용하는 경우 텍스트 편집기가 작성된 언어에 따라 모호성을 해결합니다.) :-)
Ray

2

R , 64 49 바이트

Jarko Dubbeldam 덕분에 -15 바이트

x=array(0,rep(n<-scan(),n));x[seq(1,n^n,l=n)]=1;x

stdin에서 읽고 배열을 반환하여 행렬로 인쇄합니다. seq균일하게 이격 시퀀스 생성 1n^n길이 l=n1 초는 어디로 인덱스에 아주 잘 트릭 않습니다.

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

구 버전:

n=scan();x=rep(0,n^n);x=array(x,rep(n,n));x[matrix(1:n,n,n)]=1;x

nstdin에서 읽습니다 . 배열을 반환하고 결과를 행렬로 인쇄합니다. 에 대한 문서를 읽을 때까지 잠시 동안이 문제를 해결했습니다 [. 이는 행렬을 사용하여 배열을 인덱싱하는 데 사용할 수 있음을 나타냅니다. 매트릭스의 각 행은 인덱스 집합을 나타냅니다. 산뜻한!

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


array(0, rep(n,n)작동하므로 할 필요가 없습니다 rep. 그런 다음도 걸릴 수 있습니다 n통해 array(0, rep(n<-scan(),n)).
JAD

또한 x[seq(1,n^n,l=n)]=11 바이트 더 짧습니다.
JAD

@JarkoDubbeldam 감사합니다! 좋은데
주세페


1

파이썬 3 + numpy, 81 77 바이트

from numpy import*
f=lambda n:all([a==range(n)for a in indices((n,)*n)],0)+0

나는 아니에요 완전히 는 주어진 특성을 가진 ndarray를 반환해야합니다 위의 적합 모든 지침 것이다. 익명 함수는 일반적으로 훌륭하지만 대화 형 셸은 실제로 인쇄됩니다.

>>> f(2)
array([[1, 0],
       [0, 1]])

배열 fluff가 위의 내용을 유효하지 않게 만들면 print()7 바이트를 추가해야합니다.

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


1

Pyth, 14 바이트

ucGQtQms!t{d^U

테스트 스위트

설명 : ^U암시 적으로 ^UQQ, Q입력 위치 는 range의 가능한 모든 Q 요소 목록을 계산합니다 0 ... n-1. ms!t{d모든 요소가 1 인 요소를 매핑하고 나머지는 0에 매핑합니다.

ucGQtQ 다음과 같은 Q-1 회 실행합니다. 입력을 Q 크기 목록으로 잘라냅니다.


1

C # (. NET 코어) 166 바이트

n=>{var c=new int[n];int i=0,d;for(;i<n;c[i++]=n);var m=System.Array.CreateInstance(typeof(int),c);for(i=0;i<n;i++){for(d=0;d<n;c[d++]=i);m.SetValue(1,c);};return m;}

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

처음에는 C #에서 람다 식으로 할 수 없다고 생각했습니다 ... ^ __ ^ U


1

공통 리스프, 147133 바이트

(defun i(n)(flet((m(x)(fill(make-list n)x)))(let((a(make-array(m n):initial-element 0)))(dotimes(i n)(incf(apply #'aref a(m i))))a)))

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

일반적인 초장 형 리스프. @ceilingcat 덕분에 12 바이트가 줄었습니다!

설명:

(defun i (n)
  (flet ((m (x) (fill (make-list n) x)))            ; function to build a list of n values x
    (let ((a (make-array (m n) :initial-element 0))); build the array with all 0
      (dotimes (i n)                                ; for i from 0 to n-1
        (incf (apply #'aref a (m i))))              ; add 1 to a[i]..[i] 
      a)))                                          ; return the array

@ceilingcat, ops, 골프 버전에서 바보 같은 오류가있었습니다. 고마워요!
Renzo

0

SOGL V0.12 , 22 바이트

.^κ.H/ 0* 1.H≤Οčr.H{.n

여기 사용해보십시오! 콘솔에서 볼 수
있는 출력을 스택에 남겨 둡니다 . 출력의 숫자가 문자열이 될 수 있으면 숫자 r가 제거 될 수 있습니다.
SOGL이 챌린지에서 어떻게 수행하는지에 대한 재미있는 테스트와 마찬가지로 다음과 같은 목표를 달성하지 못했습니다 .p

input: x
.^                      push  x^x
  κ                     subtract x    (x^x)-x
   .H/                  divide by x   ((x^x) - x)/x
       0*               get that many zeroes
          1             push "1"
           .H           push x-1
             ≤          pull the first item from the stack to the top
              Ο         encase (x-1 times the zeroes, separated, started and ended with 1s)
               č        chop to a char-array
                r       convert each character to a number
                 .H{    repeat x-1 times:
                    .n    in the top array, for each group of x contents, encase that in an array

0

클로저, 92 바이트

#(reduce(fn[v i](assoc-in v(repeat % i)1))(nth(iterate(fn[v](vec(repeat % v)))0)%)(range %))

Assoc-in 은 해시 맵뿐만 아니라 벡터에서도 작동 한다는 것이 좋습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.