Làm cho nó nổ tung!


33

Lấy một ma trận các số nguyên dương làm đầu vào và làm cho nó phát nổ!


Cách bạn tạo ra một ma trận chỉ bằng cách thêm các số không xung quanh mọi phần tử, bao gồm cả các viền bên ngoài.

Định dạng đầu vào / đầu ra là tùy chọn như mọi khi!

Các trường hợp thử nghiệm:

1
-----
0 0 0
0 1 0
0 0 0
--------------

1 4
5 2
-----
0 0 0 0 0
0 1 0 4 0
0 0 0 0 0
0 5 0 2 0
0 0 0 0 0
--------------

1 4 7
-----
0 0 0 0 0 0 0
0 1 0 4 0 7 0
0 0 0 0 0 0 0
--------------

6
4
2
-----
0 0 0
0 6 0
0 0 0
0 4 0
0 0 0
0 2 0
0 0 0

Câu trả lời:


59

Hoạt động ngôn ngữ kịch bản Flashpoint , 182 byte

f={t=_this;c=count(t select 0);e=[0];i=0;while{i<c*2}do{e=e+[0];i=i+1};m=[e];i=0;while{i<count t}do{r=+e;j=0;while{j<c}do{r set[j*2+1,(t select i)select j];j=j+1};m=m+[r,e];i=i+1};m}

Ung dung:

f=
{
  // _this is the input matrix. Let's give it a shorter name to save bytes.
  t = _this;
  c = count (t select 0);

  // Create a row of c*2+1 zeros, where c is the number of columns in the
  // original matrix.
  e = [0];
  i = 0;
  while {i < c*2} do
  {
    e = e + [0];
    i = i + 1
  };

  m = [e]; // The exploded matrix, which starts with a row of zeros.
  i = 0;
  while {i < count t} do
  {
    // Make a copy of the row of zeros, and add to its every other column 
    // the values from the corresponding row of the original matrix.
    r = +e;
    j = 0;
    while {j < c} do
    {
      r set [j*2+1, (t select i) select j];
      j = j + 1
    };

    // Add the new row and a row of zeroes to the exploded matrix.
    m = m + [r, e];
    i = i + 1
  };

  // The last expression is returned.
  m
}

Gọi với:

hint format["%1\n\n%2\n\n%3\n\n%4",
    [[1]] call f,
    [[1, 4], [5, 2]] call f,
    [[1, 4, 7]] call f,
    [[6],[4],[2]] call f];

Đầu ra:

Trong tinh thần của thử thách:


6
Không xác định; Đàn ông; một ngàn.
MooseBoys

2
Bây giờ tôi đang bối rối
Grajdeanu Alex.

@MrGrj Lệnh theo nghĩa đen làm cho một cái gì đó nổ tung

1
+1 cho gif thứ hai " Trong tinh thần của thử thách "! :)
Kevin Cruijssen

10

Thạch ,  12  11 byte

-1 byte nhờ Erik the Outgolfer (không cần sử dụng các đối số hoán đổi cho một phép nối)

j00,0jµ€Z$⁺

Hãy thử trực tuyến! Hoặc xem một bộ thử nghiệm .

Một liên kết đơn âm chấp nhận và trả về danh sách các danh sách.

Làm sao?

j00,0jµ€Z$⁺ - Link: list of lists, m
          ⁺ - perform the link to the left twice in succession:
         $  -   last two links as a monad
      µ€    -     perform the chain to the left for €ach row in the current matrix:
j0          -       join with zeros                [a,b,...,z] -> [a,0,b,0,...,0,z]
  0,0       -       zero paired with zero = [0,0]
     j      -       join                     [a,0,b,0,...,0,z] -> [0,a,0,b,0,...,0,z,0]
        Z   -     and then transpose the resulting matrix

Bạn có thể lưu một byte:j00,0jµ€Z$⁺
Erik the Outgolfer

Ồ, tất nhiên, cảm ơn!
Jonathan Allan


6

MATL , 12 byte

FTXdX*0JQt&(

Đầu vào là một ma trận với ;dấu phân cách hàng.

Hãy thử trực tuyến!

Giải trình

FT     % Push [0 1]
Xd     % Matrix with that diagonal: gives [0 0; 0 1]
X*     % Implicit input. Kronecker product
0      % Push 0
JQt    % Push 1+j (interpreted as "end+1" index) twice
&(     % Write a 0 at (end+1, end+1), extending the matrix. Implicit display

5

Japt , 18 byte

Ov"y ®î íZ c p0Ã"²

Kiểm tra nó trực tuyến! (Sử dụng -Qcờ để đầu ra dễ hiểu hơn.)

Tương tự như câu trả lời của Jelly, nhưng lâu hơn rất nhiều ...

Giải trình

Phần bên ngoài của mã chỉ là một cách giải quyết để mô phỏng Jelly's :

  "             "²   Repeat this string twice.
Ov                   Evaluate it as Japt.

Bản thân mã là:

y ®   î íZ c p0Ã
y mZ{Zî íZ c p0}   Ungolfed
y                  Transpose rows and columns.
  mZ{          }   Map each row Z by this function:
     Zî              Fill Z with (no argument = zeroes).
        íZ           Pair each item in the result with the corresponding item in Z.
           c         Flatten into a single array.
             p0      Append another 0.

Lặp đi lặp lại hai lần, quá trình này cho đầu ra mong muốn. Kết quả được in ngầm.


5

Husk , 12 byte

₁₁
Tm»o:0:;0

Lấy và trả về một mảng số nguyên 2D. Hãy thử trực tuyến!

Giải trình

Cùng một ý tưởng như trong nhiều câu trả lời khác: thêm số không vào mỗi hàng và hoán vị, hai lần. Các hoạt động hàng được thực hiện với một nếp gấp.

₁₁         Main function: apply first helper function twice
Tm»o:0:;0  First helper function.
 m         Map over rows:
  »         Fold over row:
   o         Composition of
      :       prepend new value and
    :0        prepend zero,
       ;0    starting from [0].
            This inserts 0s between and around elements.
T          Then transpose.

5

Toán học, 39 byte

r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r

Hãy thử nó tại hộp cát Wolfram! Gọi nó như " r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r@{{1,2},{3,4}}".

Giống như nhiều câu trả lời khác, điều này hoạt động bằng cách hoán vị và đánh số 0 trong mỗi hàng sau đó thực hiện lại điều tương tự. Lấy cảm hứng từ câu trả lời Jelly của Jonathan Allan , nhưng chỉ vì tôi tình cờ thấy câu trả lời đó đầu tiên.


4

APL Dyalog, 24 byte

4 byte được lưu nhờ @ZacharyT

5 byte được lưu nhờ @KritixiLithos

{{⍵↑⍨-1+⍴⍵}⊃⍪/,/2 2∘↑¨⍵}

Hãy thử trực tuyến!


Bạn không cần parens xung quanh 1,1,⍴⍵, phải không?
Zacharý


@KritixiLithos sử dụng tốt đẹp 1 1+!
Uriel

Định hướng mảng của APL, vì vậy sẽ 1+làm việc?
Zacharý

@ZacharyT Tôi mới nhận ra rằng sau khi thấy câu trả lời của bạn ...
Kritixi Lithos


3

Python 3 , 104 101 97 93 86 byte

  • @Zachary T đã lưu 3 byte: wloại bỏ biến không sử dụng và một không gian không mong muốn
  • @Zachary T đã lưu thêm 4 byte: [a,b]giống như a,bkhi thêm vào danh sách
  • @nore lưu 4 byte: sử dụng cắt
  • @Zachary T và @ovs đã giúp lưu 7 byte: nén các câu lệnh trong vòng lặp for
def f(a):
 m=[(2*len(a[0])+1)*[0]]
 for i in a:r=m[0][:];r[1::2]=i;m+=r,m[0]
 return m

Hãy thử trực tuyến!


1
Bạn có thể xóa wvà lưu 2 byte: repl.it/JBPE
Zacharý

1
Ồ, bạn có một không gian không cần thiết sau dòngm+=[r,w]
Zacharý

1
Ngoài ra, bạn có thể tiết kiệm 4 byte bằng cách thay đổi [j,0]để j,0[r,m[0]để r,m[0]?
Zacharý

1
Bạn có thể lưu 4 byte khác bằng cách sử dụng các lát mảng .
nore

1
Bạn có thể lưu ba byte bằng cách chuyển đổi thành python2 và thay đổi forthụt vòng lặp thành một tab duy nhất.
Zacharý

3

Python 3, 118 byte

def a(b):
    z='00'*len(b[0])+'0'
    r=z+'\n'
    for c in b:
        e='0'
        for d in c:e+=str(d)+'0'
        r+=e+'\n'+z+'\n'
    return r

Lần đầu chơi golf! Không phải là tốt nhất, nhưng tôi khá tự hào nếu tôi có thể tự nói như vậy!

  • -17 byte từ các bình luận Wheat
  • -4 byte từ nội tuyến thứ hai cho vòng lặp

Xin Chào và Chào Mừng đến với trang. Bạn dường như có rất nhiều khoảng trắng ở đây. Ví dụ, một số của bạn +==được bao quanh bởi các khoảng trắng, có thể được loại bỏ. Ngoài ra, việc thực hiện +=hai lần liên tiếp có thể được đơn giản hóa thành một câu lệnh, ví dụe+=str(d)+'0'
Thuật sĩ lúa mì

@WheatWizard: Cảm ơn và cảm ơn. Đã lưu 17 byte :)
Liren

Bây giờ tôi nhận thấy rằng bạn có thể thu gọn forvòng lặp bên trong của mình thành một dòng duy nhất for d in c:e+=str(d)+'0', nhưng bạn có thể muốn đi với một bản đồ tham gia (str, d)) + '0' , in which case it becomes pointless to define e`.
Thuật sĩ lúa mì

1
Ah, chỉ cần nghĩ về bản thân mình! Hmm, tôi sẽ phải tìm hiểu .join và map () là gì đầu tiên tôi đoán. Tôi sẽ trở lại!
Liren

1
Bạn có thể đặt các định nghĩa zrtrên cùng một dòng (với một ;giữa chúng), tiết kiệm một byte thụt lề.
nore

3

R, 65 byte

Cảm ơn Jarko Dubbeldam và Giuseppe vì những bình luận rất có giá trị!

f=function(x){a=dim(x);y=array(0,2*a+1);y[2*1:a[1],2*1:a[2]]=x;y}

Đầu vào cho hàm phải là một ma trận hoặc mảng hai chiều.

Kiểm tra

f(matrix(1))
f(matrix(c(1,5,4,2),2))
f(matrix(c(1,4,7),1))
f(matrix(c(6,4,2)))

Đầu ra

> f(matrix(1))
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    1    0
[3,]    0    0    0
> f(matrix(c(1,5,4,2),2))
     [,1] [,2] [,3] [,4] [,5]
[1,]    0    0    0    0    0
[2,]    0    1    0    4    0
[3,]    0    0    0    0    0
[4,]    0    5    0    2    0
[5,]    0    0    0    0    0
> f(matrix(c(1,4,7),1))
     [,1] [,2] [,3] [,4] [,5] [,6] [,7]
[1,]    0    0    0    0    0    0    0
[2,]    0    1    0    4    0    7    0
[3,]    0    0    0    0    0    0    0
> f(matrix(c(6,4,2)))
     [,1] [,2] [,3]
[1,]    0    0    0
[2,]    0    6    0
[3,]    0    0    0
[4,]    0    4    0
[5,]    0    0    0
[6,]    0    2    0
[7,]    0    0    0

Nhìn thoáng qua tôi nghĩ sử dụng a=dim(x)*2+1thay vì nrowncolsẽ tốt hơn. Sau đó bạn có thể làm y=matrix(0);dim(y)=a2*1:a[1],2*1:a[2].
JAD

1
Trên thực tế y=array(0,a)sẽ còn ngắn hơn.
JAD

1
Tôi tin rằng bạn có thể xóa dấu ngoặc đơn xung quanh các chỉ số, nghĩa là, 2*1:a[1]:có quyền ưu tiên cao hơn*
Giuseppe


2

PHP , 98 byte

Nhập dưới dạng mảng 2D, Đầu ra dưới dạng chuỗi

<?foreach($_GET as$v)echo$r=str_pad(0,(count($v)*2+1)*2-1," 0"),"
0 ".join(" 0 ",$v)." 0
";echo$r;

Hãy thử trực tuyến!

PHP , 116 byte

Đầu vào và đầu ra dưới dạng mảng 2D

<?foreach($_GET as$v){$r[]=array_fill(0,count($v)*2+1,0);$r[]=str_split("0".join(0,$v)."0");}$r[]=$r[0];print_r($r);

Hãy thử trực tuyến!


2

Clojure, 91 byte

#(for[h[(/ 2)]i(range(- h)(count %)h)](for[j(range(- h)(count(% 0))h)](get(get % i[])j 0)))

Lặp lại trên phạm vi trong nửa bước.



2

Python 2 , 64 byte

lambda l:map(g,*map(g,*l))
g=lambda*l:sum([[x,0]for x in l],[0])

Hãy thử trực tuyến!

Hàm gxen kẽ đầu vào giữa các số 0. Hàm chính chuyển đổi đầu vào trong khi áp dụng g, sau đó thực hiện lại. Có lẽ có một cách để tránh sự lặp lại trong chức năng chính.


2

JavaScript (ES6), 73 72 byte

a=>(g=a=>(r=[b],a.map(v=>r.push(v,b)),b=0,r))(a,b=a[0].map(_=>0)).map(g)

Định dạng và nhận xét

Chèn các số 0 theo chiều ngang và chiều dọc là các thao tác rất giống nhau. Ý tưởng ở đây là sử dụng cùng hàm g () cho cả hai bước.

a =>                            // a = input array
  (g = a =>                     // g = function that takes an array 'a',
    (                           //     builds a new array 'r' where
      r = [b],                  //     'b' is inserted at the beginning
      a.map(v => r.push(v, b)), //     and every two positions,
      b = 0,                    //     sets b = 0 for the next calls
      r                         //     and returns this new array
  ))(a, b = a[0].map(_ => 0))   // we first call 'g' on 'a' with b = row of zeros
  .map(g)                       // we then call 'g' on each row of the new array with b = 0

Các trường hợp thử nghiệm


2

Than , 49 byte

A⪪θ;αA””βF⁺¹×²L§α⁰A⁺β⁰βA⁺β¶βFα«βA0δFιA⁺δ⁺κ⁰δ⁺䶻β

Hãy thử trực tuyến!

Đầu vào là một chuỗi phân tách các hàng bằng dấu chấm phẩy.


1
Modern Char than có thể làm điều này trong 24 byte: ≔E⪪θ;⪫00⪫ι0θFθ⟦⭆ι0ι⟧⭆⊟θ0nhưng ngay cả khi tránh StringMap tôi vẫn nghĩ rằng điều này có thể được thực hiện trong 27 byte.
Neil

Ồ, và một vài lời khuyên chung: có một biến được xác định trước cho chuỗi trống và bạn có thể tạo một chuỗi số không có độ dài nhất định bằng Times hoặc Mold.
Neil

2

Mô-đun C ++ 17 +, 192 byte

Nhập dưới dạng các hàng chuỗi từ cin , Đầu ra đến cout

import std.core;int main(){using namespace std;int i;auto&x=cout;string s;while(getline(cin,s)){for(int j=i=s.length()*2+1;j--;)x<<0;x<<'\n';for(auto c:s)x<<'0'<<c;x<<"0\n";}for(;i--;)x<<'0';}

2

C # , 146 byte


Dữ liệu

  • Đầu vào Int32[,] m Ma trận được phát nổ
  • Đầu ra Int32[,] Ma trận nổ

Chơi gôn

(int[,] m)=>{int X=m.GetLength(0),Y=m.GetLength(1),x,y;var n=new int[X*2+1,Y*2+1];for(x=0;x<X;x++)for(y=0;y<Y;y++)n[x*2+1,y*2+1]=m[x,y];return n;}

Bị đánh cắp

( int[,] m ) => {
    int
        X = m.GetLength( 0 ),
        Y = m.GetLength( 1 ),
        x, y;

    var
        n = new int[ X * 2 + 1, Y * 2 + 1 ];

    for( x = 0; x < X; x++ )
        for( y = 0; y < Y; y++ )
            n[ x * 2 + 1, y * 2 + 1 ] = m[ x, y ];

    return n;
}

Ungolfed có thể đọc được

// Takes an matrix of Int32 objects
( int[,] m ) => {
    // To lessen the byte count, store the matrix size
    int
        X = m.GetLength( 0 ),
        Y = m.GetLength( 1 ),
        x, y;

    // Create the new matrix, with the new size
    var
        n = new int[ X * 2 + 1, Y * 2 + 1 ];

    // Cycle through the matrix, and fill the spots
    for( x = 0; x < X; x++ )
        for( y = 0; y < Y; y++ )
            n[ x * 2 + 1, y * 2 + 1 ] = m[ x, y ];

    // Return the exploded matrix
    return n;
}

Mã đầy đủ

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace TestBench {
    public static class Program {
        private static Func<Int32[,], Int32[,]> f = ( int[,] m ) => {
            int
                X = m.GetLength( 0 ),
                Y = m.GetLength( 1 ),
                x, y,

                a = X * 2 + 1,
                b = Y * 2 + 1;

            var
                n = new int[ a, b ];

            for( x = 0; x < X; x++ )
                for( y = 0; y < Y; y++ )
                    n[ a, b ] = m[ x, y ];

            return n;
        };

        public static Int32[,] Run( Int32[,] matrix ) {
            Int32[,]
                result = f( matrix );

            Console.WriteLine( "Input" );
            PrintMatrix( matrix );

            Console.WriteLine( "Output" );
            PrintMatrix( result );

            Console.WriteLine("\n\n");

            return result;
        }

        public static void RunTests() {
            Run( new int[,] { { 1 } } );
            Run( new int[,] { { 1, 3, 5 } } );
            Run( new int[,] { { 1 }, { 3 }, { 5 } } );
            Run( new int[,] { { 1, 3, 5 }, { 1, 3, 5 }, { 1, 3, 5 } } );
        }

        static void Main( string[] args ) {
            RunTests();

            Console.ReadLine();
        }

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

Phát hành

  • v1.0 -146 bytes - Giải pháp ban đầu.

Ghi chú

  • không ai

Bạn sẽ không cần (int[,] m)=>, chỉ m=>là đủ nếu bạn tuyên bố mlà một mảng int int 2D trong câu trả lời của bạn. Ngoài ra, bạn có thể thay đổi ,x,thành,x=0, và loại bỏ việc x=0khởi tạo vòng lặp for cho byte byte. Và bạn có thể loại bỏ y++khỏi vòng lặp bên trong bằng cách thay đổi =m[x,y];thành =m[x,y++];thêm 1 byte. Nhưng +1 từ tôi và nếu tôi tạo một cổng câu trả lời của bạn thì nó cũng ngắn hơn câu trả lời Java hiện tại của tôi. :)
Kevin Cruijssen

1

APL Dyalog, 24 byte

{{⍵↑⍨¯1-⍴⍵}⊃⍪/,/2 2∘↑¨⍵}

Bất kỳ cải tiến đều được chào đón và mong muốn!




1

JavaScript (ES6), 80 78 byte

a=>[...a,...a,a[0]].map((b,i)=>[...b,...b,0].map((_,j)=>i&j&1&&a[i>>1][j>>1]))


1

APL (Dyalog) , 22 byte

Nhắc cho ma trận, trả về ma trận kèm theo.

{⍺⍀⍵\a}/⍴∘0 1¨1+2×⍴a←⎕

Hãy thử trực tuyến!

a←⎕ nhắc cho ma trận và gán cho một

 kích thước của một (hàng, cột)

 nhân với hai

1+ cộng một

⍴∘0 1¨ sử dụng mỗi để r eshape (theo chu kỳ) các số 0 và một

{... }/ giảm bằng cách chèn các chức năng ẩn danh sau đây giữa hai con số:

⍵\a mở rộng * các cột của a theo đối số đúng

⍺⍀a mở rộng * các hàng của điều đó theo đối số bên trái

* 0 chèn một cột / hàng số không, 1 chèn một cột / hàng dữ liệu gốc


1

Java 8, 183 166 162 129 byte

m->{int a=m.length,b=m[0].length,x=0,y,r[][]=new int[a*2+1][b*2+1];for(;x<a;x++)for(y=0;y<b;r[x*2+1][y*2+1]=m[x][y++]);return r;}

Đầu vào và đầu ra là a int[][].

-33 byte bằng cách tạo một cổng câu trả lời C # của @auhmaan .

Giải trình:

Hãy thử nó ở đây.

m->{                                // Method with 2D integer-array as parameter and return-type
  int a=m.length,                   //  Current height
      b=m[0].length,                //  Current width
      x=0,y,                        //  Two temp integers
      r[][]=new int[a*2+1][b*2+1];  //  New 2D integer-array with correct size
  for(;x<a;x++)                     //  Loop (1) over the height
    for(y=0;y<b;                    //   Inner loop (2) over the width
      r[x*2+1][y*2+1]=m[x][y++]     //    Fill the new array with the input digits
    );                              //   End of inner loop (2)
                                    //  End of loop (1) (implicit / single-line body)
  return r;                         //  Return result 2D integer-array
}                                   // End of method


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.