Đánh giá chỉ số của tọa độ đa chiều


9

Một bộ sưu tập tọa độ N được cung cấp. Một ví dụ dưới đây:

{2,3,4}

Điều này có thể được coi là một mảng 3 chiều với 2x, 3y và 4z; có thể có bất kỳ số lượng kích thước. Trong ví dụ này, có 24 nút tổng. Mỗi nút có thể được lập chỉ mục bằng cách sử dụng {x, y, z}. Để truy cập nút thứ 5, các chỉ số được cung cấp sẽ là {0, 1, 0} dựa trên bảng bên dưới.

## | 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

Mục đích của ứng dụng này là hoạt động ngược để xác định chỉ mục nếu được cung cấp số nút.

Nếu được hỏi về chỉ số "y" của nút thứ 8, chương trình sẽ in "2".

Với đầu vào sau được cung cấp:

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

Sau đây nên được in:

2

Bạn có thể giả định rằng đầu vào sẽ được cung cấp một cách thuận tiện theo ngôn ngữ bạn chọn và không yêu cầu kiểm tra giới hạn. Ví dụ, bạn có thể cho rằng chỉ số được cung cấp ("y" trong ví dụ) là hợp lệ đối với tọa độ được cung cấp. Bạn có thể sử dụng lập chỉ mục dựa trên 0 hoặc 1; ví dụ giả định 0 dựa.

Đây là loại ngược lại của câu hỏi này: Chỉ mục của một mảng nhiều chiều


1
Có lẽ thêm một vài trường hợp thử nghiệm
Luis Mendo

1
Chúng ta có thể để tọa độ chạy từ 1 đến x thay vì 0 đến x-1 không? Vì vậy, nút # 0 sẽ là (1,1,1) và nút # 23 (2,3,4).
nimi

@nimi Có, 1 chỉ số dựa trên là tốt.
Mark Johnson

Câu trả lời:


4

MATL , 8 byte

PiX[vPi)

Điều này sử dụng lập chỉ mục dựa trên 1 cho nút và cho kích thước. Vì vậy, các nút đầu tiên là 1, 2vv; và kích thước "x" là 1, "y" là 2v.v.

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

Giải trình

Điều quan trọng là sử dụng hàm X[(tương ứng với ind2subMatlab hoặc Octave), để chuyển đổi một chỉ số tuyến tính thành các chỉ số đa chiều. Tuy nhiên, thứ tự các kích thước nếu ngược lại như được xác định trong thử thách, vì vậy P( flip) là cần thiết trước khi gọi hàm và một lần nữa sau khi ghép ( v) các tham số của nó.

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

Haskell , 45 byte

(#)nhận ba đối số và trả về một số nguyên, sử dụng như [2,3,4]#8$1.

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

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

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

  • llà danh sách tọa độ, nsố nút. l#nlà một hàm lấy chỉ số cuối cùng i.
  • Đưa ra danh sách ví dụ [2,3,4]và nút 8, đầu tiên đuôi của danh sách được lấy, đưa ra [3,4]. Sau đó, điều này được scanned từ right, dividing số nút theo từng phần tử liên tiếp, đưa ra danh sách [0,2,8].
  • Sau đó, danh sách [0,2,8]và bản gốc l=[2,3,4]được zipPED withcác modnhà điều hành Ulus, cho [0,2,0].
  • Cuối cùng, !!toán tử lập chỉ mục danh sách được áp dụng một phần, với hàm kết quả đã sẵn sàng để được cung cấp chỉ mục cuối cùng.

3

APL (Dyalog Classic) , 5 byte

⎕⌷⎕⊤⎕

Không, bạn không thiếu một phông chữ. Đó là cách nó phải nhìn.

Đây là chương trình REPL lấy đầu vào từ STDIN: số nút, kích thước và chỉ mục (theo thứ tự đó). Cái sau có thể dựa trên 0 hoặc 1, tùy thuộc vào giá trị của ⎕IO.

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

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

Lập chỉ mục mảng đa chiều về cơ bản là chuyển đổi cơ sở hỗn hợp, do đó, phần đầu tiên của thử thách yêu cầu. Mỗi lần xuất hiện đọc và tránh một dòng từ STDIN, vì vậy

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Cuối cùng, lấy phần tử tại chỉ mục đã chỉ định. Phần ngoài cùng bên trái đọc đầu vào thứ ba và cuối cùng từ STDIN và

        (0 2 0)
⎕:
      1
2

Hỗn hợp chuyển đổi cơ sở đình công một lần nữa!
Adám

3

Haskell, 38 30 29 28 byte

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

Điều này sử dụng các chỉ số và tọa độ dựa trên 0 bắt đầu từ 1. Hãy thử trực tuyến!

Biến từng kích thước xcủa đầu vào thành một danh sách [1..x], ví dụ [2,3,4]-> [[1,2],[1,2,3],[1,2,3,4]]. mapMlập danh sách tất cả các n-tup có thể trong đó phần tử đầu tiên được lấy từ danh sách đầu tiên, v.v ... Hai lần !!để lập chỉ mục n-tuple và thứ nguyên.

Chỉnh sửa: @ rjan Johansen đã lưu 8 9 byte. Cảm ơn!


Ôi, thông minh! Nhưng mapM id.map f=mapM f. Và (`take`[0..])ngắn hơn.
Ørjan Johansen

@ RjanJohansen: 8 byte, thật là lớn! Cảm ơn rất nhiều! Vẫn đang chờ câu trả lời của OP nếu cho phép tọa độ dựa trên 1.
nimi

Ngoài ra, l#n=(mapM(`take`[0..])l!!n!!)là ngắn hơn. (Ngẫu nhiên bạn không cần f=, các chức năng có thể ẩn danh. Ồ, tôi đoán bạn không tính nó.)
Ørjan Johansen

@ RjanJohansen: Cảm ơn một lần nữa. Đây f=là một bản sao và dán lỗi từ TIO.
nimi

2

Brachylog , 25 23 byte

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

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

Đối số thứ hai là 1 chỉ mục, 2 đối số còn lại là 0 được lập chỉ mục.

Giải trình

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

Toán học, 26 23 byte

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

Sử dụng lập chỉ mục dựa trên 1 cho đầu vào và lập chỉ mục dựa trên 0 cho đầu ra.

Tại sao Or? Bởi vì nó là hàm tích hợp ngắn nhất với thuộc tính Flat.

Thí dụ:

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

Out[1]= 2

1

APL (Dyalog) , 6 byte

Để có được lập chỉ mục dựa trên 0 ⎕IO←0, được mặc định trên nhiều hệ thống. Nhắc về kích thước, sau đó kèm theo danh sách (nút, tọa độ).

⎕⊃↑,⍳⎕

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

 nhắc nhở về kích thước

 tạo ra một mảng có hình dạng đó với mỗi mục là i ndices cho mục đó

, ravel (lập thành danh sách các chỉ số)

 chuyển đổi một cấp độ sâu sang cấp bậc bổ sung

⎕⊃ nhắc về danh sách kèm theo của (nút, tọa độ) và sử dụng nó để chọn một phần tử từ đó


1

Thạch , 7 6 byte

Œp⁴ị⁵ị

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

Điều này sử dụng lập chỉ mục 1 cho đầu vào và đầu ra.

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

Œ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 byte

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

trả về một hàm ẩn danh, được lập chỉ mục 1.

cho ví dụ expand.gridtạo danh sách, nhưng đối số đầu tiên thay đổi nhanh nhất, vì vậy chúng ta phải nhập chúng theo thứ tự ngược lại, nghĩa là , z,y,x. Sau đó, chúng ta có thể chỉ cần lập chỉ mục [n,4-i], nơi 4-icần thiết cho thứ tự đảo ngược và trừ đi 1 để đảm bảo chúng chạy từ 0:(x-1), v.v.

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



0

JavaScript (ES6), 44 byte

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

Ung dung:

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

Đáng buồn reducelà hai byte dài hơn:

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

Có vẻ như chúng tôi đã đưa ra cùng một ý tưởng \ o /
Leaky Nun

@LeakyNun Chà, thực sự không có gì đáng ngạc nhiên, vì cách thức lập chỉ mục hoạt động.
Neil

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.