다차원 좌표의 인덱스 평가


9

N 차원 좌표의 집합이 제공됩니다. 예는 다음과 같습니다.

{2,3,4}

이것은 2x, 3y 및 4z를 가진 3 차원 배열로 생각할 수 있습니다. 차원의 수는 얼마든지있을 수 있습니다. 이 예에는 총 24 개의 노드가 있습니다. {x, y, z}를 사용하여 각 노드를 색인 할 수 있습니다. 5 번째 노드에 액세스하기 위해 제공된 표는 아래 표를 기준으로 {0, 1, 0}입니다.

## | x y z
     0 1 2
-----------
0  | 0 0 0
1  | 0 0 1
2  | 0 0 2
3  | 0 0 3
4  | 0 1 0
5  | 0 1 1
6  | 0 1 2
7  | 0 1 3
8  | 0 2 0
...
23 | 1 2 3

이 응용 프로그램의 목적은 노드 번호가 주어지면 인덱스를 결정하기 위해 거꾸로 작동하는 것입니다.

8 번째 노드의 "y"색인을 요청하면 프로그램은 "2"를 인쇄해야합니다.

다음 입력이 제공됩니다.

{2,3,4}|8|1
<List of Coordinates>|<Node>|<Index>

다음이 인쇄되어야합니다.

2

입력이 선택한 언어로 편리한 방식으로 제공되며 경계 검사가 필요하지 않다고 가정 할 수 있습니다. 예를 들어 제공된 선택 색인 (예에서 "y")이 제공된 좌표와 관련하여 유효하다고 가정 할 수 있습니다. 0 또는 1 기반 인덱싱을 사용할 수 있습니다. 이 예에서는 0을 기준으로합니다.

이것은이 질문의 반대 입니다. 다차원 배열의 인덱스


1
아마도 몇 가지 테스트 사례를 추가 할 수 있습니다
Luis Mendo

1
좌표를 0에서 x-1 대신 1에서 x로 옮길 수 있습니까? 따라서 노드 # 0은 (1,1,1)이고 노드 # 23은 (2,3,4)입니다.
nimi

@nimi 예, 1 기반 인덱싱이 좋습니다.
마크 존슨

답변:


4

MATL , 8 바이트

PiX[vPi)

이는 노드 및 차원에 1 기반 인덱싱을 사용합니다. 첫 번째 노드는 다음 1과 같습니다 2. "x"치수는 1"y" 2등 입니다 .

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

설명

핵심은 선형 인덱스를 다차원 인덱스로 변환하는 함수 X[( ind2subMatlab 또는 Octave에 해당 )를 사용 하는 것 입니다. 그러나 챌린지에 정의 된 것과 반대 인 경우 차원의 순서 는 함수를 호출하기 전에 그리고 출력을 연결 한 후에 다시 P( flip)가 필요합니다 v.

P    % Implicit input: size as a row vector. Flip
i    % Input: node (linear) index
X[   % Convert from linear index to multidimensional indices. Produces
     % as many outputs as entries there are in the size vector
v    % Concatenate all outputs into a column vector
P    % Flip
i    % Input: dimension
)    % Index: select result for that dimension. Implicitly display

3

하스켈 , 45 바이트

(#)세 개의 인수를 사용하고 정수를 리턴합니다 [2,3,4]#8$1.로 사용하십시오 .

l#n=(zipWith mod(scanr(flip div)n$tail l)l!!)

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

작동 원리

  • l좌표 목록, n노드 번호입니다. l#n최종 색인을 취하는 함수입니다 i.
  • list [2,3,4]와 node 예제가 주어지면 8먼저 목록의 꼬리를 가져 와서 제공 [3,4]합니다. 이어서이다 scan로부터 네드 r, ight div목록을 제공 연속적 각 소자에 의해 노드 번호를 iding [0,2,8].
  • 그런 다음 목록 [0,2,8]과 원본이 l=[2,3,4]되는 zipPED 제공 ulus 연산자를 .withmod[0,2,0]
  • 마지막으로 !!목록 색인 작성 연산자가 부분적으로 적용되며 결과 기능은 최종 색인을 제공 할 준비가됩니다.

3

APL (Dyalog Classic) , 5 바이트

⎕⌷⎕⊤⎕

아니요, 글꼴이 없습니다. 그렇게 보일 것입니다.

STDIN에서 입력을받는 REPL 프로그램입니다 : 노드 번호, 차원 및 색인 (순서대로). 후자는의 값에 따라 0 또는 1 기반 일 수 있습니다 ⎕IO.

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

작동 원리

다차원 배열 인덱싱은 기본적으로 혼합 된 기본 변환이므로 문제의 첫 번째 부분에서 요구하는 사항도 마찬가지 입니다. 각각 발생 하므로, 판독 STDIN에서 회선을 evals

        
⎕:
      8
⎕:
      2 3 4
0 2 0

마지막으로 지정된 인덱스에서 요소를 가져옵니다. 가장 왼쪽 은 STDIN에서 세 번째 및 마지막 입력을 읽고

        (0 2 0)
⎕:
      1
2

혼합 기본 전환이 다시 시작됩니다!
Adám

3

하스켈, 38 30 29 28 바이트

l#n=(mapM(\x->[1..x])l!!n!!)

1부터 시작하는 0부터 시작하는 인덱스 및 좌표를 사용 합니다.

x입력의 각 차원 을 목록 [1..x]으로 바꿉니다 (예 : [2,3,4]->) [[1,2],[1,2,3],[1,2,3,4]]. mapM첫 번째 요소를 첫 번째 목록 등에서 가져 오는 모든 가능한 n- 튜플 목록을 만듭니다. !!n- 튜플과 차원을 인덱싱하기 위해 두 번 .

편집 : @ Ørjan Johansen은 8 9 바이트를 저장했습니다 . 감사!


오 영리하다! 그러나 mapM id.map f=mapM f. 그리고 (`take`[0..])더 짧습니다.
Ørjan Johansen '

@ ØrjanJohansen : 8 바이트, 엄청납니다! 고마워요! 1 기반 좌표가 허용되는 경우 여전히 OP의 답변을 기다리는 중입니다.
nimi

또한 l#n=(mapM(`take`[0..])l!!n!!)짧습니다. (그런데 당신이 필요하지 않았다 f=, 함수는 익명으로 할 수있다 오, 당신이 그것을 계산하지 않는 것 같아요..)
Ørjan 요한센

@ ØrjanJohansen : 다시 감사합니다. 은 f=사본이었고, TIO에서 오류를 붙여 넣습니다.
nimi

2

Brachylog , 25 23 바이트

tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎

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

두 번째 인수는 1 인덱싱되고 다른 두 인수는 0 인덱싱됩니다.

설명

tT                          Input = [_, _, T]
  &bhH                      Input = [_, H, T]
      &h{>ℕ}ᵐ               Create a list where each element is between 0 and the
                              corresponding element in the first element of the Input
             :H≜ᶠ⁾          Find the first H possible labelings of that list
                  t         Take the last one
                   :T∋₎     Output is the T'th element

1

수학, 26 23 바이트

Array[f,#,0,Or][[##2]]&

입력에 1 기반 인덱싱을 사용하고 출력에 0 기반 인덱싱을 사용합니다.

Or? 속성이있는 가장 짧은 내장 함수이기 때문입니다 Flat.

예:

In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2]

Out[1]= 2

1

APL (Dyalog) , 6 바이트

⎕IO←0많은 시스템에서 기본값 인 0 기반 인덱싱을 얻으려면 . 치수를 묻는 메시지가 표시되고 (노드, 좌표) 목록으로 묶습니다.

⎕⊃↑,⍳⎕

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

 치수 프롬프트

 각 항목이 i 인 해당 모양의 배열을 생성하십시오. 해당 항목 ndices

, 라벨 (지수 목록으로 만들기)

 한 수준의 깊이를 추가 순위 수준으로 변환

⎕⊃ (노드, 좌표)의 동봉 된 목록에 대한 프롬프트를 표시하고이를 사용하여 해당 요소를 선택하십시오.


1

젤리 , 7 6 바이트

Œp⁴ị⁵ị

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

입력 및 출력에 1 인덱싱을 사용합니다.

작동 원리

Œp⁴ị⁵ị
Œp      Cartesian product of the first input
        numbers are converted to 1-based ranges
  ⁴ị    index specified by second input
    ⁵ị  index specified by third input



0

R, 52 바이트

function(x,y,z,n,i)expand.grid(1:z,1:y,1:x)[n,4-i]-1

1- 인덱싱 된 익명 함수를 반환합니다.

예를 들어. expand.grid목록을 생성하지만 첫 번째 인수는 가장 빠르게 변하기 때문에 역순으로 입력해야합니다 (예 :) z,y,x. 그런 다음 역순으로 필요한 [n,4-i]곳을 간단히 색인화 4-i하고 1을 빼서0:(x-1) 등에서 .

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



0

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

(a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i]

언 골프 드 :

(a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1]

슬프게도 reduce2 바이트 더 깁니다.

(a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i]

우리가 같은 생각 을했던 것 같습니다. \ o /
Leaky Nun

@LeakyNun 글쎄, 인덱싱 작동 방식을 고려할 때 실제로 놀라운 것은 아닙니다.
Neil

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