1'den L'ye (n) kadar matris, tüm n sütunda


18

Meydan okuma:

Bir listeyi al L girdi olarak pozitif tamsayılar içeren:

3 5 2 1 6

ve n. sütununun 1: L (n) vektörünü içerdiği bir matris oluşturun , burada daha kısa sıralar sıfırlarla doldurulur.

Test senaryoları:

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

Kurallar:

  • İsteğe bağlı giriş ve çıkış formatları
    • Liste listesi kabul edilebilir bir çıktı biçimidir
  • Matris mümkün olduğunca küçük olmalıdır (gerektiğinden daha fazla sıfırla doldurmayabilirsiniz)
  • Her dilde en kısa kod kazanır
  • Açıklamalar büyük ölçüde teşvik edilmektedir

Aralıkları yatay olarak dağıtabilir miyiz?
Bay Xcoder

Hayır, dikey olmalılar. Yatay / dikey kelimelerin hiçbir anlamı olmadığı bir dil kullanıyorsanız, isteğe bağlıdır. (Liste listelerinin yatay / dikey
yönlerle

1
@StewieGriffin Hangi aklı dili, boyutları iç içe listelerle ilişkilendirmez?
Outgolfer Erik

4
@EriktheOutgolfer, Bu sitede kaç deli dil kullanılıyor?
Stewie Griffin

2
@EriktheOutgolfer R, matrisleri iç içe liste olarak görmez, daha çok satır bazında saran bir uzun liste görür.
JAD

Yanıtlar:


18

R , 40 38 bayt

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

Çevrimiçi deneyin!

Açıklama:

outerbir matrisini oluşturma, ilk iki bağımsız elemanlarının tüm kombinasyonlara üçüncü bağımsız değişken (fonksiyonu) uygulanır TRUEve FALSEher sütun nerede TRUEburada 1:max(l)daha ya da karşılık gelen elemanına eşit lörneğin, burada 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

Daha sonra elde edilen matris varsayılarak olan A, daha sonra A*m-> A[i,j]=A[i,j]*iolan zorladı TRUE1 ve FALSEarzu edilen bir sonuç elde 0,.


Bence - değiştirerek, 2 bayt kaydedebilirsiniz function(l)ilel=scan();
AndriusZ

@AndriusZ ama sonra her şeyi bir sarmak zorunda kalacaktım, printböylece o baytları kaybedecektim.
Giuseppe

Bence, her şeyi sarmanıza gerek yok - TOI
AndriusZ

2
@AndriusZ daha önce bunun hakkında kesinlikle konuşmuştuk. Bu meta sorunun tek cevabı source(...,echo=TRUE), stdin'den tam bir program olarak kullanmak ve okumak için +4 ceza veriyor , alternatif bir öneriniz varsa, elbette orada tartın, ancak bildiğim kadarıyla sahip olduğumuz en yakın şey tam programlar üzerinde bir R konsensüsüne ve şu an için duruyor.
Giuseppe

Oyuna geç: [bu ipucu] kullanarak iki bayt kaydedin ( codegolf.stackexchange.com/a/111578/80010 )
JayCe

7

MATL , 8 bayt

"@:]Xho!

Çevrimiçi deneyin!

açıklama

"      % 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 bayt

PadRight@Range@#&

U + F3C7 (Mathematica'nın yerleşik Transposeişlevi) içerir

Wolfram Sandbox'ta deneyin

kullanım

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

açıklama

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 neden downvotes? Hepiniz açıklayabilir misiniz?
JungHwan Min

Ben aşağı oy vermedi, ama bunun nedeni, kod snippet'inizin kara bir kutu olmamasına neden olan işlev imzasını veya bağımsız değişkenlerin bir girdisini içermediğinizden şüpheleniyorum!
sergiol

5

Oktav , 26 bayt

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

Bir satır vektörü giren ve bir matris çıkaran anonim işlev.

Çevrimiçi deneyin!

açıklama

Girişi düşünün x = [3 5 2 1 6]. Bu, 1 × 5 boyutunda bir satır vektörüdür.

1:max(x)[1 2 3 4 5 6]değişkene atanan satır vektörünü verir y.

Bunun devri , yani sütun vektörü [1; 2; 3; 4; 5; 6], <=girdi ile karşılaştırılır (yayın ile eleman bazında) [3 5 2 1 6]. Sonuç 6 × 5 matristir

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

Son olarak, transpozisyonda [1; 2; 3; 4; 5; 6]elde edilen sütun vektörü ile çarpım (eleman olarak yayın) yistenen sonucu verir:

[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
Bir MATLAB / Octave gönderimi görmeyi umuyordum. Bunu herhangi bir düşünce koymadan uyguladım, bu yüzden muhtemelen 40 bayttan fazlaydı. Çok güzel bir çözüm :)
Stewie Griffin



3

Pyth , 6 bayt

.tSMQZ

Burada deneyin! veya Tüm test senaryolarını doğrulayın (güzel baskı ile)!


açıklama

.tSMQZ - Tam program.

  SMQ - Her biri için kapsayıcı tekli aralıkları alın.
.t - Aktarma, kopyaları ile doldurma ...
     Z - ... Sıfır.
         - Örtük baskı.

Yerleşik olmayan bir devrik sürüm şu şekildedir :

mm*hd<dkQeS

Bu şu şekilde çalışır:

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

Aslında 17 bayt

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

Çevrimiçi deneyin!

Açıklama:

;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

Evet, aslında dolgu desteği ile zip gerekiyor ...
Erik Outgolfer

2

Pyke , 3 bayt

Bu Pyke, hex kodlama yeni özelliğini kullanır ... En iyi yanı, Jelly bağlamak olduğunu! Ham bayt:

4D 53 AC

Burada deneyin!

ASCII-Pyke eşdeğeri 4 bayt olur :

MS.,

Nasıl?

4D 53 AC - Tam program.

4D - Harita.
   53 - Kapsama alanı.
      AC - Sıfırlarla çevirin.
           - Örtük olarak çıktı.

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

MS., - Tam program.

M - Harita.
 S - Kapsama alanı.
  ., - Sıfırlarla çevirin.
       - Örtük olarak çıktı.

İşte ASCII ile güzel bir baskı sürümü ve burada onaltılık kodlamalı bir sürüm var .


2

Perl 6 , 39 bayt

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

Dene

Expanded:

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

zipEn kısa giriş listesi bittiğinde sonlandığını unutmayın .


2

C # , 136 bayt


Veri

  • Giriş Int32[] i Bir dizi dizi
  • Çıktı Int32[,] Bir teklif dizisi.

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

Okunmamış okunabilir

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

Tam kod

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

Salıverme

  • v1.0 - 136 bytes- İlk çözüm.

notlar

  • Yok


1

Java 10, 115 bayt

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

Açıklama:

Çevrimiçi deneyin.

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




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.