Matrice in ordine di "barra"


23

Dati due numeri positivi N >= 2e N <= 100crea una matrice che segue le seguenti regole:

  • Il primo numero inizia dalla posizione [0,0]
  • Il secondo numero inizia dalla posizione [0,1]
  • Il terzo numero scende sotto il primo numero (posizione [1,0])
  • I seguenti numeri vanno nella direzione "barra"
  • L'intervallo di numeri utilizzati è [1, N1 * N2]. Quindi, i numeri vanno dall'inizio 1 al risultato della moltiplicazione di entrambi gli ingressi.

Ingresso

  • Due numeri N >= 2e N <= 100. Il primo numero è la quantità di righe, il secondo numero è la quantità di colonne.

Produzione

  • Matrice. (Può essere emesso come un array multidimensionale o una stringa con interruzioni di riga)

Esempio:

Dato l' 3 and 5output dei numeri :

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

Numeri dati 2 and 2

1   2
3   4

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

Vince il codice più breve in byte.


2
Possiamo usare l'indicizzazione 0 per uno qualsiasi dei numeri?
Jo King,

2
@JoKing No. Deve iniziare alle 1.
Luis felipe De jesus Munoz,


1
@LuisfelipeDejesusMunoz Forse un termine migliore per l'ordine è "diagonali"? Personalmente, lo definirei un "zig-zag", perché mi ricorda la prova Zig-Zag di Cantor, ma ciò potrebbe confondere.
mbomb007,

2
@LuisfelipeDejesusMunoz anti-diagonal è il termine per l'altra diagonale.
qwr

Risposte:


21

Gelatina , 6 5 byte

pSÞỤs

Provalo online!

Come funziona

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.

Dannazione. Il mio è di oltre 200 byte. Puoi aggiungere qualche spiegazione?
Luis felipe De jesus Munoz,

3
Dannazione, Dennis. Inoltre, buon lavoro.
Nit

6
Wow, è troppo "strettamente correlato". È identico al primo link nella risposta di miglia . Prendi in considerazione l'upgrade di entrambi. :)
user202729

1
Penso che potrebbe essere possibile farlo con <atom><atom>¥þma non riesco a trovare la giusta combinazione. oþ++þè vicino ma non ci arriva abbastanza
dylnan,

1
@akozi Finora tutto bene. Gli indici dell'array ordinato sono [1, 2, 3, 4, 5, 6]. ordina questo array, usando la chiave che mappa 1a [1, 1], 2a [1, 2], 3a [2, 1], ecc. Fondamentalmente, trova l'indice di ogni coppia dall'array ordinato per somma nell'array lessicograficamente ordinato
Dennis


7

R , 101 60 54 byte

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

Provalo online!

Grazie a @nwellnhof per il suggerimento di rank

Ports Dennis 'Jelly risponde .

Vecchia risposta, 101 byte:

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

Provalo online!

splitsta facendo la maggior parte del lavoro qui; forse c'è un algoritmo golfista ma questo sicuramente funziona.

Spiegazione:

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
}

Provalo online! - puoi utilizzare un printgiro attorno a uno dei lati destri delle assegnazioni <-per vedere i risultati intermedi senza modificare il risultato finale, poiché printrestituisce il suo input.


1
Puoi aggiungere qualche spiegazione?
Luis felipe De jesus Munoz,

1
@LuisfelipeDejesusMunoz aggiunto. Se c'è qualcosa di poco chiaro, fammi sapere e cercherò di chiarire.
Giuseppe,

1
rank(x,1,"f")è di 2 byte più breve di order(order(x)).
nwellnhof,

@nwellnhof oh, molto bello, ma usando rank(x,,"l")lo sbarazzeremo anche di quello t.
Giuseppe,

6

Java 10, 121 120 109 105 byte

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 byte grazie a @ OlivierGrégoire .
-4 byte grazie a @ceilingcat .

Provalo online.

Spiegazione:

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

Mi sono reso conto che questo richiede prima le colonne e poi le righe.
Luis felipe De jesus Munoz,

@ Luis Penso che sia convenzione prendere le coordinate come x,y/width,height
Jo King,


5

J , 15 byte

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

-4 più byte per questa soluzione per miglia. Grazie!

Provalo online!

J , 22 19 byte

-3 byte grazie a FrownyFrog!

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

Provalo online!

Un'implementazione della fantastica soluzione Jelly di Dennis in J.

Spiegazione:

Verbo diadico, prende l'argomento left e right (mfn)

+/&i. crea liste 0..m-1 e 0..n-1 e crea una tabella addizionale per loro:

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

[:>:@/:@/:@, appiattisce la tabella e classifica l'elenco due volte e ne aggiunge 1:

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

,$ rimodella l'elenco di nuovo nella tabella mxn:

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

1
-@],\,$per −3 byte.
FrownyFrog,

@FrownyFrog - Certo, mi sento stupido, ora è così ovvio. Grazie!
Galen Ivanov,

1
15 byte $1(+/:@;)</.@i.con input come array[r, c]
miglia

@miles: Molto bello, grazie! Ho provato /.ma non sono riuscito a ottenere il tuo risultato :)
Galen Ivanov,

4

APL + WIN, 38 o 22 byte

Richiede una colonna di input per numeri interi, quindi riga:

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

o:

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

basato sulla doppia applicazione di Dennis del grado superiore. Perso che :(


1
Ci scusiamo per la domanda, ma c'è un posto dove posso provarlo?
Luis felipe De jesus Munoz,

@Luis felipe De jesus Munoz Nessun problema. APL + WIN non è disponibile on line ma puoi provarlo sul sito Dyalog su tryapl.org se sostituisci i caratteri ⎕ con gli interi di tua scelta.
Graham,

4

Wolfram Language (Mathematica) , 73 67 byte

Conta gli elementi nelle righe sopra: Min[j+k,#2]~Sum~{k,i-1}

Conta gli elementi nella riga corrente e in basso: Max[j-k+i-1,0]~Sum~{k,i,#}

Inserisci in un tavolo e aggiungi 1. Voila:

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

Aggiornamento: ho capito che esiste un modo più breve per contare tutte le posizioni prima di una posizione normalmente specificata nella matrice con una sola somma su due dimensioni:

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

Provalo online!

Provalo online!




2

Python 3 , 164 byte

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

Provalo online!

Questa non è sicuramente la soluzione più breve, ma ho pensato che fosse divertente.


from numpy import*e far cadere entrambi n.è leggermente più breve. Inoltre, puoi rilasciare lo spazio in ) for. E passare a Python 2 ti permette di cambiare return aa print a(in Python 3 sarebbe lo stesso conteggio byte print(a)).
Kevin Cruijssen,

Grazie! Avrei dovuto pensarci import*. Non batterò mai la risposta di Dennis, quindi mi
atterrò

2

Python 2 , 93 byte

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

Provalo online!

Versione Semi-Ungolfed:

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 byte

Difficilmente elegante, ma fa il suo lavoro. Lavorare con i dati 2D in Japt è complicato.

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

Ho aggiunto il -Qflag in TIO per una visualizzazione più semplice dei risultati, non influisce sulla soluzione.
Bit off di un byte grazie a Oliver .

Provalo online!


A proposito ×, puoi sostituirlo *V con .
Oliver,

1
@Oliver Ed eccomi qui, pensando che la scorciatoia sia utile, ma non un caso d'uso comune. Molte grazie!
Nit


2

TI-Basic, 76 byte

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]

Richiede l'input dell'utente e restituisce la matrice Anse la stampa.

TI-Basic è un linguaggio tokenizzato ; tutti i token utilizzati qui sono un byte, a parte il [A]quale è 2 byte.

Nota: TI-Basic (almeno sulla TI-84 Plus CE) supporta solo matrici fino a 99x99, così come questo programma.

Spiegazione:

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 byte

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

Provalo online!

Spiegazione:

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
}

Un grande ringraziamento a Kevin Cruijssen perché non sapevo come eseguire il mio codice su tio .
Alcuni codici come l'intestazione e il piè di pagina gli vengono rubati. -> La sua risposta




1

PHP, 115 byte

un approccio piuttosto pigro; probabilmente non il più breve possibile.

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

funzione anonima, accetta larghezza e altezza come parametri, restituisce matrice 2d

provalo online



1

Attache , 45 byte

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

Provalo online!

Lambda anonimo, dove vengono scambiati i parametri. Questo può essere corretto per +1 byte, anteponendo ~al programma. La suite di test lo fa già.

Spiegazione

Questo approccio è simile alla risposta J e alla risposta Jelly .

La prima idea è quella di generare una tabella di valori:

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

Questo genera una tabella di addizione utilizzando intervalli di entrambi i parametri di input. Per input [5, 3], questo dà:

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

Quindi, lo appiattiamo con Flat!:

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

Usando l'approccio nella risposta J, possiamo valutare due volte l'array (ovvero, restituire indici di valori ordinati), con 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]

Quindi, dobbiamo tagliare i valori correttamente, come nella risposta Jelly. Possiamo tagliare tutti gli _elementi per fare questo:

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

Quindi, dobbiamo solo compensare l'indicizzazione 0 di Attache con +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

E quindi abbiamo il risultato.


1

Python 3 , 259 byte

Quindi l'ho fatto in un modo strano. Ho notato che c'erano due modelli nel modo in cui l'array si forma.

Il primo è come il modello delle righe superiori ha la differenza tra ogni termine che aumenta da 1 -> h dove h è l'altezza e l è la lunghezza. Quindi costruisco la riga superiore in base a quel modello

Per una matrice di dim (3,4) che dà un max RoC = 3Vedremo la prima fila del modulo

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

Supponiamo invece che il dim (3,9) che dà un max RoC = 3vedremo invece una riga superiore di

`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

Il secondo modello è come le righe cambiano l'una dall'altra. Se consideriamo la matrice:

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

e sottrarre ogni riga dalla riga sottostante (ignorando la riga aggiuntiva) che otteniamo

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

Vedendo questa matrice possiamo notare che questa matrice è la sequenza in 2 3 4 5 5 4 3 2cui per ogni riga è 5 termini di questo modello spostato di 1 per ogni riga. Vedi sotto per visual.

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

Quindi per ottenere la matrice finale prendiamo la nostra prima riga che abbiamo creato e prodotto quella riga aggiunta con i 5 termini necessari di questo modello.

Questo modello avrà sempre le caratteristiche di inizio 2-> max valuee fine in max value -> 2cui il max value = min(h+1, l)e il numero di volte in cui apparirà il valore massimo è appearances of max = h + l -2*c -2dovec = min(h+1, l) - 2

Quindi nel complesso il mio metodo per creare nuove righe sembra

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

Codice pertinente di seguito. Non è finito per essere breve ma mi piace ancora il metodo.

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)

Provalo online!


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.