Предоставляется коллекция из 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 на основе.
Это своего рода обратная сторона этого вопроса: индекс многомерного массива
источник
Ответы:
MATL , 8 байт
При этом используется индексирование на основе 1 для узла и измерений. Таким образом, первые узлы
1
, и2
т.д.; и размер "х" есть1
, "у"2
и т. д.Попробуйте онлайн!
объяснение
Ключ должен использовать функцию
X[
(соответствующуюind2sub
в Matlab или Octave), которая преобразует линейный индекс в многомерные индексы. Однако порядок измерений, если он противоположен определенному в вызове, поэтомуP
(flip
) необходим перед вызовом функции и снова после конкатенации (v
) ее выходных данных.источник
Haskell , 45 байт
(#)
принимает три аргумента и возвращает целое число, используйте как[2,3,4]#8$1
.Попробуйте онлайн!
Как это работает
l
список координат,n
номер узла.l#n
это функция , которая принимает окончательный индексi
.[2,3,4]
и узла8
, сначала берется хвост списка, давая[3,4]
. Затем этоscan
ned отr
ight,div
последовательно идентифицируя номер узла каждым элементом, давая список[0,2,8]
.[0,2,8]
и оригиналl=[2,3,4]
являютсяzip
педwith
вmod
улусе оператора, что дают[0,2,0]
.!!
оператор индексации списка применяется частично, и результирующая функция готова получить окончательный индекс.источник
APL (Dyalog Classic) , 5 байтов
Нет, вы не пропустите шрифт. Вот как это должно выглядеть.
Это программа REPL, которая принимает входные данные из STDIN: номер узла, измерения и индекс (в этом порядке). Последний может быть 0 или 1, в зависимости от значения
⎕IO
.Попробуйте онлайн!
Как это работает
Индексирование многомерных массивов - это, по сути, смешанное базовое преобразование,
⊤
как и первая часть задачи. Каждый случай⎕
чтения и удаления строки из STDIN, поэтомуНаконец,
⌷
берет элемент по указанному индексу. Крайний левый⎕
читает третий и последний ввод из STDIN иисточник
Haskell,
38302928 байтПри этом используются 0-ориентированные индексы и координаты, начиная с 1. Попробуйте онлайн!
Превратите каждое измерение
x
ввода в список[1..x]
, например[2,3,4]
->[[1,2],[1,2,3],[1,2,3,4]]
.mapM
создает список всех возможных n-кортежей, где первый элемент берется из первого списка, и т. д. Два раза!!
для индексации n-кортежа и измерения.Редактировать: @ Ørjan Йохансен сэкономил
89 байт. Спасибо!источник
mapM id.map f=mapM f
. И(`take`[0..])
короче.l#n=(mapM(`take`[0..])l!!n!!)
короче. (Между прочим, функции вам не нужныf=
, функции могут быть анонимными. О, я полагаю, вы неf=
Было скопировать и вставить ошибку из TIO.Брахилог ,
2523 байтаПопробуйте онлайн!
Второй аргумент индексируется 1, остальные 2 индексируются 0.
объяснение
источник
Mathematica,
2623 байтаИспользование индексации на основе 1 для ввода и индексации на основе 0 для вывода.
Почему
Or
? Потому что это самая короткая встроенная функция с атрибутомFlat
.Пример:
источник
APL (Dyalog) , 6 байтов
Для получения индексации на основе 0
⎕IO←0
, которая используется по умолчанию во многих системах. Запрашивает размеры, затем вложенный список (узел, координата).Попробуйте онлайн!
⎕
подскажите размеры⍳
генерировать массив этой формы с каждым элементом , являющимся I ndices для этого элемента,
Равель (внести в список показателей)↑
преобразовать один уровень глубины в дополнительный уровень ранга⎕⊃
запросить закрытый список (узел, координата) и использовать его, чтобы выбрать элемент из этогоисточник
Желе ,
76 байтПопробуйте онлайн!
Это использует 1-индексирование для ввода и вывода.
Как это работает
источник
Октава , 63 байта
Порт моего MATL ответа.
Попробуйте онлайн!
источник
Pyth , 12 байт
Попробуйте онлайн!
Как это работает
источник
R, 52 байта
возвращает анонимную функцию с 1 индексированием.
для примера.
expand.grid
генерирует список, но первый аргумент меняется быстрее, поэтому мы должны ввести их в обратном порядке, то естьz,y,x
. Затем мы можем просто проиндексировать[n,4-i]
, где4-i
это необходимо для обратного порядка, и вычесть 1, чтобы убедиться, что они выполняются0:(x-1)
, и т. Д.Попробуйте онлайн!
источник
Java , 77 байт
Попробуйте онлайн!
источник
JavaScript (ES6), 44 байта
Ungolfed:
К сожалению,
reduce
на два байта длиннее:источник
Python 3 , 57 байт
Попробуйте онлайн!
Вилка моего Java-ответа .
источник