Оцініть індекс багатовимірних координат


9

Наведена колекція N розмірних координат. Приклад нижче:

{2,3,4}

Це можна розглядати як тривимірний масив із 2x, 3y та 4z; може бути будь-яка кількість вимірів. У прикладі є 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

Метою цієї програми є робота назад, щоб визначити індекс, якщо вказано номер вузла.

Якщо запитують індекс "y" 8-го вузла, програма повинна надрукувати "2".

За умови наступного введення:

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

Необхідно надрукувати наступне:

2

Ви можете припустити, що введення буде надано зручним способом на обраній вами мові та не вимагає перевірки меж. Наприклад, ви можете припустити, що наданий індекс вибору ("y" у прикладі) є дійсним щодо наданих координат. Ви можете використовувати індексацію на основі 0 або 1; приклад припускає 0 на основі.

Це свого роду зворотний бік цього питання: Індекс багатовимірного масиву


1
Можливо, додамо кілька тестових випадків
Луїс Мендо

1
Чи можемо ми дозволити координатам працювати від 1 до х замість 0 до х-1? Отже, вузол № 0 буде (1,1,1), а вузол №23 (2,3,4).
німі

@nimi Так, індексація на основі 1 чудово.
Марк Джонсон

Відповіді:


4

MATL , 8 байт

PiX[vPi)

При цьому використовується індексація на основі 1 для вузла та розмірів. Таким чином, перші вузли 1, і 2т.д .; і розмір "х" є 1, "у" - 2і т.д.

Спробуйте в Інтернеті!

Пояснення

Ключовим є використання функції X[(відповідної ind2subв Matlab або 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

Haskell , 45 байт

(#)бере три аргументи і повертає ціле число, використовуйте як [2,3,4]#8$1.

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

Спробуйте в Інтернеті!

Як це працює

  • l- це список координат, nномер вузла. l#nце функція, яка приймає кінцевий показник i.
  • Враховуючи список прикладів [2,3,4]і вузол 8, спочатку береться хвіст списку, даючи [3,4]. Тоді це не є scanз right, divідентифікуючи номер вузла кожен елемент послідовно, надаючи список [0,2,8].
  • Потім список [0,2,8]і оригінал l=[2,3,4]є zipпед withв modулусі оператора, що дають [0,2,0].
  • Нарешті, !!оператор індексації списку частково застосовується, в результаті чого функція готова отримати кінцевий індекс.

3

APL (Dyalog Classic) , 5 байт

⎕⌷⎕⊤⎕

Ні, ви не пропускаєте шрифту. Ось як це має виглядати.

Це програма REPL, яка приймає дані STDIN: номер вузла, розміри та індекс (у такому порядку). Останні можуть бути на основі 0 або 1, залежно від значення ⎕IO.

Спробуйте в Інтернеті!

Як це працює

Індексація багатовимірного масиву по суті є змішаною базовою конверсією, тому робить те, про що вимагає перша частина завдання. Кожне виникнення читає і оцінює рядок зі STDIN, так

        
⎕:
      8
⎕:
      2 3 4
0 2 0

Нарешті, бере елемент у вказаному індексі. Край лівий зчитує третій та останній вхід із STDIN та

        (0 2 0)
⎕:
      1
2

Змішана конверсія бази знову вражає!
Адам

3

Haskell, 38 30 29 28 байт

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

Для цього використовуються індекси та координати на основі 0, починаючи з 1. Спробуйте в Інтернеті!

Перетворіть кожен вимір 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.
німі

Також l#n=(mapM(`take`[0..])l!!n!!)коротше. (До речі, функції вам не потрібні. f=Функції можуть бути анонімними. О, я думаю, ви цього не рахуєте.)
Ørjan Johansen

@ ØrjanJohansen: Ще раз дякую. У f=TIO виникла помилка копіювання та вставки.
німі

2

Брахілог , 25 23 байти

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

Спробуйте в Інтернеті!

Другий аргумент 1-індексований, інші 2 - індексовані.

Пояснення

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 байт

Отримати індексацію на основі 0 ⎕IO←0, яка є типовою для багатьох систем. Підказки щодо розмірів, потім додається список (вузол, координата).

⎕⊃↑,⍳⎕

Спробуйте в Інтернеті!

 підказка про розміри

 генерувати масив цієї форми з кожним елементом , що є I ndices для цього елемента

, ravel (внести в список індексів)

 перетворити один рівень глибини на додатковий рівень рангу

⎕⊃ підкажіть для вкладеного списку (вузол, координата) і використовуйте його, щоб вибрати елемент з цього





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

JavaScript (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]

На жаль reduce, на два байти довше:

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

Схоже, ми придумали ту саму ідею \ o /
Leaky Nun

@LeakyNun Ну, це не дивно, враховуючи, як працює індексація.
Ніл

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.