“Slash” sırasına göre matris


23

Verilen iki pozitif sayı N >= 2ve N <= 100aşağıdaki kuralları izleyen bir matris oluşturun:

  • İlk Numara pozisyonda başlıyor [0,0]
  • İkinci sayı pozisyonda başlıyor [0,1]
  • Üçüncü sayı İlk Numara'nın altına düşerse (konum [1,0] ) altında
  • Aşağıdaki sayılar "eğik çizgi" yönünde gider
  • Kullanılan sayı aralığı [1, N1 * N2]. Böylece sayılar 1'den başlayarak her iki girişin çarpımının sonucuna gider.

Giriş

  • İki sayı N >= 2ve N <= 100. İlk sayı satır miktarı, İkinci sayı sütun sayısıdır.

Çıktı

  • Matris. (Çok boyutlu bir dizi veya satır kesmeli bir dize olarak çıkarılabilir)

Örnek:

Verilen sayıların 3 and 5çıktısı:

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

Verilen sayılar 2 and 2

1   2
3   4

Verilen Sayılar 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

Bayt cinsinden en kısa kod kazanır.


2
Herhangi bir sayı için 0 indeksleme kullanabilir miyiz?
Jo King

2
@JoKing No. 1'den başlamalıdır.
Luis felipe De jesus Munoz


1
@ LouisfelipeDejesusMunoz Belki sipariş için daha iyi bir terim "köşegen" dir? Şahsen, bana "zig-zag" derdim, çünkü bana Cantor'un Zig-Zag kanıtını hatırlatıyor, ama bu kafa karıştırıcı olabilir.
mbomb007

2
@ LouisfelipeDejesusMunoz anti-diyagonal, diğer diyagonal için kullanılan terimdir.
qwr

Yanıtlar:


21

Jöle , 6 5 bayt

pSÞỤs

Çevrimiçi deneyin!

Nasıl çalışır

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.

Lanet olsun. Benimki 200 bayt. Bazı açıklamalar ekleyebilir misiniz pls?
Luis felipe De jesus Munoz

3
Allah kahretsin Dennis. Ayrıca, iyi iş.
Nit

6
Vay, bu çok "yakından ilişkili" dir. Bu, millerin cevabındaki ilk bağlantıyla aynı . Her ikisini de yükseltmeyi düşünün. :)
user202729

1
Bunu yapmanın mümkün olabileceğini düşünüyorum <atom><atom>¥þama doğru kombinasyonu bulamıyorum. oþ++þyakın, ancak oldukça oraya
gelmiyor

1
@ akozi Şimdiye kadar, çok iyi. Sıralanan dizinin indeksleri[1, 2, 3, 4, 5, 6] . eşleyen tuşunu kullanarak, bu diziyi sıralar 1için [1, 1], 2için [1, 2], 3için[2, 1] , vb Esasen, sıralanma-by-toplamlar diziden her çiftin endeks dizisi-sözlük sırasında sıralanmış bu bulgular
Dennis


7

R , 101 60 54 bayt

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

Çevrimiçi deneyin!

@Nwellnhof'a öneriniz için teşekkürler rank

Limanlar Dennis'in Jelly cevabı .

Eski cevap, 101 bayt:

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

Çevrimiçi deneyin!

splitburada işin çoğunu yapıyor; Muhtemelen bir golfçü algoritması var ama bu kesinlikle işe yarıyor.

Açıklama:

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
}

Çevrimiçi deneyin! - Son sonuçları değiştirmeden ara sonuçları görmek için girdilerin döndürüldüğü gibi ara sonuçları görmek için printödevlerin sağ taraflarından herhangi birinin çevresine sarma kullanabilirsiniz .<-print


1
Bazı açıklamalar ekleyebilir misiniz pls?
Luis felipe De jesus Munoz

1
@LuisfelipeDejesusMunoz eklendi. Belirsiz bir şey varsa, bana bildirin, ben de netleştirmeye çalışacağım.
Giuseppe

1
rank(x,1,"f")2 bayttan daha kısa order(order(x)).
nwellnhof

@nwellnhof oh, çok güzel, ama kullanarak rank(x,,"l")da kurtulacaksınız t.
Giuseppe

6

Java 10, 121 120 109 105 bayt

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

@ OlivierGrégoire sayesinde -11 bayt . @Ceilingcat
sayesinde -4 bayt .

Çevrimiçi deneyin.

Açıklama:

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

Bunun önce sütunları sonra da satırları aldığını fark ettim.
Luis felipe De jesus Munoz

Onun 'için kongre olarak koordinatlarını almak düşünüyorum @Luis x,y/width,height
Jo Kral


5

J , 15 bayt

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

-4 bu mil için daha fazla bayt. Teşekkürler!

Çevrimiçi deneyin!

J , 22 19 bayt

FrownyFrog sayesinde -3 bayt!

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

Çevrimiçi deneyin!

Dennis'in fantastik Jelly çözümünün J'deki uygulaması.

Açıklama:

Dyadic fiili, sol ve sağ argümanı alır (mfn)

+/&i. 0..m-1 ve 0..n-1 listelerini oluşturur ve onlar için bir ek tablosu yapar:

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

[:>:@/:@/:@, masayı düzleştirir ve listeyi iki kez derecelendirir ve ona 1 ekler:

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

,$ Listeyi tekrar mxn tablosuna yeniden şekillendirir:

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

1
-@],\,$by3 bayt için.
FrownyFrog

@ FrownyFrog - Tabii ki, kendimi aptal hissediyorum, şimdi çok iğrenç. Teşekkür ederim!
Galen Ivanov

1
$1(+/:@;)</.@i.Dizi olarak girdiyle 15 bayt[r, c]
mil

@miles: Çok havalı, teşekkürler! Denedim /.ama sonucunu elde edemedim :)
Galen Ivanov

4

APL + WIN, 38 veya 22 bayt

Tamsayı giriş sütunu istemi ve satır:

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

veya:

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

Dennis'in notu iki katına çıkarması üzerine kurulu. Kaçırdım ki :(


1
Soru için üzgünüm ama test edebileceğim bir yer var mı?
Luis felipe De jesus Munoz

@Luis felipe De jesus Munoz Sorun değil. APL + WIN çevrimiçi olarak mevcut değildir ancak ⎕ karakterlerini seçtiğiniz tamsayılarla değiştirirseniz tryapl.org'daki Dyalog web sitesinde test edebilirsiniz .
Graham,

4

Wolfram Dili (Mathematica) , 73 67 bayt

Yukarıdaki satırlardaki öğeleri say: Min[j+k,#2]~Sum~{k,i-1}

Geçerli satırdaki ve altındaki öğeleri say: Max[j-k+i-1,0]~Sum~{k,i,#}

Bir tabloya koyun ve 1 ekleyin.

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

Güncelleme: Matrisde normalde belirtilen bir pozisyonun önündeki tüm pozisyonları iki boyutun üzerinde bir toplamla saymanın daha kısa bir yolu olduğunu fark ettim:

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

Çevrimiçi deneyin!

Çevrimiçi deneyin!




2

Python 3 , 164 bayt

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

Çevrimiçi deneyin!

Bu kesinlikle en kısa çözüm değil, ama eğlenceli olduğunu düşündüm.


from numpy import*ve her ikisini de bırakmak n., biraz daha kısadır. Ayrıca, boşluğu bırakabilirsiniz ) for. Ve Python 2'ye değişen değiştirmek için izin verir return aiçin print a(Python 3'te aynı bayt sayısı olacaktır print(a)).
Kevin Cruijssen

Teşekkürler! Düşünmeliydim import*. Dennis'in cevabını asla yenemeyeceğim, bu yüzden Python 3'e bağlı kalacağım.
maxb

2

Python 2 , 93 bayt

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

Çevrimiçi deneyin!

Yarı Ungolfed versiyonu:

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

2

Japt , 25 24 bayt

Neredeyse zarif, ama işi halleder. Japt'ta 2D verilerle çalışmak zor.

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

-QSonuçları daha kolay görselleştirmek için bayrağı TIO’ya ekledim , bu çözümü etkilemiyor. Oliver
sayesinde bir byte ısırdı .

Çevrimiçi deneyin!


Bahsetmişken ×, o kadar değiştirebileceğiniz *V ile .
Oliver,

1
@Oliver Ve işte buradaydım, kısayolun kullanışlı olduğunu düşünmüştüm, fakat yaygın bir kullanım durumu değil. Çok teşekkürler!
Nit


2

TI-Basic, 76 bayt

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]

Kullanıcı girişi ister ve matrisi geri döndürür Ansve yazdırır.

TI-Basic belirtilmiş bir dildir ; Burada kullanılan tüm belirteçler bir bayt, diğeri [A]2 bayt.

Not: TI-Basic (en azından TI-84 Plus CE'de) yalnızca 99x99'a kadar matrisleri destekler ve bu program da öyledir.

Açıklama:

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 bayt

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

Çevrimiçi deneyin!

Açıklama:

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
}

Büyük teşekkür Kevin Cruijssen ayağımda kod çalıştırmasına bilmiyordu çünkü TiO .
Üstbilgi ve altbilgi gibi bazı kodlar ondan çalınmaktadır. -> Onun cevabı




1

PHP, 115 bayt

oldukça tembel bir yaklaşım; muhtemelen mümkün olan en kısa sürede değil.

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

anonim işlev, parametre olarak genişlik ve yüksekliği alır, 2d matrisini döndürür

çevrimiçi dene



1

Ataşesi , 45 bayt

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

Çevrimiçi deneyin!

Paramaterlerin değiştirildiği anonim lambda. Bu ~, programı hazırlayarak +1 bayt için düzeltilebilir . Test takımı bunu zaten yapıyor.

açıklama

Bu yaklaşım J cevabına ve Jelly cevabına benzer .

İlk fikir, bir değerler tablosu oluşturmaktır:

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

Bu, her iki giriş parametresinin aralığını kullanarak bir ek tablo oluşturur. Giriş için [5, 3]bu verir:

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

Daha sonra bunu şu şekilde düzeltiriz Flat!:

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

J cevabındaki yaklaşımı kullanarak, diziyi (sıralı değerlerin indekslerini döndürür) iki kere derecelendirebiliriz 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]

Daha sonra, Jelly cevaplarında olduğu gibi değerleri doğru bir şekilde kesmemiz gerekiyor. Bunu _yapmak için her elemanı kesebiliriz :

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

O zaman, sadece Attache'nin 0 indeksini telafi etmeliyiz +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

Ve sonuç bizde.


1

Python 3 , 259 bayt

Bu yüzden bunu garip bir şekilde yaptım. Dizinin oluşma şeklinde iki desen olduğunu fark ettim.

İlk , üst sıra deseninin her terim arasında 1 -> h'den artan farkın nasıl olduğu, h'nin yükseklik ve l'nin uzunluk olduğu. Bu yüzden, üst sırayı o desene göre yapıyorum

Bir dim matrisi için (3,4) vererek bir max RoC = 3formun en üst satırını göreceğiz.

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

Farz edelim ki (3,9) bir sönük bir max RoC = 3biz veriyoruz .

`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

İkinci desen, satırların birbirinden nasıl değiştiğidir. Matrisi göz önüne alırsak:

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

ve her satırı aşağıdaki satırdan çıkartın (fazladan satırı yok sayarak)

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

Bu matrisi görünce, bu matrisin, 2 3 4 5 5 4 3 2her bir sıranın 5 terim olduğu, her sıra için 1'lik kaydırılan dizilim olduğunu fark edebiliriz . Görsel için aşağıya bakınız.

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

Böylece son matrisi elde etmek için yarattığımız ilk sırayı alırız ve bu sıranın bu gerekli olan 5 terimiyle eklenen satırı çıkarırız.

Bu desen hep başlayan özelliklerine sahip olacağı 2-> max valueve bitiş max value -> 2nerede max value = min(h+1, l)maksimum değeri görünecektir alma sayısı ve olduğu appearances of max = h + l -2*c -2yerdec = min(h+1, l) - 2

Yani genel olarak yeni satırlar oluşturma yöntemime benziyor

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

Aşağıda ilgili kod. Kısa olmadı ama hala yöntemi sevdim.

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)

Çevrimiçi deneyin!


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.