เมทริกซ์ที่มี 1 ถึง L (n) ในคอลัมน์ n ทั้งหมด


18

ท้าทาย:

ใช้รายการLที่มีจำนวนเต็มบวกเป็นอินพุต:

3 5 2 1 6

และสร้างเมทริกซ์โดยที่คอลัมน์ n'th มีเวกเตอร์1: L (n)โดยที่แถวที่สั้นกว่าจะถูกเติมด้วยศูนย์

กรณีทดสอบ:

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

กฎ:

  • รูปแบบอินพุตและเอาต์พุตเสริม
    • รายการของรายการเป็นรูปแบบผลลัพธ์ที่ยอมรับได้
  • เมทริกซ์ต้องมีขนาดเล็กที่สุดเท่าที่จะเป็นไปได้ (คุณไม่สามารถวางด้วยศูนย์มากกว่าที่ต้องการ)
  • รหัสสั้นที่สุดในแต่ละภาษาชนะ
  • คำอธิบายได้รับการสนับสนุนอย่างมาก

เราจะแจกจ่ายช่วงตามแนวนอนแทนได้ไหม?
Mr. Xcoder

ไม่ควรเป็นแนวตั้ง หากคุณใช้ภาษาที่คำในแนวนอน / แนวตั้งไม่มีความหมายใด ๆ มันก็เป็นทางเลือก (อาจเกี่ยวข้องกับภาษาที่รายการของรายการไม่เกี่ยวข้องกับทิศทางแนวนอน / แนวตั้ง)
Stewie Griffin

1
@StewieGriffin ภาษาใดที่ไม่สามารถเชื่อมโยงมิติข้อมูลกับรายการที่ซ้อนอยู่
Erik the Outgolfer

4
@EriktheOutgolfer มีการใช้ภาษาที่บ้าในไซต์นี้กี่ภาษา
Stewie Griffin

2
@EriktheOutgolfer R สำหรับหนึ่งไม่เห็นเมทริกซ์เป็นรายการซ้อน แต่ค่อนข้างยาวหนึ่งรายการซึ่งล้อมรอบแถวฉลาด
JAD

คำตอบ:


18

R , 40 38 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

outerใช้อาร์กิวเมนต์ที่สามของมัน (ฟังก์ชั่น) กับการรวมกันขององค์ประกอบของสองอาร์กิวเมนต์แรกสร้างเมทริกซ์TRUEและFALSEที่แต่ละคอลัมน์มีTRUEที่1:max(l)น้อยกว่าหรือเท่ากับองค์ประกอบที่สอดคล้องกันของlตัวอย่างที่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

จากนั้นเผื่อว่าเมทริกซ์ผลเป็นAแล้วA*m-> A[i,j]=A[i,j]*iซึ่ง coerces TRUE1 และFALSE0, ผลิตผลลัพธ์ที่ต้องการ


ฉันคิดว่า - คุณสามารถบันทึก 2 ไบต์โดยแทนที่function(l)ด้วยl=scan();
AndriusZ

@AndriusZ แต่ฉันจะต้องห่อทุกอย่างด้วยprintดังนั้นฉันจะเสียไบต์เหล่านั้น
Giuseppe

ฉันคิดว่าคุณไม่จำเป็นต้องห่อทุกอย่าง - TOI
AndriusZ

2
@AndriusZ เราเคยพูดถึงเรื่องนี้มาก่อนแน่นอน คำตอบเดียวสำหรับคำถามเมตานี้ให้โทษ +4 สำหรับการใช้source(...,echo=TRUE)และการอ่านจาก stdin เป็นโปรแกรมเต็มรูปแบบหากคุณมีข้อเสนอแนะทางเลือกโดยทั้งหมดหมายความว่ามีน้ำหนักอยู่ในนั้น แต่เท่าที่ฉันทราบว่าเราอยู่ใกล้ที่สุด ถึงฉันทามติ R ในโปรแกรมเต็มรูปแบบและในขณะนี้
Giuseppe

มาถึงเกมแล้ว: บันทึกสองไบต์โดยใช้ [เคล็ดลับนี้] ( codegolf.stackexchange.com/a/111578/80010 )
JayCe



5

Mathematica ขนาด 20 ไบต์

PadRight@Range@#&

มี U + F3C7 ( Transposeฟังก์ชันbuiltin ของ Mathematica )

ลองใช้กับ Wolfram Sandbox

การใช้

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

คำอธิบาย

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 ทำไม downvotes คุณจะอธิบายได้ไหม
JungHwan Min

ฉันไม่ได้ลงคะแนน แต่ฉันสงสัยว่ามันเป็นเพราะคุณกำลังขาดฟังก์ชั่นลายเซ็นหรืออินพุตของการขัดแย้งซึ่งทำให้ข้อมูลโค้ดของคุณไม่เป็นกล่องดำ!
sergiol

5

อ็อกเทฟ 26 ไบต์

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

ฟังก์ชั่นไม่ระบุชื่อที่ป้อนเวกเตอร์แถวและส่งออกเมทริกซ์

ลองออนไลน์!

คำอธิบาย

x = [3 5 2 1 6]พิจารณาการป้อนข้อมูล นี่คือเวกเตอร์แถวขนาด 1 × 5

1:max(x)ให้เวกเตอร์แถว[1 2 3 4 5 6]ซึ่งกำหนดให้กับตัวแปรyซึ่งจะกำหนดให้กับตัวแปร

การแปลงของนั่นคือเวกเตอร์คอลัมน์[1; 2; 3; 4; 5; 6]คือ - <=เปรียบเทียบ (องค์ประกอบฉลาดด้วยการออกอากาศ) กับการป้อนข้อมูล[3 5 2 1 6]ด้วยการป้อนข้อมูล ผลลัพธ์คือเมทริกซ์ 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]

ในที่สุดการคูณ (องค์ประกอบที่ชาญฉลาดด้วยการออกอากาศ) โดยเวกเตอร์คอลัมน์ที่[1; 2; 3; 4; 5; 6]ได้รับเป็นytransposed จะให้ผลลัพธ์ที่ต้องการ:

[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
ฉันหวังว่าจะได้รับการส่ง MATLAB / ระดับแปดเสียง ฉันนำสิ่งนี้ไปใช้โดยไม่ใส่ความคิดลงไปดังนั้นมันน่าจะมากกว่า 40 ไบต์ วิธีแก้ปัญหาที่ดีมาก :)
Stewie Griffin



3

Pyth , 6 ไบต์

.tSMQZ

ลองที่นี่! หรือตรวจสอบทุกกรณีทดสอบ (พร้อมพิมพ์สวย)!


คำอธิบาย

.tSMQZ - โปรแกรมเต็มรูปแบบ

  SMQ - รับช่วง unary แบบรวมสำหรับแต่ละรายการ
.t - Transpose, padding พร้อมสำเนาของ ...
     Z - ... Zero
         - การพิมพ์โดยนัย

เวอร์ชันไขว้แบบบิวด์อินจะเป็น :

mm*hd<dkQeS

งานนี้เป็นดังนี้:

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

ที่จริงแล้ว 17 ไบต์

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

ลองออนไลน์!

คำอธิบาย:

;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

ใช่จริง ๆ แล้วต้องการ zip ด้วยการรองรับการขยาย ...
Erik the Outgolfer

2

Pykeขนาด 3 ไบต์

นี่ใช้คุณสมบัติใหม่ของ Pyke การเข้ารหัสฐานสิบหก ... ส่วนที่ดีที่สุดคือเราผูก Jelly! ไบต์ดิบ:

4D 53 AC

ลองที่นี่!

ASCII-Pyke ที่เทียบเท่าจะเป็น4 ไบต์ :

MS.,

อย่างไร?

4D 53 AC - โปรแกรมเต็มรูปแบบ

4D - แผนที่
   53 - ช่วงรวม
      AC - ขนย้ายด้วยศูนย์
           - ผลผลิตโดยปริยาย

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

MS. - โปรแกรมเต็มรูปแบบ

M - แผนที่
 S - รวมช่วง
  ., - สลับกับศูนย์
       - ผลผลิตโดยปริยาย

นี่คือรุ่นที่พิมพ์สวยพร้อม ASCII และที่นี่เป็นรุ่นที่มีการเข้ารหัสฐานสิบหก


2

Perl 6 , 39 ไบต์

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

ลองมัน

ขยาย:

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

โปรดทราบว่าzipจะสิ้นสุดลงเมื่อรายการอินพุตที่สั้นที่สุดถูกใช้จนหมด


2

C # , 136 ไบต์


ข้อมูล

  • อินพุต Int32[] iอาร์เรย์ของ ints
  • เอาท์พุท Int32[,]อาร์เรย์แบบสองทิศทาง

แข็งแรงเล่นกอล์ฟ

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

อ่านได้ไม่ดี

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

รหัสเต็ม

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

ข่าว

  • v1.0 - 136 bytes- โซลูชั่นเริ่มต้น

หมายเหตุ

  • ไม่มี


1

Java 10, 115 ไบต์

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->{                  // 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

โปรตอน , 38 ไบต์

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

ลองออนไลน์!


ให้ฉันเดาข้อผิดพลาดเป็นช่องว่างหลังจากนั้นหรือไม่
caird coinheringaahing

@cairdcoinheringaahing ใช่ เครื่องหมายคำถามจะใช้อักขระหลังจากนั้นเพื่อให้แน่ใจว่าไม่ใช่เครื่องหมายคำถามอื่น แต่ฉันลืมที่จะชดเชยอักขระพิเศษที่ทำให้เกิดการข้าม
HyperNeutrino

ดูเหมือนว่าคุณจะถูกดึงตอนนี้คุณสามารถลบประกาศได้แล้ว :)
Erik the Outgolfer


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.