Matrici crollanti


18

Correlati: Progettiamo un mosaico di cifre , Stampa / Stampa L-phabet . Post sandbox qui

Dato 2 ingressi C = columns and rows, S = starting pointemettono una matrice come segue:

Input 4, 3

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Spiegazione

Dato C = 4, S = 3

1) Crea una C x Cmatrice riempita con0

         4 columns
4     _____|____
     |          |
r  --0  0   0   0
o |  0  0   0   0
w |  0  0   0   0
s  --0  0   0   0

2) Riempi con i Svalori all'interno di riga e colonna S, quindi sottrai 1 da Se ripeti fino a S = 0. Questo casoS = 3

             Column 3 
S = 3           |
                v
        0   0   3   0
        0   0   3   0
Row 3-->3   3   3   0
        0   0   0   0


         Column 2
S = 2       |
            v
        0   2   3   0
Row 2-->2   2   3   0
        3   3   3   0
        0   0   0   0


     Column 1
S=1     |
        v
Row 1-->1   2   3   0
        2   2   3   0
        3   3   3   0
        0   0   0   0



Final Result

1   2   3   0
2   2   3   0
3   3   3   0
0   0   0   0

Regole

  • Assumere C >= S >= 0
  • L'output può essere una matrice, un elenco di elenchi, una matrice (monodimensionale o bidimensionale) ecc.
  • È possibile accettare input tramite qualsiasi formato I / O predefinito
  • Il tuo programma, funzione, ecc ... può essere 1-indicizzazione o 0-indicizzazione. Si prega di specificare quale è.

Nota La spiegazione è 1-indicizzazione


Criteri vincenti

Risposte:


6

Gelatina , 8 byte

»>⁴¬×»µþ

Provalo online!

Come funziona

Jelly's Outer Product Atom ( þ)

Puoi pensare all'atomo del prodotto esterno di Jelly þ, come un rapido (operatore) che, dati gli argomenti interi e Y (in questo caso X = Y = primo argomento  ), produce la seguente matrice di tuple:XYX=Y=first argument 

[(1,1)(2,1)(3,1)(X,1)(1,2)(2,2)(3,2)(X,2)(1,Y)(2,Y)(3,Y)(X,Y)]

Applica anche il collegamento prima di esso a tutte le coppie, chiamiamolo , che si comporta come una funzione che accetta due argomenti, producendo qualcosa del genere:f

[f(1,1)f(2,1)f(3,1)f(X,1)f(1,2)f(2,2)f(3,2)f(X,2)f(1,Y)f(2,Y)f(3,Y)f(X,Y)]

In che modo è rilevante per l'attività in corso?

Questo funziona notando che ogni valore nell'output atteso è solo una tabella di indici massimi, o se questo massimo supera il nostro secondo argomento. Pertanto, possiamo creare il seguente link per eseguire questa mappatura:0

»>⁴¬×» – Dyadic (2-argument) link.
»      – Maximum of the X, Y coordinates.
 >⁴    – Check if this exceeds the second argument of the program.
   ¬   – Negate this boolean.
    ×» – And multiply by the maximum, computed again.

6

R , 47 41 byte

function(C,S,m=outer(1:C,1:C,pmax))m*!m>S

Provalo online!

1-indicizzati. Genera gli output per S==C(senza zeri) quindi azzera le celle che hanno un valore >Sutilizzando la moltiplicazione della matrice (grazie Giuseppe per 4 byte!).


! Neat la moltiplicazione ti farà ottenere un buon chilometraggio: 43 byte
Giuseppe

@Giuseppe tx! Sono stato in grado di salvare altri due :)
JayCe


5

Haskell , 47 45 byte

-2 byte modificando il formato di output in un elenco monodimensionale.

c&s|x<-[1..c]=[sum[j|j<=s]|j<-x>>=(<$>x).max]

Provalo online!

Spiegazione

Il termine x >>= (<$> x) . maxè una versione giocata a golf di

concat [ max i <$> x | i <- x ]

che valuta [1,2,3,4..c, 2,2,3,4..c, 3,3,3,4..c, ..., c,c,c,c..c]. Ora abbiamo solo bisogno di forzare i valori 0una volta che superano i squali raggiungiamo sum [ j | j <= s].



3

APL (Dyalog) , 12 byte

o×⎕≥o←∘.⌈⍨⍳⎕

Provalo online!


Sarebbe o×⎕≥o←∘.⌈⍨⍳permesso qualcosa del genere , o dovresti assegnarlo a una funzione per poter contare?
Zacharý,

@ Zacharý la mia ipotesi è che uno dovrebbe essere messo in un tradfn con un argomento o un dfns
Uriel

3

JavaScript (ES6), 61 byte

Accetta input nella sintassi del curry (c)(s), dove s è 1 indicizzato. Restituisce un array monodimensionale.

c=>s=>[...Array(c*c)].map((_,k)=>(k=k%c>k/c?k%c:k/c)<s?-~k:0)

Provalo online!


3

Gelatina , 6 byte

⁴Ri»µþ

Un programma completo * che accetta numeri interi Ce Sche stampa la rappresentazione Jelly di un elenco di elenchi di numeri interi come definito (1-indicizzato).

Provalo online! (formatta il risultato della diade come una griglia di numeri per facilitare la lettura)

Come?

⁴Ri»µþ - Main Link: C, S
     þ - outer product with:
    µ  -   the monadic function (i.e. f(x,y) for x in [1..C] for y in [1..C]):
   »   -     maximum (of x and y)
⁴      -     program's 4th argument = 2nd input = S
 R     -     range = [1,2,3,...S]
  i    -     first index of (the maximum) in (the range) or 0 if not found
       - as a full program: implicit print

* Il motivo per cui questo è un programma completo è giù per l'uso della connessione argomentazione programma . Come collegamento diadico questo codice si baserebbe su come viene chiamato il programma che lo sta utilizzando.
Collegamento diadico riutilizzabile in 8 byte (prendendo S a sinistra e C a destra): collegamento diadico riutilizzabile in 8 byte (prendendo C a sinistra e S a destra):RiⱮⱮ»þ`}
RiⱮⱮ⁹»þ¤


2

Java 10, 88 byte

C->S->{var r=new int[C][C];for(;S>0;)for(int s=S--;s-->0;)r[S][s]=r[s][S]=S+1;return r;}

Provalo online.

Spiegazione:

C->S->{                     // Method with two int parameters and int-matrix return-type
  var r=new int[C][C];      //  Result-matrix of size `C` by `C`
  for(;S>0;)                //  Loop as long as `S` is not 0 yet:
    for(int s=S--;s-->0;)   //   Inner loop `s` in the range (`S`, 0]
                            //   (and decrease `S` by 1 in the process with `S--`)
      r[S][s]=r[s][S]=S+1;  //    Set the values at both {`S`,`s`} and {`s`,`S`} to `S+1`
  return r;}                //  Return the result

2

PHP , 92 byte

Questo è "1-indicizzazione".

<?list(,$c,$s)=$argv;for(;$i++<$c;print"\n")for($j=0;$j++<$c;)echo$s<$i||$s<$j?0:max($i,$j);

Per eseguirlo:

php -n <filename> <c> <s>

Esempio:

php -n collapsing_matrice.php 8 6

Oppure provalo online!


2

Stax , 10 byte

▓╜.→,cΘ○╤æ

Esegui ed esegui il debug

Come funziona:

R(Xm]i*xit+J Full program, implicit input.
R            1-based range of S
 (           Right-pad with zeroes to length C
  X          Save to X register
   m         Map (same as here):
    ]          Wrap in list
     i*        repeat by iteration index
       xit     Remove first  elements from X register
          +    Append
           J   Stringify each element, and join by space


2

Excel VBA, 65 byte

Una funzione finestra immediata che accetta input da [A1:B1] e output nell'intervallo [C1].Resize([A1],[A1]).

[C1].Resize([A1],[A1])=0:For s=-[B1]To-1:[C1].Resize(-s,-s)=-s:Next

Input Output

L'ingresso è nel range [A1:B1]

I/O



2

MATLAB, 58 byte (grazie all'utente anonimo)

function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:j,1:j)=j;end

Basta riempire gli elementi della matrice con il numero appropriato, eseguendo un ciclo. Forse è possibile essere più intelligenti conarrayfun


Non è necessario assegnare un nome alla funzione ed è possibile utilizzare zeros(c)quali casseforti di alcuni byte. Hai visto anche questa risposta di Ottava, immagino che funzionerebbe anche in Matlab?
ბიმო

@ OMᗺ Octave non puoi nominare variabili all'interno di funzioni anonime in matlab. Inoltre, max()devi prendere argomenti della stessa forma
aaaaa dice di ripristinare Monica il

1
Un utente anonimo ha suggerito function o=f(c,s);o=zeros(c);for j=s:-1:1;o(1:s,1:s)=j;end.
Jonathan Frech,

@JonathanFrech oh mio molto più semplice :-( devo solo essereo(1:j,1:j)=j
aaaaa dice di reintegrare Monica il



1

Carbone , 19 byte

Eθ⪫IEEθ⌈⟦ιλ⟧∧‹λη⊕λ 

Provalo online! Il collegamento è alla versione dettagliata del codice. 3 byte utilizzati per convertire l'output in decimale e formattarlo correttamente. Spiegazione:

 θ                  Input `C`
E                   Map over implicit range
      θ             Input `C`
     E              Map over implicit range
          λ         Inner index
         ι          Outer index
       ⌈⟦  ⟧        Maximium
    E               Map over results
              λ     Current value
               η    Input `S`
             ‹      Less than
                 λ  Current value
                ⊕   Incremented
            ∧       Logical AND
   I                Cast to string
  ⪫                 Join with spaces
                    Implicitly print on separate lines

1

Pulito , 67 byte

import StdEnv
$n s=[[if(i>s||j>s)0(max i j)\\i<-[1..n]]\\j<-[1..n]]

Provalo online!

Definisce $ :: Int Int -> [[Int]]dare una risposta usando l'indicizzazione basata su 1.



0

Mathematica 44 byte

Table[If[i <= s && j <= s, Max[i, j], 0], {i, c}, {j, c}]

Sei sicuro che lo spazio bianco sia necessario? Non posso testare Mathematica ma non credo che lo sia.
Wheat Wizard
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.