Матрица в «слэш» порядке


23

Дайте два положительных числа N >= 2и N <= 100создайте матрицу, которая следует следующим правилам:

  • Первый номер начинается с позиции [0,0]
  • Второй номер начинается с позиции [0,1]
  • Третий номер идет ниже первого номера (позиция [1,0])
  • Следующие числа идут в направлении «косой черты»
  • Диапазон чисел используется [1, N1 * N2]. Итак, числа идут от начала 1 до результата умножения обоих входов.

вход

  • Два числа N >= 2и N <= 100. Первое число - количество строк, Второе число - количество столбцов.

Выход

  • Матрица. (Может быть выведен в виде многомерного массива или строки с переносами строк)

Пример:

Учитывая номер 3 and 5вывод:

1   2   4   7   10
3   5   8   11  13
6   9   12  14  15

Данные числа 2 and 2

1   2
3   4

Данные номера 5 and 5

1   2   4   7   11
3   5   8   12  16
6   9   13  17  20
10  14  18  21  23
15  19  22  24  25

Самый короткий код в байтах побеждает.


2
Можем ли мы использовать индексирование 0 для любого из чисел?
Джо Кинг,

2
@JoKing Нет. Должен начаться в 1.
Луис Фелипе Де Иисус Муньос


1
@LuisfelipeDejesusMunoz Возможно, лучший термин для заказа - «диагонали»? Лично я бы назвал это "зигзагом", потому что это напоминает мне о зигзагообразном доказательстве Кантора, но это может сбить с толку.
mbomb007

2
@LuisfelipeDejesusMunoz - антидиагональный термин для другой диагонали.
августа

Ответы:


21

Желе , 6 5 байт

pSÞỤs

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

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

pSÞỤs  Main link. Left argument: n. Right argument: k

p      Take the Cartesian product of [1, ..., n] and [1, ..., k], yielding
       [[1, 1], [1, 2], ..., [n, k-1], [n, k]].
 SÞ    Sort the pairs by their sums.
       Note that index sums are constant on antidiagonals.
   Ụ   Grade up, sorting the indices of the sorted array of pairs by their values.
    s  Split the result into chunks of length k.

Черт. Мой 200+ байтов. Можете ли вы добавить некоторые объяснения, пожалуйста?
Луис Фелипе Де Иисус Муньос

3
Черт возьми, Деннис. Кроме того, хорошая работа.
Нить

6
Вау, это слишком "тесно связано". Это идентично первой ссылке в ответе миль . Подумайте об голосовании обоих. :)
user202729

1
Я думаю, что было бы возможно сделать это, <atom><atom>¥þно я не могу найти правильную комбинацию. oþ++þблизок, но не совсем добирается
Дилнан

1
@akozi Пока все хорошо. Индексы отсортированного массива [1, 2, 3, 4, 5, 6]. сортирует этот массив, используя ключ, карты 1для [1, 1], 2чтобы [1, 2], 3к [2, 1]и т.д. По сути, это находит индекс каждую пару из массива сортируется-по-суммы в отсортированном-лексикографический массиве
Dennis


7

R , 101 60 54 байта

function(M,N)matrix(rank(outer(1:M,1:N,"+"),,"l"),M,N)

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

Спасибо @nwellnhof за предложение rank

Порты Дениса Желе отвечают .

Старый ответ, 101 байт:

function(M,N)matrix(unsplit(lapply(split(1:(M*N),unlist(split(x,x))),rev),x<-outer(1:M,1:N,"+")),M,N)

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

splitделает большую часть работы здесь; возможно, есть алгоритм игры в гольф, но это определенно работает.

Объяснение:

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
}

Попробуйте онлайн! - вы можете использовать обтекание printвокруг любой из правых сторон заданий, <-чтобы увидеть промежуточные результаты без изменения конечного результата, поскольку printвозвращает его входные данные.


1
Можете ли вы добавить некоторые объяснения, пожалуйста?
Луис Фелипе Де Иисус Муньос

1
@LuisfelipeDejesusMunoz добавлен. Если что-то неясно, дайте мне знать, и я постараюсь уточнить.
Джузеппе

1
rank(x,1,"f")на 2 байта короче order(order(x)).
nwellnhof

@nwellnhof О, очень хорошо, но использование rank(x,,"l")избавит и от t.
Джузеппе

6

Java 10, 121 120 109 105 байт

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;}

-11 байт благодаря @ OlivierGrégoire .
-4 байта благодаря @ceilingcat .

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

Объяснение:

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

Я понял, что сначала нужны столбцы, а затем строки.
Луис Фелипе Де Иисус Муньос

@ Луис Я думаю, что принято считать координаты как x,y/width,height
Джо Кинг,


5

J 15 байт

$1(+/:@;)</.@i.

-4 больше байтов для этого решения в милях. Благодарность!

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

J , 22 19 байт

-3 байта благодаря FrownyFrog!

,$[:>:@/:@/:@,+/&i.

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

Реализация фантастического решения Jelly от Dennis в J.

Объяснение:

Диадический глагол, принимает левый и правый аргумент (mfn)

+/&i. создает списки 0..m-1 и 0..n-1 и создает для них таблицу дополнений:

   3 +/&i. 5
0 1 2 3 4
1 2 3 4 5
2 3 4 5 6

[:>:@/:@/:@, выравнивает таблицу, дважды оценивает список и добавляет к нему 1:

   3 ([:>:@/:@/:@,+/&i.) 5
1 2 4 7 10 3 5 8 11 13 6 9 12 14 15

,$ изменяет список обратно в таблицу mxn:

   3 (-@],\[:>:@/:@/:@,+/&i.) 5
1 2  4  7 10
3 5  8 11 13
6 9 12 14 15

1
-@],\,$для −3 байта.
FrownyFrog

@FrownyFrog - Конечно, я чувствую себя глупо, теперь это так неприятно. Спасибо!
Гален Иванов

1
15 байтов $1(+/:@;)</.@i.с вводом в виде массива[r, c]
мили

@Miles: Очень круто, спасибо! Я пытался, /.но не смог достичь твоего результата :)
Гален Иванов

4

APL + WIN, 38 или 22 байта

Запрашивает целочисленный столбец ввода, а затем строку:

m[⍋+⌿1+(r,c)⊤m-1]←m←⍳(c←⎕)×r←⎕⋄(r,c)⍴m

или:

(r,c)⍴⍋⍋,(⍳r←⎕)∘.+⍳c←⎕

основанный на двойном применении Денниса. Пропустил это :(


1
Извините за вопрос, но где-нибудь я могу это проверить?
Луис Фелипе Де Иисус Муньос

@Luis felipe De jesus Munoz Нет проблем. APL + WIN не доступен в режиме онлайн, но вы можете протестировать его на веб-сайте Dyalog по адресу tryapl.org, если вы замените символы with целыми числами по вашему выбору.
Грэм

4

Wolfram Language (Mathematica) , 73 67 байт

Количество элементов в строках выше: Min[j+k,#2]~Sum~{k,i-1}

Количество элементов в текущей строке и ниже: Max[j-k+i-1,0]~Sum~{k,i,#}

Положите в таблицу и добавьте 1. Вуаля:

1+Table[Min[j+k,#2]~Sum~{k,i-1}+Max[j-k+i-1,0]~Sum~{k,i,#},{i,#},{j,#2}]&

Обновление: я понял, что есть более короткий способ подсчитать все позиции перед обычно указанной позицией в матрице с одной суммой по двум измерениям:

Table[1+Sum[Boole[s-i<j-t||s-i==j-t<0],{s,#},{t,#2}],{i,#},{j,#2}]&

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

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




2

Python 3 , 164 байта

from numpy import*
r=range
def h(x,y):
 a,i,k,j=-array([i//y+i%y for i in r(x*y)]),1,2,0
 while j<x+y:a[a==-j],i,k,j=r(i,k),k,k+sum(a==~j),j+1
 a.shape=x,y;return a

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

Это определенно не самое короткое решение, но я подумал, что это было забавное решение.


from numpy import*и падение обоих n.немного короче. Кроме того, вы можете оставить место на ) for. А переход на Python 2 позволяет вам перейти return aна print a(в Python 3 это будет тот же счетчик байтов print(a)).
Кевин Круйссен

Благодарность! Я должен был подумать import*. Я никогда не буду бить ответ Денниса, поэтому я буду придерживаться Python 3.
maxb


2

Japt , 25 24 байта

Вряд ли элегантно, но выполняет свою работу. Работать с 2D-данными в Japt сложно.

;N×Ç<U©Ap[] A®Ê<V©Zp°T
A

;                      // Set alternative default vars where A is an empty array.
 N×Ç                   // Multiply the inputs and map the range [0..U*V).
    <U                 // If the current item is less than the second input,
      ©Ap[]            // add a new empty subarray into A.
            A®         // Then, for each item in A,
              Ê<V      // if its length is less than the first input,
                 ©Zp°T // Add the next number in the sequence to it.
A                      // Output the results, stored in A.

Я добавил -Qфлаг в TIO для облегчения визуализации результатов, это не влияет на решение.
Откусил один байт благодаря Оливеру .

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


Говоря о ×, вы можете заменить *V на .
Оливер

1
@ Оливер А вот и я, думая, что ярлык удобен, но не является распространенным случаем. Большое спасибо!
Нить


2

TI-Basic, 76 байт

Prompt A,B
{A,B🡒dim([A]
1🡒X
For(E,1,B+A
For(D,1,E
If D≤A and E-D<B
Then
X🡒[A](D,E-D+1
X+1🡒X
End
End
End
[A]

Запрашивает ввод данных пользователем, возвращает матрицу Ansи печатает ее.

TI-Basic - это токенизированный язык ; все токены, используемые здесь, являются одним байтом, отличным от [A]которого является 2 байта.

Примечание: TI-Basic (по крайней мере, на TI-84 Plus CE) поддерживает только матрицы размером до 99x99, как и эта программа.

Объяснение:

Prompt A,B        # 5 bytes, prompt for user input
{A,B🡒dim([A]      # 9 bytes, make the matrix the right size
1🡒X               # 4 bytes, counter variable starts at 1
For(E,1,B+A       # 9 bytes, Diagonal counter, 1 to A+B-1, but we can over-estimate since we have to check later anyway.
For(D,1,E         # 7 bytes, Row counter, 1 to diagonal count
If D≤A and E-D<B  # 10 bytes, Check if we are currently on a valid point in the matrix
Then              # 2 bytes, If so,
X🡒[A](D,E-D+1     # 13 bytes, Store the current number in the current point in the matrix
X+1🡒X             # 6 bytes, Increment counter
End               # 2 bytes, End dimension check if statement
End               # 2 bytes, End row for loop
End               # 2 bytes, End dimension for loop
[A]               # 2 bytes, Implicitly return the matrix in Ans and print it


2

Java (JDK 10) , 142 131 байт

X->Y->{var A=new int[X][Y];int E=1;for(int y=0;y<Y+X-1;y++)for(int x=0;x<X;x++){if(y-x<0|y-x>Y-1)continue;A[x][y-x]=E++;}return A;}

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

Объяснение:

X->Y->{                            // Method with two integer parameters and integer-matrix return-type
    var A=new int[X][Y];           // The Matrix with the size of X and Y
    int E=1;                       // It's a counter
        for(int y=0;y<Y+X-1;y++)   // For each column plus the number of rows minus one so it will run as long as the bottom right corner will be reached
            for(int x=0;x<X;x++){  // For each row
                if(y-x<0|y-x>Y-1)  // If the cell does not exist becouse it's out of range
                    continue;      // Skip this loop cycle
                A[x][y-x]=E++;     // Set the cell to the counter plus 1
            }
    return A;                      // Return the filled Array
}

Большое спасибо Кевину Круйссену, потому что я не знал, как запустить мой код на tio .
У него украден некоторый код, такой как верхний и нижний колонтитулы. -> Его ответ




1

PHP, 115 байт

довольно ленивый подход; вероятно, не самое короткое из возможных.

function($w,$h){for(;$i++<$h*$w;$r[+$y][+$x]=$i,$x--&&++$y<$h||$x=++$d+$y=0)while($x>=$w|$y<0)$y+=!!$x--;return$r;}

анонимная функция, принимает ширину и высоту в качестве параметров, возвращает 2d матрицу

попробуйте это онлайн



1

Атташе , 45 байт

{Chop[Grade//2<|Flat!Table[`+,1:_2,1:_],_]+1}

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

Анонимная лямбда, где переключаются параматоры. Это можно исправить за +1 байт, ~предварительно добавив в программу. Набор тестов уже делает это.

объяснение

Этот подход аналогичен J ответ и ответ желе .

Первая идея заключается в создании таблицы значений:

Table[`+,1:_2,1:_]

Это создает таблицу сложения, используя диапазоны обоих входных параметров. Для ввода [5, 3]это дает:

A> Table[`+,1:3,1:5]
 2 3 4 5 6
 3 4 5 6 7
 4 5 6 7 8

Затем мы сгладим это с помощью Flat!:

A> Flat!Table[`+,1:3,1:5]
[2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]

Используя подход в ответе J, мы можем классифицировать массив (то есть возвращать индексы отсортированных значений) дважды, используя Grade//2:

A> Grade//2<|Flat!Table[`+,1:3,1:5]
[0, 1, 3, 6, 9, 2, 4, 7, 10, 12, 5, 8, 11, 13, 14]

Затем нам нужно правильно подрезать значения, как в ответе Jelly. Мы можем вырезать все _элементы, чтобы сделать это:

A> Chop[Grade//2<|Flat!Table[`+,1:3,1:5],5]
 0 1  3  6  9
 2 4  7 10 12
 5 8 11 13 14

Затем нам просто нужно компенсировать 0-индексирование Attache с помощью +1:

A> Chop[Grade//2<|Flat!Table[`+,1:3,1:5],5]+1
 1 2  4  7 10
 3 5  8 11 13
 6 9 12 14 15

И, таким образом, у нас есть результат.


1

Python 3 , 259 байт

Так что я сделал это странным образом. Я заметил, что в образе массива было два паттерна.

Первый , как шаблон верхних строк имеет разницу между каждым членом, увеличивающимся от 1 до> h, где h - высота, а l - длина. Поэтому я строю верхнюю строку на основе этого шаблона

Для матрицы дим (3,4), дающей max RoC = 3мы увидим верхний ряд вида

1, (1+1), (2+2), (4+3) = 1, 2, 4, 7

Предположим вместо этого, что дим (3,9), дающий max RoC = 3мы вместо этого увидим верхний ряд

`1, (1+1), (2+2), (4+3), (7+3), (10+3), (13+3), (16+3), (19+3) = 1, 2, 4, 7, 10, 13, 16, 19, 22

Второй шаблон - это то, как строки меняются друг от друга. Если мы рассмотрим матрицу:

1   2   4   7   11
3   5   8   12  16
6   9   13  17  20
10  14  18  21  23
15  19  22  24  25

и вычитая каждую строку из строки ниже (игнорируя дополнительную строку), мы получаем

2 3 4 5 5
3 4 5 5 4
4 5 5 4 3
5 5 4 3 2

Увидев эту матрицу, мы можем заметить, что эта матрица - это последовательность, в 2 3 4 5 5 4 3 2которой каждой строкой является 5 членов этого шаблона, сдвинутых на 1 для каждой строки. Смотрите ниже для визуального.

         |2 3 4 5 5| 4 3 2
       2 |3 4 5 5 4| 3 2
     2 3 |4 5 5 4 3| 2
   2 3 4 |5 5 4 3 2|

Таким образом, чтобы получить окончательную матрицу, мы берем нашу первую созданную строку и выводим эту строку с добавлением 5 необходимых терминов этого шаблона.

Эта картина всегда будет иметь характеристики начала 2-> max valueи окончания , max value -> 2где max value = min(h+1, l)и сколько раз , что максимальное значение будет отображаться в appearances of max = h + l -2*c -2которомc = min(h+1, l) - 2

Так что в целом мой метод создания новых строк выглядит так

1  2  3  7  11 +      |2 3 4 5 5|4 3 2  = 3  5  8  12 16

3  5  8  12 16 +     2|3 4 5 5 4|3 4 2  = 6  9  13 17 20

6  9  13 17 20 +   2 3|4 5 5 4 3|4 2    = 10 14 18 21 23

10 14 18 21 23 + 2 3 4|5 5 4 3 2|       = 15 19 22 24 25

Соответствующий код ниже. Это не было коротким, но мне все еще нравится метод.

o,r=len,range
def m(l,h):
 a,t=[1+sum(([0]+[x for x in r(1,h)]+[h]*(l-h))[:x+1]) for x in r(l)],min(l,h+1);s,c=[x for x in r(2,t)],[a[:]]
 for i in r(h-1):
  for j in r(o(a)):
   a[j]+=(s+[t]*(l+h-2*(t-2)-2)+s[::-1])[0+i:l+i][j]
  c+=[a[:]]
 for l in c:print(l)

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


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.