Поэтому я сделал это странным способом. Я заметил, что в формировании массива есть две закономерности.
Первый это то, как в шаблоне верхних строк разница между каждым термином увеличивается от 1 -> h, где h — высота, а l — длина. Поэтому я создаю верхнюю строку на основе этого шаблона.
Для матрицы dim(3,4), дающей 3 +/&i. 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6
We will see the top row of the form
+/&i.
Предположим вместо этого, что dim(3,9), дающий ,$[:>:@/:@/:@,+/&i.
we will instead see a top row of
$1(+/:@;)</.@i.
Второй шаблон — это то, как строки изменяются друг от друга. Если рассмотреть матрицу:
m->n->{ // Method with two integer parameters and integer-matrix return-type
var R=new int[m][n]; // Result-matrix of size `m` by `n`
for(int i=0,j, // Index integers, starting at 0
v=0; // Count integer, starting at 0
i<m+n;) // Loop as long as `i` is smaller than `m+n`
for(j=++i<n?0 // Set `j` to 0 if `i+1` is smaller than `n`
:i-n; // or to the difference between `i` and `n` otherwise
j<i&j<m;) // Inner loop `j` until it's equal to either `i` or `m`,
// so basically check if it's still within bounds:
R[j][i-++j]=++v; // Add the current number to cell `j, i-(j+1)`
return R;} // Return the result-matrix
и вычитаем каждую строку из строки ниже (игнорируя лишнюю строку), получаем
m->n->{var R=new int[m][n];for(int i=0,j,v=0;i<m+n;)for(j=++i<n?0:i-n;j<i&j<m;)R[j][i-++j]=++v;return R;}
Увидев эту матрицу, мы можем заметить, что эта матрица представляет собой последовательность print
where by each row is 5 terms of this pattern shifted by 1 for each row. See below for visual.
<-
Итак, чтобы получить окончательную матрицу, мы берем нашу первую созданную строку и выводим эту строку, дополненную 5 необходимыми членами этого шаблона.
Этот паттерн всегда будет иметь характеристики начала print
and ending function(M,N){
x <- outer(1:M,1:N,"+") # create matrix with distinct indices for the antidiagonals
idx <- split(x,x) # split into factor groups
items <- split(1:(M*N),unlist(idx)) # now split 1:(M*N) into factor groups using the groupings from idx
items <- lapply(items,rev) # except that the factor groups are
# $`2`:1, $`3`:2,3, (etc.) but we need
# $`2`:1, $`3`:3,2, so we reverse each sublist
matrix(unsplit(items,x),M,N) # now unsplit to rearrange the vector to the right order
# and construct a matrix, returning the value
}
где split
and the number of times that the max value will appear is function(M,N)matrix(unsplit(lapply(split(1:(M*N),unlist(split(x,x))),rev),x<-outer(1:M,1:N,"+")),M,N)
где rank
Итак, в целом мой метод создания новых строк выглядит так:
function(M,N)matrix(rank(outer(1:M,1:N,"+"),,"l"),M,N)
Соответствующий код ниже. Это не оказалось коротким, но мне все еще нравится этот метод.
def f(n,k):M=[(t//k+t%k,t)for t in range(n*k)];return zip(*k*[map([M,*sorted(M)].index,M)])
Попробуйте онлайн!