Macierz z 1 do L (n), we wszystkich n kolumnach

18

Wyzwanie:

Weź listę, L zawierającą liczby całkowite dodatnie jako dane wejściowe:

3 5 2 1 6

i utwórz macierz, w której n-ta kolumna zawiera wektor 1: L (n) , w której krótsze wiersze są wypełnione zerami.

Przypadki testowe:

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

Zasady:

  • Opcjonalne formaty wejściowe i wyjściowe
    • Lista list jest akceptowalnym formatem wyjściowym
  • Matryca musi być tak mała, jak to możliwe (nie można jej uzupełniać większą liczbą zer niż to konieczne)
  • Wygrywa najkrótszy kod w każdym języku
  • Wyjaśnienia są bardzo zalecane
Stewie Griffin
źródło
Czy zamiast tego możemy rozdzielić zakresy w poziomie?
Pan Xcoder,
Nie, powinny być pionowe. Jeśli używasz języka, w którym słowa poziomo / pionowo nie mają żadnego znaczenia, jest to opcjonalne. (Może być odpowiedni dla języków, w których listy nie są powiązane z kierunkami poziomymi / pionowymi)
Stewie Griffin
1
@StewieGriffin Jaki rozsądny język nie wiąże wymiarów z listami zagnieżdżonymi?
Erik the Outgolfer,
4
@EriktheOutgolfer, Ile szalonych języków używa się na tej stronie?
Stewie Griffin,
2
@EriktheOutgolfer R dla jednego nie widzi matryc jako listy zagnieżdżonej, ale raczej jedną długą listę, która owija się wokół wierszy.
JAD

Odpowiedzi:

18

R , 40 38 bajtów

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

Wypróbuj online!

Wyjaśnienie:

outerstosuje swój trzeci argument (funkcję) do wszystkich kombinacji elementów pierwszych dwóch argumentów, generując macierz TRUEi FALSEgdzie każda kolumna ma TRUEgdzie 1:max(l)jest mniejsza lub równa odpowiadającemu elementowi l, na przykład gdzie 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

Przypuśćmy więc, że macierz wynikowa jest A, a następnie A*m-> A[i,j]=A[i,j]*iktóra zmusza TRUEdo 1 i FALSEdo 0, dając pożądany wynik.

Giuseppe
źródło
Myślę, że - możesz zaoszczędzić 2 bajty, zastępując function(l)jel=scan();
AndriusZ
@AndriusZ, ale wtedy musiałbym wszystko zawinąć, printaby stracić te bajty.
Giuseppe,
Myślę, że nie musisz
pakować
2
@AndriusZ zdecydowanie już o tym rozmawialiśmy. Jedyna odpowiedź na to meta pytanie daje karę +4 za używanie source(...,echo=TRUE)i czytanie ze stdin jako pełnego programu, jeśli masz alternatywną sugestię, z całą pewnością tam, ale o ile wiem, jest to najbliższy, jaki mamy do konsensusu R w sprawie pełnych programów i na chwilę obecną.
Giuseppe,
Późno do gry: zapisz dwa bajty za pomocą [tej wskazówki] ( codegolf.stackexchange.com/a/111578/80010 )
JayCe
7

Mátl , 8 bajtów

"@:]Xho!

Wypróbuj online!

Wyjaśnienie

"      % 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
źródło
5

Mathematica, 20 bajtów

PadRight@Range@#&

Zawiera U + F3C7 (wbudowana Transposefunkcja Mathematica )

Wypróbuj na Wolfram Sandbox

Stosowanie

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

Wyjaśnienie

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
źródło
@ downvoters dlaczego downvotes? Czy moglibyście wyjaśnić?
JungHwan Min.
Nie przegłosowałem, ale podejrzewam, że dzieje się tak, ponieważ brakuje ci podpisu funkcji lub argumentów, co powoduje, że fragment kodu nie jest czarną skrzynką!
sergiol
5

Oktawa , 26 bajtów

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

Anonimowa funkcja, która wprowadza wektor wiersza i wyprowadza macierz.

Wypróbuj online!

Wyjaśnienie

Rozważ wejście x = [3 5 2 1 6]. To wektor wiersza o rozmiarze 1 × 5.

1:max(x)daje wektor wiersza [1 2 3 4 5 6], który jest przypisany do zmiennej y.

Transpozycja tego, tj. Wektora kolumny [1; 2; 3; 4; 5; 6], jest <=porównywana (elementarnie z transmisją) z danymi wejściowymi [3 5 2 1 6]. Wynikiem jest macierz 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]

Wreszcie, pomnożenie (elementarne z rozgłoszeniem) przez wektor kolumny [1; 2; 3; 4; 5; 6], uzyskany jako ytransponowany, daje pożądany wynik:

[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
źródło
1
Miałem nadzieję zobaczyć zgłoszenie MATLAB / Octave. Zaimplementowałem to bez zastanowienia, więc prawdopodobnie było to ponad 40 bajtów. Bardzo fajne rozwiązanie :)
Stewie Griffin
3

Łuska , 4 bajty

Zwraca listę list

T0mḣ

Wypróbuj online!

Wyjaśnienie

  m    Map over the input
   ḣ   Range from 1 to n
T0     Transpose, padding with 0s
H.PWiz
źródło
3

Pyth , 6 bajtów

.tSMQZ

Wypróbuj tutaj! lub Sprawdź wszystkie przypadki testowe (z ładnym drukiem)!


Wyjaśnienie

.tSMQZ - Pełny program.

  SMQ - uzyskaj jednoznaczne zakresy dla każdego.
.t - Transpozycja, wypełnienie z kopiami ...
     Z - ... zero.
         - Druk niejawny.

Wbudowana wersja transpozycji to :

mm*hd<dkQeS

Działa to w następujący sposób:

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.
Pan Xcoder
źródło
3

Właściwie 17 bajtów

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

Wypróbuj online!

Wyjaśnienie:

;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
źródło
Tak, w rzeczywistości potrzebuje zip ze wsparciem padding ...
Erik the Outgolfer
2

Pyke , 3 bajty

Wykorzystuje to nową funkcję Pyke, kodowanie szesnastkowe ... Najlepsze jest to, że wiążemy Jelly! Surowe bajty:

4D 53 AC

Wypróbuj tutaj!

Odpowiednik ASCII-Pyke miałby 4 bajty :

MS.,

W jaki sposób?

4D 53 AC - Pełny program.

4D - mapa.
   53 - Zakres obejmujący.
      AC - transpozycja z zerami.
           - Wynik niejawny.

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

MS., - Pełny program.

M - Mapa.
 S - Zakres obejmujący.
  ., - Transponuj z zerami.
       - Wynik niejawny.

Oto ładna wersja z ASCII, a tutaj z kodowaniem szesnastkowym.

Pan Xcoder
źródło
2

Perl 6 , 39 bajtów

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

Spróbuj

Rozszerzony:

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

Zauważ, że zipkończy się po wyczerpaniu najkrótszej listy danych wejściowych.

Brad Gilbert b2gills
źródło
2

C # , 136 bajtów


Dane

  • Dane wejściowe Int32[] i Tablica liczb całkowitych
  • Dane wyjściowe Int32[,] Tablica dwukierunkowa.

Grał w golfa

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

Nie golfił

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

Nieczytelny czytelny

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

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

Prasowe

  • v1.0 - 136 bytes- Wstępne rozwiązanie.

Uwagi

  • Żaden
auhmaan
źródło
1

C (gcc) , 142 bajty

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

Wypróbuj online!

cleblanc
źródło
1

Java 10, 115 bajtów

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

Wyjaśnienie:

Wypróbuj 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
źródło
0

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

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

Wypróbuj online!

Xcali
źródło
0

Proton , 38 bajtów

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

Wypróbuj online!

HyperNeutrino
źródło
Niech zgadnę, błąd jest po nim spacją?
caird coinheringaahing
@cairdcoinheringaahing Tak. Znak zapytania pochłonie postać po nim, aby upewnić się, że nie jest to kolejny znak zapytania, ale zapomniałem zrekompensować dodatkowy znak, który powoduje, że jest pomijany.
HyperNeutrino,
Wygląda na to, że cię pociągnąłeś, możesz teraz usunąć powiadomienie :)
Erik the Outgolfer