Codegolf — Матрица В Порядке «Косая Черта»

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

Даны два положительных числа

 
 
 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
 
and 5 and 5 создайте матрицу, которая следует следующим правилам:

  • Первый номер начинается с позиции 1 2 3 4
  • Второй номер начинается с позиции 2 and 2
  • Третий номер идет ниже первого номера (позиция 1 2 4 7 10 3 5 8 11 13 6 9 12 14 15 )
  • Следующие цифры идут в направлении «косой черты»
  • Используемый диапазон чисел: 3 and 5 . So, numbers goes from starting 1 to the result of the multiplication of both inputs.

Вход

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

Выход

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

Пример:

Данные числа [1, N1 * N2] output:

[1,0]

Данные числа [0,1]

[0,0]

Данные числа N <= 100

N >= 2

Выигрывает самый короткий код в байтах.

#код-гольф #матрица

Lestat0128


Рег
18 Feb, 2014

Тем
63

Постов
167

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

Желе, 6 5 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 r=[1..]
(#)=take
n!k=[[sum$lookup(i,j)$zip[(i,j)|s<-r,i<-n#r,j<-k#r,i+j==s]r|j<-k#r]|i<-n#r]
 

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

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

õ ïVõ)ñx £bYgUñ¹ÄÃòV ||answer||

Питон 3, 91 байт

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)

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

 

Vova zelenjuk


Рег
23 Oct, 2020

Тем
65

Постов
205

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

Р, 101 60 54 байта

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

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

Спасибо @nwellnhof за предложение c = min(h+1, l) - 2

Порты Ответ Денниса Джелли.

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

appearances of max = h + l -2*c -2

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

max value = min(h+1, l) is doing most of the work here; possibly there's a golfier algorithm but this definitely works.

Объяснение:

max value -> 2

Попробуйте онлайн! -- вы можете использовать обертку 2-> max value around any of the right-hand sides of the assignments |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| увидеть промежуточные результаты, не меняя конечного результата, т.к. 2 3 4 5 5 4 3 2 returns its input.

 

Pleshkovpa


Рег
14 Mar, 2013

Тем
80

Постов
175

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

Java 10, 121 120 109 105 байт

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

-11 байт благодаря @ОливьеГрегойр.
-4 байта благодаря @ceilingcat.

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

Объяснение:

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

Дж, 15 байт

`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

-еще 4 байта для этого решения на мили. Спасибо!

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

Дж, 22 19 байт

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

max RoC = 3

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

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

Объяснение:

Двойной глагол, принимает левый и правый аргумент (m f n)

1, (1+1), (2+2), (4+3) = 1, 2, 4, 7 creates lists 0..m-1 and 0..n-1 and makes an addition table for them:

max RoC = 3

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 flattens the table and grades the list twice and adds 1 to it:

+1

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 reshapes the list back into mxn table:

_ ||answer||

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

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

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

или:

Grade//2

на основе двойного заявления Денниса о повышении класса. Пропустил это :(

 

Cheapcarheh


Рег
14 May, 2016

Тем
68

Постов
220

Баллов
590
  • 26, Oct 2024
  • #5

Язык Wolfram (Математика), 73 67 байт

Подсчитайте элементы в строках выше: A> Flat!Table[`+,1:3,1:5] [2, 3, 4, 5, 6, 3, 4, 5, 6, 7, 4, 5, 6, 7, 8]

Подсчитайте элементы в текущей строке и ниже: Flat!

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

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

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

[5, 3]

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

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

 

Petyus


Рег
27 Aug, 2009

Тем
68

Постов
192

Баллов
552
  • 26, Oct 2024
  • #8

Питон 3, 164 байта

n=>(l=>{for(r=[];i<n*n;n*~-n/2+2>i?l++:l--*y++)for(T=y,t=l;t--;)r[T]=[...r[T++]||[],++i]})(y=i=0)||r

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

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

 

The_shade


Рег
09 Jun, 2004

Тем
76

Постов
189

Баллов
579
  • 26, Oct 2024
  • #9

Питон 2, 93 байта

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

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

Полу-Ungolfed версия:

CηÖ×,ḣ²ḣ⁰⁰ (Expanded; let N and K denote the arguments.) ηÖ Take the list of indices of the sorted values of ×, the list of all pairs taken from ḣ² the range from 1 to N and ḣ⁰ the range from 1 to K, and C ⁰ cut it into lengths of K. ||answer||

Япт, 25 24 байта

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

×

Я добавил ṠCoηÖ¤×,ḣ flag in TIO for easier visualization of the results, it doesn't affect the solution.
Откусил один байт благодаря Оливер.

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

 

Davcom


Рег
14 Dec, 2005

Тем
76

Постов
203

Баллов
613
  • 26, Oct 2024
  • #10

JavaScript (Node.js), 103 байта

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 }

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

 

RebeconnannyD


Рег
23 Oct, 2007

Тем
72

Постов
181

Баллов
551
  • 26, Oct 2024
  • #11

TI-Basic, 76 байт

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

Запрашивает ввод пользователя и возвращает матрицу в {($!={sort($_ Z=>1..*)>>.{*}})($!([X+] ^<<$_)).rotor(.[1])} and prints it.

TI-Basic — это токенизированный язык; все используемые здесь токены имеют размер одного байта, кроме 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 which is 2 bytes.

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

Объяснение:

[A] ||answer||

Перл 6, 61 59 байт

Ans

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

Еще один порт решения Dennis' Jelly.

 

Sztin10


Рег
20 Sep, 2008

Тем
66

Постов
202

Баллов
552
  • 26, Oct 2024
  • #12

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

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]

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

Объяснение:

(a,b,e=[...Array(b)].map(_=>[]))=>f=(x=0,y=i=0)=>(x<a&y<b&&(e[y][x]=++i),x?f(--x,++y):y>a+b?e:f(++y,0))

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

 

Amgot


Рег
30 Jul, 2013

Тем
78

Постов
210

Баллов
610
  • 26, Oct 2024
  • #13

Шелуха, 9 байт

-Q

Попробуйте онлайн! Большую часть тяжелой работы выполняют ;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. , which creates pairs in the desired order so that it can support infinite lists.

Объяснение

def f(b,a): i=1 o=[] for _ in range(a*b) if b: o+=[[]] b-=1 for l in o: if len(l)<a: l+=[i] i+=1 print o ||answer||

PHP, 115 байт

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

def f(b,a):i=1;o=[];exec"if b:o+=[],;b-=1\nfor l in o:k=len(l)<a;l+=[i]*k;i+=k\n"*a*b;print o

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

попробуй онлайн

 

Taras1406


Рег
01 Nov, 2019

Тем
67

Постов
204

Баллов
579
  • 26, Oct 2024
  • #15

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

*L<DΣ¹LILâOsè}UΣXsè}Á>ô

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

Анонимная лямбда, в которой переключаются параметры. Это можно исправить для +1 байта, добавив ↑⍳ to the program. The test suite does this already.

Объяснение

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

Первая идея — создать таблицу значений:

{⍵⍴⍋⍋∊+/↑⍳⍵}

При этом создается таблица сложения с использованием диапазонов обоих входных параметров. Для ввода Table[1+Sum[Boole[s-i<j-t||s-i==j-t<0],{s,#},{t,#2}],{i,#},{j,#2}]& , this gives:

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

Затем мы сглаживаем это с помощью Max[j-k+i-1,0]~Sum~{k,i,#} :

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

Используя подход, описанный в ответе J, мы можем дважды оценить массив (то есть вернуть индексы отсортированных значений), используя (r,c)⍴⍋⍋,(⍳r←⎕)∘.+⍳c←⎕ :

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

Затем нам нужно правильно разделить значения, как в ответе Джелли. Мы можем разрезать каждый 3 (-@],\[:>:@/:@/:@,+/&i.) 5 1 2 4 7 10 3 5 8 11 13 6 9 12 14 15 elements to do this:

,$

Тогда нам просто нужно компенсировать 0-индексацию Attache с помощью 3 ([:>:@/:@/:@,+/&i.) 5 1 2 4 7 10 3 5 8 11 13 6 9 12 14 15 :

[:>:@/:@/:@,

И вот мы имеем результат.

 

Macro4warface


Рег
12 Oct, 2013

Тем
81

Постов
219

Баллов
634
  • 26, Oct 2024
  • #16

Питон 3, 259 байт

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

Первый это то, как в шаблоне верхних строк разница между каждым термином увеличивается от 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)])

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

 

Cathy


Рег
01 Sep, 2011

Тем
61

Постов
184

Баллов
529
  • 26, Oct 2024
  • #17

Япт, 20 байт

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.

Попробуйте это

 

Nagavanes


Рег
29 Nov, 2019

Тем
88

Постов
212

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

Интересно