Matrice da 1 a L (n), in tutte le n colonne


18

Sfida:

Prendi un elenco, L contenente numeri interi positivi come input:

3 5 2 1 6

e crea una matrice in cui l'ennesima colonna contiene il vettore 1: L (n) , in cui le righe più corte sono riempite di zeri.

Casi test:

3   5   2   1   6
-----------------
1   1   1   1   1
2   2   2   0   2
3   3   0   0   3
0   4   0   0   4
0   5   0   0   5
0   0   0   0   6

1
-
1

1   2   3   4   3   2   1
-------------------------
1   1   1   1   1   1   1
0   2   2   2   2   2   0
0   0   3   3   3   0   0
0   0   0   4   0   0   0

Regole:

  • Formati di input e output opzionali
    • L'elenco di elenchi è un formato di output accettabile
  • La matrice deve essere il più piccola possibile (non è possibile riempirla con più zeri del necessario)
  • Vince il codice più corto in ogni lingua
  • Le spiegazioni sono fortemente incoraggiate

Possiamo invece distribuire le gamme orizzontalmente?
Mr. Xcoder,

No, dovrebbero essere verticali. Se usi una lingua in cui le parole orizzontale / verticale non hanno alcun significato, allora è facoltativo. (Potrebbe essere pertinente per le lingue in cui gli elenchi di elenchi non sono associati a direzioni orizzontali / verticali)
Stewie Griffin

1
@StewieGriffin Quale linguaggio sensato non associa le dimensioni agli elenchi nidificati?
Erik the Outgolfer,

4
@EriktheOutgolfer, quante lingue folli vengono utilizzate su questo sito?
Stewie Griffin,

2
@EriktheOutgolfer R per uno non vede le matrici come un elenco nidificato, ma piuttosto un lungo elenco, che avvolge le righe.
JAD

Risposte:


18

R , 40 38 byte

function(l)outer(m<-1:max(l),l,"<=")*m

Provalo online!

Spiegazione:

outerapplica il suo terzo argomento (la funzione) a tutte le combinazioni di elementi dei suoi primi due argomenti, generando una matrice di TRUEe FALSEdove ogni colonna ha TRUEdove 1:max(l)è minore o uguale all'elemento corrispondente di l, per esempio dove l=c(3,5,2,1,6):

      [,1]  [,2]  [,3]  [,4] [,5]
[1,]  TRUE  TRUE  TRUE  TRUE TRUE
[2,]  TRUE  TRUE  TRUE FALSE TRUE
[3,]  TRUE  TRUE FALSE FALSE TRUE
[4,] FALSE  TRUE FALSE FALSE TRUE
[5,] FALSE  TRUE FALSE FALSE TRUE
[6,] FALSE FALSE FALSE FALSE TRUE

Quindi supponiamo che la matrice risultante sia A, quindi A*m-> A[i,j]=A[i,j]*iche costringe TRUEa 1 e FALSEa 0, producendo il risultato desiderato.


Penso - puoi salvare 2 byte, sostituendo function(l)conl=scan();
AndriusZ l'

@AndriusZ ma poi dovrei avvolgere tutto in printmodo da perdere quei byte.
Giuseppe,

Penso che non sia necessario avvolgere tutto - TOI
AndriusZ

2
@AndriusZ ne abbiamo sicuramente parlato prima. L'unica risposta a questa meta-domanda dà una penalità di +4 per l'utilizzo source(...,echo=TRUE)e la lettura di stdin come programma completo, se hai un suggerimento alternativo, sicuramente pesa lì, ma per quanto ne so è il più vicino che abbiamo ad un consenso R sui programmi completi e per il momento è valido.
Giuseppe,

In ritardo al gioco: salva due byte usando [questo suggerimento] ( codegolf.stackexchange.com/a/111578/80010 )
JayCe

7

MATL , 8 byte

"@:]Xho!

Provalo online!

Spiegazione

"      % Implicit input, L. For each k in L
  @    %   Push k
  :    %   Range [1 2 ... k]
]      % End
Xh     % Collect all stack contents in a cell array
o      % Convert to double matrix. The content of each cell is
       % right-padded with zeros if needed
!      % Transpose. Implicitly display


5

Mathematica, 20 byte

PadRight@Range@#&

Contiene U + F3C7 (integrato in Mathematica Transpose funzione )

Provalo su Wolfram Sandbox

uso

PadRight@Range@#&[{3, 5, 2, 1, 6}]
{
 {1, 1, 1, 1, 1},
 {2, 2, 2, 0, 2},
 {3, 3, 0, 0, 3},
 {0, 4, 0, 0, 4},
 {0, 5, 0, 0, 5},
 {0, 0, 0, 0, 6}
}

Spiegazione

PadRight@Range@#&

         Range@#    (* Generate {1..n} for all elements of input *)
PadRight@           (* Right-pad 0s so that all lists are equal length *)
                   (* Transpose the result *)

@downvoters perché i downvotes? Potresti spiegarlo?
JungHwan Min

Non ho effettuato il downgrade, ma sospetto che sia perché manchi la firma della funzione o un input di argomenti, il che fa sì che il tuo frammento di codice non sia una scatola nera!
sergiol,

5

Ottava , 26 byte

@(x)((y=1:max(x))'<=x).*y'

Funzione anonima che immette un vettore di riga e genera una matrice.

Provalo online!

Spiegazione

Considera l'input x = [3 5 2 1 6]. Questo è un vettore di riga di dimensioni 1 × 5.

1:max(x)fornisce il vettore riga [1 2 3 4 5 6], assegnato alla variabile y.

La trasposizione di ciò, vale a dire il vettore di colonna [1; 2; 3; 4; 5; 6], viene <=confrontata (in termini di elemento con broadcast) con l'input [3 5 2 1 6]. Il risultato è la matrice 6 × 5

[1 1 1 1 1;
 1 1 1 0 1;
 1 1 0 0 1;
 0 1 0 0 1;
 0 1 0 0 1;
 0 0 0 0 1]

Infine, la moltiplicazione (dal punto di vista dell'elemento con broadcast) per il vettore di colonna [1; 2; 3; 4; 5; 6], ottenuta come ytrasposta, dà il risultato desiderato:

[1 1 1 1 1;
 2 2 2 0 2;
 3 3 0 0 3;
 0 4 0 0 4;
 0 5 0 0 5;
 0 0 0 0 6]

1
Speravo di vedere una presentazione MATLAB / Octave. Ho implementato questo senza pensarci su, quindi probabilmente era più di 40 byte. Soluzione molto bella :)
Stewie Griffin


3

Buccia , 4 byte

Restituisce un elenco di elenchi

T0mḣ

Provalo online!

Spiegazione

  m    Map over the input
   ḣ   Range from 1 to n
T0     Transpose, padding with 0s

3

Pyth , 6 byte

.tSMQZ

Provalo qui! oppure Verifica tutti i casi di test (con pretty-print)!


Spiegazione

.tSMQZ - Programma completo.

  SMQ - Ottieni gli intervalli unari inclusi per ciascuno.
.t - Trasposizione, imbottitura con copie di ...
     Z - ... Zero.
         - Stampa implicita.

Una versione di trasposizione non incorporata sarebbe :

mm*hd<dkQeS

Funziona come segue:

mm*hd<dkQeS   - Full program.

m        eS   - Map over [0, max(input)) with a variable d.
 m      Q     - Map over the input with a variable k.
   hd         - d + 1.
  *           - Multiplied by 1 if...
     <dk      - ... d is smaller than k, else 0.
              - Output implicitly.


3

In realtà , 17 byte

;M╗♂R⌠╜;0@α(+H⌡M┬

Provalo online!

Spiegazione:

;M╗♂R⌠╜;0@α(+H⌡M┬
;M╗                store the maximal element (M) of the input in register 0
   ♂R              range(1, n+1) for each n in input
     ⌠╜;0@α(+H⌡M   for each range:
      ╜;0@α          push a list containing M 0s
           (+        append to range
             H       take first M elements
                ┬  transpose

Sì, in realtà ha davvero bisogno di zip con supporto per imbottitura ...
Erik the Outgolfer

2

Pyke , 3 byte

Questo utilizza la nuova funzionalità di Pyke, codifiche esadecimali ... La parte migliore è che leghiamo Jelly! Byte non elaborati:

4D 53 AC

Provalo qui!

L'equivalente ASCII-Pyke sarebbe di 4 byte :

MS.,

Come?

4D 53 AC - Programma completo.

4D - Mappa.
   53 - Gamma inclusiva.
      AC: trasporre con zero.
           - Uscita implicita.

-------------------------------------

MS., - Programma completo.

M - Mappa.
 S - Gamma inclusiva.
  ., - Trasposizione con zero.
       - Uscita implicita.

Ecco una versione piuttosto carina con ASCII, ed eccone una con codifiche esadecimali.


2

Perl 6 , 39 byte

{zip (1 X..$_).map:{|@_,|(0 xx.max-1)}}

Provalo

Allargato:

{                # bare block lambda with implicit parameter 「$_」

  zip

    (1 X.. $_)   # turn each input into a Range that starts with 1

    .map:        # map each of those Ranges using the following code

    {            # bare block lambda with implicit parameter 「@_」 
                 # (「@_」 takes precedence over 「$_」 when it is seen)

      |@_,       # slip the input into a new list

      |(         # slip this into the list

        0        # a 「0」
        xx       # list repeated by

          .max   # the max of 「$_」 (implicit method call)
          - 1    # minus 1 (so that zip doesn't add an extra row)
      )
    }
}

Si noti che ziptermina una volta esaurito l'elenco di input più breve.


2

C # , 136 byte


Dati

  • Input Int32[] i Una matrice di ints
  • Output Int32[,] Un array bidimentale.

golfed

i=>{int m=System.Linq.Enumerable.Max(i),l=i.Length,x,y;var o=new int[m,l];for(y=0;y<m;y++)for(x=0;x<l;)o[y,x]=i[x++]>y?y+1:0;return o;};

Ungolfed

i => {
    int
        m = System.Linq.Enumerable.Max( i ),
        l = i.Length,
        x, y;

    var o = new int[ m, l ];

    for( y = 0; y < m; y++ )
        for( x = 0; x < l; )
            o[ y, x ] = i[ x++ ] > y ? y + 1 : 0;

    return o;
};

Leggibile non golfato

// Take an array of Int32
i => {

    // Store the max value of the array, the length and declare some vars to save some bytes
    int
        m = System.Linq.Enumerable.Max( i ),
        l = i.Length,
        x, y;

    // Create the bidimensional array to output
    var o = new int[ m, l ];

    // Cycle line by line...
    for( y = 0; y < m; y++ )

        // ... and column by column...
        for( x = 0; x < l; )

            // And set the value of the line in the array if it's lower than the the value at the index of the input array
            o[ y, x ] = i[ x++ ] > y ? y + 1 : 0;

    // Return the bidimentional array.
    return o;
};

Codice completo

using System;
using System.Collections.Generic;

namespace TestBench {
    public class Program {
        // Methods
        static void Main( string[] args ) {
            Func<Int32[], Int32[,]> f = i => {
                int
                    m = System.Linq.Enumerable.Max( i ),
                    l = i.Length,
                    x, y;
                var o = new int[ m, l ];
                for( y = 0; y < m; y++ )
                    for( x = 0; x < l; )
                        o[ y, x ] = i[ x++ ] > y ? y + 1 : 0;
                return o;
            };

            List<Int32[]>
                testCases = new List<Int32[]>() {
                    new[] { 1, 2, 5, 6, 4 },
                    new[] { 3, 5, 2, 1, 6 },
                    new[] { 1, 2, 3, 4, 3, 2, 1 },
                };

            foreach( Int32[] testCase in testCases ) {
                Console.WriteLine( " INPUT: " );
                PrintArray( testCase );

                Console.WriteLine( "OUTPUT: " );
                PrintMatrix( f( testCase ) );
            }

            Console.ReadLine();
        }

        public static void PrintArray<TSource>( TSource[] array ) {
            PrintArray( array, o => o.ToString() );
        }
        public static void PrintArray<TSource>( TSource[] array, Func<TSource, String> valueFetcher ) {
            List<String>
                output = new List<String>();

            for( Int32 index = 0; index < array.Length; index++ ) {
                output.Add( valueFetcher( array[ index ] ) );
            }

            Console.WriteLine( $"[ {String.Join( ", ", output )} ]" );
        }

        public static void PrintMatrix<TSource>( TSource[,] array ) {
            PrintMatrix( array, o => o.ToString() );
        }
        public static void PrintMatrix<TSource>( TSource[,] array, Func<TSource, String> valueFetcher ) {
            List<String>
                output = new List<String>();

            for( Int32 xIndex = 0; xIndex < array.GetLength( 0 ); xIndex++ ) {
                List<String>
                    inner = new List<String>();

                for( Int32 yIndex = 0; yIndex < array.GetLength( 1 ); yIndex++ ) {
                    inner.Add( valueFetcher( array[ xIndex, yIndex ] ) );
                }

                output.Add( $"[ {String.Join( ", ", inner )} ]" );
            }

            Console.WriteLine( $"[\n   {String.Join( ",\n   ", output )}\n]" );
        }
    }
}

Uscite

  • v1.0 - 136 bytes- Soluzione iniziale.

Appunti

  • Nessuna

1

C (gcc) , 142 byte

i,j,k;main(c,v)char**v;{for(;++i<c;k=k<*v[i]?*v[i]:k)printf("%c ",*v[i]);for(i=48;puts(""),i++<k;)for(j=1;j<c;)printf("%c ",i<=*v[j++]?i:48);}

Provalo online!


1

Java 10, 115 byte

a->{int l=a.length,m=0;for(int j:a)m=j>m?j:m;var r=new int[m][l];for(;l-->0;)for(m=0;m<a[l];r[m][l]=++m);return r;}

Spiegazione:

Provalo online.

a->{                  // Method with integer-array parameter and integer-matrix return-type
  int l=a.length,     //  Length of the array
      m=0;            //  Largest integer in the array, 0 for now
  for(int j:a)        //  Loop over the array
    m=j>m?            //   If the current item is larger than `m`:
       j              //    Set `m` to this item as new max
      :               //   Else:
       m;             //    Leave `m` the same
  var r=new int[m][l];//  Result-matrix of size `m` by `l`, filled with zeroes by default
  for(;l-->0;)        //  Loop over the columns
    for(m=0;m<a[l];   //   Inner loop over the rows
      r[m][l]=++m);   //    Set the cell at position `m,l` to `m+1`
  return r;}          //  Return the result-matrix


0

Proton , 38 byte

a=>[[i<j?-~i:0for j:a]for i:0..max(a)]

Provalo online!


Fammi indovinare, il bug è lo spazio dopo di esso?
caird coinheringaahing il

@cairdcoinheringaahing Sì. Il punto interrogativo consumerà il personaggio dopo di esso per assicurarsi che non sia un altro punto interrogativo, ma ho dimenticato di compensare il carattere aggiuntivo risultante nel suo salto.
HyperNeutrino

Sembra che tu abbia un tiro, ora puoi rimuovere l'avviso :)
Erik the Outgolfer


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.