Matriks dengan 1 hingga L (n), di semua kolom n

18

Tantangan:

Ambil daftar, L yang berisi bilangan bulat positif sebagai input:

3 5 2 1 6

dan buat matriks di mana kolom ke- n berisi vektor 1: L (n) , di mana baris yang lebih pendek diisi dengan nol.

Kasus uji:

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

Aturan:

  • Input dan output format opsional
    • Daftar daftar adalah format output yang dapat diterima
  • Matriks harus sekecil mungkin (Anda mungkin tidak menambahkannya dengan nol lebih banyak dari yang dibutuhkan)
  • Kode terpendek di setiap bahasa menang
  • Penjelasan sangat dianjurkan
Stewie Griffin
sumber
Bisakah kita mendistribusikan rentang secara horizontal sebagai gantinya?
Tn. Xcoder
Tidak, itu harus vertikal. Jika Anda menggunakan bahasa di mana kata-kata horisontal / vertikal tidak memiliki makna apa pun maka itu opsional. (Bisa relevan untuk bahasa di mana daftar daftar tidak terkait dengan arah horisontal / vertikal)
Stewie Griffin
1
@StewieGriffin Bahasa apa yang tidak diasosiasikan dengan dimensi dengan daftar bersarang?
Erik the Outgolfer
4
@EriktheOutgolfer, Berapa banyak bahasa gila yang digunakan di situs ini?
Stewie Griffin
2
@EriktheOutgolfer R untuk satu tidak melihat matriks sebagai daftar bersarang, melainkan satu daftar panjang, yang membungkus bijaksana baris.
JAD

Jawaban:

18

R , 40 38 byte

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

Cobalah online!

Penjelasan:

outerberlaku argumen ketiga (fungsi) untuk semua kombinasi elemen dari dua argumen pertamanya, menghasilkan matriks TRUEdan di FALSEmana setiap kolom memiliki di TRUEmana 1:max(l)kurang dari atau sama dengan elemen yang sesuai l, misalnya di mana 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

Kemudian seandainya matriks yang dihasilkan adalah A, kemudian A*m-> A[i,j]=A[i,j]*iyang memaksa TRUEke 1 dan FALSEke 0, menghasilkan hasil yang diinginkan.

Giuseppe
sumber
Saya pikir - Anda dapat menyimpan 2 byte, dengan mengganti function(l)denganl=scan();
AndriusZ
@ AndriusZ tapi kemudian saya harus membungkus semuanya printjadi saya akan kehilangan byte itu.
Giuseppe
Saya pikir, Anda tidak perlu membungkus semuanya - TOI
AndriusZ
2
@ AndriusZ kita pasti sudah membicarakan ini sebelumnya. Satu-satunya jawaban untuk pertanyaan meta ini memberikan penalti +4 untuk menggunakan source(...,echo=TRUE)dan membaca dari stdin sebagai program penuh, jika Anda memiliki saran alternatif, tentu saja menimbang di sana, tetapi sejauh yang saya tahu itu adalah yang terdekat yang kami miliki untuk konsensus R pada program penuh dan itu berdiri untuk saat ini.
Giuseppe
Terlambat dalam permainan: simpan dua byte menggunakan [tip ini] ( codegolf.stackexchange.com/a/111578/80010 )
JayCe
7

MATL , 8 byte

"@:]Xho!

Cobalah online!

Penjelasan

"      % 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
Luis Mendo
sumber
5

Mathematica, 20 byte

PadRight@Range@#&

Berisi U + F3C7 ( Transposefungsi bawaan Matematika )

Cobalah di Wolfram Sandbox

Pemakaian

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

Penjelasan

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 *)
JungHwan Min
sumber
@ downvoters mengapa downvotes? Bisakah kalian menjelaskan?
JungHwan Min
Saya tidak mengundurkan diri, tetapi saya curiga itu karena Anda kekurangan tanda tangan fungsi atau input argumen, yang menyebabkan cuplikan kode Anda bukan kotak hitam!
sergiol
5

Oktaf , 26 byte

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

Fungsi anonim yang menginput vektor baris dan menghasilkan matriks.

Cobalah online!

Penjelasan

Pertimbangkan input x = [3 5 2 1 6]. Ini adalah vektor baris ukuran 1 × 5.

1:max(x)memberikan vektor baris [1 2 3 4 5 6], yang ditugaskan ke variabel y.

Transposnya, yaitu vektor kolom [1; 2; 3; 4; 5; 6], adalah <=-compared (elemen-bijaksana dengan siaran) dengan input [3 5 2 1 6]. Hasilnya adalah matriks 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]

Akhirnya, mengalikan (elemen-bijaksana dengan siaran) oleh vektor kolom [1; 2; 3; 4; 5; 6], diperoleh sebagai yditransposisikan, memberikan hasil yang diinginkan:

[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]
Luis Mendo
sumber
1
Saya berharap untuk melihat pengiriman MATLAB / Oktaf. Saya menerapkan ini tanpa memikirkannya, jadi mungkin lebih dari 40 byte. Solusi yang sangat bagus :)
Stewie Griffin
3

Sekam , 4 byte

Mengembalikan daftar daftar

T0mḣ

Cobalah online!

Penjelasan

  m    Map over the input
   ḣ   Range from 1 to n
T0     Transpose, padding with 0s
H.Piz
sumber
3

Pyth , 6 byte

.tSMQZ

Coba di sini! atau Verifikasi semua test case (dengan cetak-cantik)!


Penjelasan

.tSMQZ - Program lengkap.

  SMQ - Dapatkan rentang unary inklusif untuk masing-masing.
.t - Transpose, melapisi dengan salinan ...
     Z - ... Nol.
         - Cetak tersirat.

Versi transpose non-built-in adalah :

mm*hd<dkQeS

Ini berfungsi sebagai berikut:

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.
Tuan Xcoder
sumber
3

Jelly , 3 byte

Rz0

Cobalah online!

Penjelasan

Rz0  Input: array A
R    Range, vectorizes to each integer
 z0  Transpose and fill with 0
mil
sumber
3

Sebenarnya , 17 byte

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

Cobalah online!

Penjelasan:

;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
Mego
sumber
Ya, sebenarnya benar-benar membutuhkan zip dengan dukungan padding ...
Erik the Outgolfer
2

Pyke , 3 byte

Ini menggunakan fitur baru Pyke, hex encodings ... Bagian terbaiknya adalah kita mengikat Jelly! Byte mentah:

4D 53 AC

Coba di sini!

Setara ASCII-Pyke akan menjadi 4 byte :

MS.,

Bagaimana?

4D 53 AC - Program lengkap.

4D - Peta.
   53 - Rentang inklusif.
      AC - Transpose dengan nol.
           - Output tersirat.

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

MS., - Program lengkap.

M - Peta.
 S - Rentang inklusif.
  ., - Transpose dengan nol.
       - Output tersirat.

Berikut adalah versi yang cukup-print dengan ASCII, dan di sini adalah satu dengan pengkodean hex.

Tuan Xcoder
sumber
2

Perl 6 , 39 byte

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

Cobalah

Diperluas:

{                # 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)
      )
    }
}

Perhatikan bahwa zipberakhir setelah daftar input terpendek habis.

Brad Gilbert b2gills
sumber
2

C # , 136 byte


Data

  • Input Int32[] i Array int
  • Keluaran Int32[,] Array dua arah.

Golf

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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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]" );
        }
    }
}

Rilis

  • v1.0 - 136 bytes- Solusi awal.

Catatan

  • Tidak ada
auhmaan
sumber
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);}

Cobalah online!

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

Penjelasan:

Cobalah 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
Kevin Cruijssen
sumber
0

Perl 5 , 62 + 1 ( -a) = 63 byte

$,=$";map$m=$_>$m?$_:$m,@F;say map$_&&$_--&&$i,@F while$i++-$m

Cobalah online!

Xcali
sumber
0

Proton , 38 byte

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

Cobalah online!

HyperNeutrino
sumber
Biarkan saya menebak, bug adalah ruang setelahnya?
caird coinheringaahing
@cairdcoinheringaahing Ya. Tanda tanya akan menggunakan karakter setelahnya untuk memastikan itu bukan tanda tanya lain tapi saya lupa untuk mengkompensasi karakter tambahan yang membuatnya dilewati.
HyperNeutrino
Tampaknya Anda mendapat tarikan, sekarang Anda dapat menghapus pemberitahuan :)
Erik the Outgolfer
0

Tambahkan ++ , 37 byte

D,g,@@*,bL_1+0XA$p$+bUp
L~*,€RAbM€gBc

Cobalah online!

caird coinheringaahing
sumber