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||
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||
,
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.