Codegolf — Оценка Индекса Многомерных Координат

  • Автор темы Creonic
  • Обновлено
  • 20, Oct 2024
  • #1

Предоставляется набор N-мерных координат. Пример ниже:

 
 
 
 2
 

Это можно рассматривать как трехмерный массив с 2x, 3y и 4z; может быть любое количество измерений. В примере всего 24 узла. Каждый узел может быть проиндексирован с помощью {x,y,z}. Для доступа к пятому узлу предоставленными индексами будут {0, 1, 0} на основе таблицы ниже.

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

Целью этого приложения является работа в обратном направлении для определения индекса, если задан номер узла.

Если запросить индекс «y» 8-го узла, программа должна вывести «2».

Со следующими входными данными:

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

Необходимо распечатать следующее:

{2,3,4}

Вы можете предположить, что ввод будет предоставлен каким-либо удобным способом на выбранном вами языке и не потребует проверки границ. Например, вы можете предположить, что предоставленный индекс выбора («y» в примере) действителен по отношению к предоставленным координатам. Вы можете использовать индексацию на основе 0 или 1; пример предполагает, что значение основано на 0.

Это своего рода обратная сторона этого вопроса: Индекс многомерного массива

#код-гольф #математика #массив

Creonic


Рег
07 Nov, 2019

Тем
79

Постов
222

Баллов
637
  • 26, Oct 2024
  • #2

МАТЛ, 8 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 lambda a,m,n:f(a[:-1],m//a[-1],n)if len(a)-n else m%a[-1]
 

При этом используется индексация на основе 1 для узла и измерений. Итак, первые узлы (a,n,i)=>a.reduce((r,d,j)=>j>i?r/d|0:r,n)%a[i] , reduce и т. д; и размер «x» равен (a,n,i)=>a.reduceRight(([n,...a],e)=>[n/e|0,n%e,...a],[n])[i+1] , "y" is (a,n,i,g=j=>a[++j]?g(j)/a[j]|0:n)=>g(i)%a[i] и т. д.

Попробуйте онлайн!

Объяснение

Ключ заключается в использовании функции int f(int[]a,int m,int n){for(int i=a.length-1;i>n;m/=a[i--]);return m%a[n];} (corresponding to 0:(x-1) в Matlab или Octave), который преобразует линейный индекс в многомерные индексы. Однако порядок измерений противоположен тому, который определен в задаче, поэтому 4-i ( [n,4-i] ) необходим перед вызовом функции и снова после объединения ( z,y,x ) its ouputs.

expand.grid ||answer||

АПЛ (Диалог Классик), 5 байт

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

Нет, вам не хватает шрифта. Вот как это должно выглядеть.

Это программа REPL, которая принимает входные данные из STDIN: номер узла, размеры и индекс (в указанном порядке). Последний может начинаться с 0 или 1, в зависимости от значения @.n]@*FUMQEE UMQ map each element in the first input to [0,1,...,that element] *F reduce by Cartesian product @ E obtain index at second input .n] listify and flatten @ E obtain index at third input .

Попробуйте онлайн!

Как это работает

Индексирование многомерных массивов по сути представляет собой смешанное базовое преобразование, поэтому @.n]@*FUMQEE does what the first part of the challenge asks for. Each occurrence of function z=f(s,n,d) [c{nnz(s):-1:1}]=ind2sub(flip(s),n);z=c{d}; читает и оценивает строку из STDIN, поэтому

Œ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

Окончательно, Œp⁴ị⁵ị takes the element at the specified index. The leftmost ⎕⊃ читает третий и последний ввод из STDIN и

||answer||

Хаскелл, 45 байт

, takes three arguments and returns an integer, use as .

Попробуйте онлайн!

Как это работает

  • ⎕⊃↑,⍳⎕ is the list of coordinates, ⎕IO←0 номер узла. In[1]:= Array[f,#,0,Or][[##2]]&[{2,3,4},9,2] Out[1]= 2 is a function that takes the final index Flat .
  • Учитывая список примеров Or and node Array[f,#,0,Or][[##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 . Then this is tT&bhH&h{>ℕ}ᵐ:H≜ᶠ⁾t:T∋₎ Нед из !! ight, mapM последовательное определение номера узла каждым элементом, давая список [[1,2],[1,2,3],[1,2,3,4]] .
  • Тогда список [2,3,4] and the original [1..x] являются x ped l#n=(mapM(\x->[1..x])l!!n!!) тот !! ulus operator, giving [0,2,0] .
  • Наконец mod list indexing operator is partially applied, with the resulting function ready to be given the final index.
 

Pavel2000


Рег
17 Dec, 2010

Тем
72

Постов
212

Баллов
612
  • 26, Oct 2024
  • #3

Хаскель, 38 30 29 28 байт

with

При этом используются индексы, отсчитываемые от 0, и координаты, начиная с 1. Попробуйте онлайн!

Поверните каждое измерение zip of the input into a list l=[2,3,4] , например [0,2,8] -> [0,2,8] . div makes a list of all possible n-tuples where the first element is taken from the first list, etc. Two times r для индексации n-кортежа и измерения.

Редактировать: @Ørjan Johansen сохранил 8 9 байт. Спасибо!

 

Sleep


Рег
05 Apr, 2004

Тем
80

Постов
217

Баллов
617
  • 26, Oct 2024
  • #4

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

scan

Попробуйте онлайн!

Второй аргумент имеет индекс 1, остальные 2 имеют индекс 0.

Объяснение

[3,4] ||answer||

Математика, 26 23 байта

8

Использование индексации с отсчетом от 1 для ввода и индексации с отсчетом от 0 для вывода.

Почему [2,3,4] ? Because it is the shortest built-in function with the attribute i .

Пример:

l#n ||answer||

АПЛ (Диалог), 6 байт

Чтобы получить индексацию с отсчетом от 0, n , which is default on many systems. Prompts for dimensions, then enclosed list of (node,coordinate).

l

Попробуйте онлайн!

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

[2,3,4]#8$1  generate an array of that shape with each item being the яиндексы для этого предмета

(#)  ravel (make into list of indices)

⎕ ⌷ (0 2 0) ⎕: 1 2  convert one level of depth to an additional level of rank

 prompt for enclosed list of (node,coordinate) and use that to pick an element from that

 

Dumspiro


Рег
12 Apr, 2007

Тем
71

Постов
201

Баллов
586
  • 26, Oct 2024
  • #6

Пиф, 12 байт

Попробуйте онлайн!

Как это работает

⎕IO ||answer||

Р, 52 байта

⎕⌷⎕⊤⎕

возвращает анонимную функцию с индексом 1.

для примера. 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 generates the list, but the first argument varies the fastest, so we have to input them in reverse order, i.e., v . Тогда мы можем просто индексировать flip , where P необходимо для обратного порядка, и вычтите 1, чтобы гарантировать, что они выполняются из ind2sub , etc.

Попробуйте онлайн!

 

Deefreez


Рег
15 Mar, 2014

Тем
64

Постов
211

Баллов
561
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно