다차원 배열의 인덱스 + c 이

C 및 C ++와 같은 저급 언어에는 실제로 다차원 배열 개념이 없습니다. (벡터 및 동적 배열 이외) 다차원 배열을 사용하여

int foo[5][10];

이것은 실제로 구문 설탕 입니다. C가 실제로하는 일은 5 * 10 요소 의 단일 연속 배열을 만드는 것 입니다. 이

foo[4][2]

또한 구문 설탕입니다. 이것은 실제로 요소를 나타냅니다

4 * 10 + 2

또는 42 번째 요소입니다. 일반적으로, 요소의 인덱스 [a][b]어레이가 foo[x][y]있어요

a * y + b

3D 배열에도 동일한 개념이 적용됩니다. 우리가 가지고 foo[x][y][z]있고 요소에 [a][b][c]액세스하면 실제로 요소에 액세스합니다.

a * y * z + b * z + c

이 개념은 n 차원 배열에 적용됩니다 . 차원이있는 배열이 D1, D2, D3 ... Dn있고 요소 S1, S2, S3 ... Sn에 액세스 하면 수식은

(S1 * D2 * D3 ... * Dn) + (S2 * D3 * D4 ... * Dn) + (S3 * D4 ... * Dn) ... + (Sn-1 * Dn) + Sn

도전

위의 공식에 따라 다차원 배열의 인덱스를 계산하는 프로그램이나 함수를 작성해야합니다. 입력은 두 개의 배열입니다. 첫 번째 배열은 차원이고 두 번째 배열은 인덱스입니다. 이 두 배열의 길이는 항상 같고 1 이상입니다.

배열의 모든 숫자가 음이 아닌 정수라고 가정 할 수 있습니다. 0비록 차원 배열에서 차원 배열을 얻지 못한다고 가정 할 수도 0 있습니다. 인덱스에 수 있습니다. 인덱스가 치수보다 크지 않다고 가정 할 수도 있습니다.

IO 테스트

Dimensions: [5, 10]
Indices: [4, 2]
Output: 42

Dimensions: [10, 10, 4, 62, 7]
Indices: [1, 2, 3, 4, 5]
Output: 22167

Dimensions: [5, 1, 10]
Indices: [3, 0, 7]
Output: 37

Dimensions: [6, 6, 6, 6, 6, 6, 6, 6, 6, 6]
Indices: [3, 1, 5, 5, 3, 0, 5, 2, 5, 4]
Output: 33570178


답변

APL, 1 바이트

TryAPL에서 테스트하십시오 .


답변

J, 2 바이트

#.

APL이있는 곳에 J가 있습니다! 거의. 차원을 왼쪽 arg로, 색인을 오른쪽 arg로 취합니다. “다차원 배열의 인덱싱은 기본적으로 혼합 된 기본 변환입니다.”


답변

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

(d,a)=>a.reduce((r,i,j)=>r*d[j]+i)

반드시 reduce보다 낫습니다 map.


답변

파이썬, 43 바이트

f=lambda x,y:x>[]and y.pop()+x.pop()*f(x,y)

Ideone에서 테스트하십시오 .


답변

젤리 , 7 6 바이트

Ṇ;żḅ@/

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

Ṇ;żḅ@/  Main link. Arguments: D (list of dimensions), I (list of indices)

Ṇ       Yield 0, the logical NOT of D.
  ż     Zip D with I.
        If D = [10, 10, 4, 62, 7] and I = [1, 2, 3, 4, 5], this yields
        [[10, 1], [10, 2], [4, 3], [62, 4], [7, 5]].
 ;      Concatenate, yielding [0, [10, 1], [10, 2], [4, 3], [62, 4], [7, 5]].
   ḅ@/  Reduce by swapped base conversion to integer.
        [10, 1] in base    0 is    0 × 10 + 1 = 1.
        [10, 2] in base    1 is    1 × 10 + 2 = 12.
        [ 4, 3] in base   12 is   12 ×  4 + 3 = 51.
        [62, 4] in base   51 is   51 × 62 + 4 = 3166.
        [ 7, 5] in base 3166 is 3166 ×  7 + 5 = 22167.

답변

Pyth, 10 바이트

e.b=+*ZNYC

온라인으로 사용해보십시오 : 데모 또는 테스트 스위트

Horner의 방법을 사용하여 색인 계산.


답변

MATL , 9 바이트

PiPZ}N$X]

이것은 MATL에서 자연스럽게 선택되는 1 기반 인덱싱 (이제 챌린지에서 허용)을 사용합니다.

챌린지의 테스트 사례와 비교하려면 1입력 인덱스 벡터의 각 항목을 추가 1하고 출력에서 뺍니다 .

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

설명

이 코드는 내장 X]함수를 기반으로하며 다차원 인덱스를 Matlab 또는 Octave의 sub2ind함수 와 같은 단일 선형 인덱스로 변환 합니다.

P      % Take dimension vector implicitly. Reverse
iP     % Take vector of indices. Reverse
Z}     % Split vector into its elements
N$X]   % Convert indices to linear index (`sub2ind` function). Implicitly display