Buat itu meledak!


33

Ambil matriks bilangan bulat positif sebagai input, dan buat itu meledak!


Cara Anda meledak matriks adalah dengan hanya menambahkan nol di sekitar setiap elemen, termasuk batas luar.

Format input / output adalah opsional seperti biasa!

Kasus uji:

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

Jawaban:


59

Operasi bahasa scripting 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}

Tidak Disatukan:

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
}

Telepon dengan:

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

Keluaran:

Dalam semangat tantangan:


6
Tidak dikenal; pria; seribu.
MooseBoys

2
Sekarang saya bingung
Grajdeanu Alex.

@ MrGrj Perintah benar-benar membuat sesuatu meledak

1
+1 untuk gif kedua " Dalam semangat tantangan "! :)
Kevin Cruijssen

10

Jelly ,  12  11 byte

-1 byte terima kasih kepada Erik the Outgolfer (tidak perlu menggunakan argumen swapped untuk bergabung)

j00,0jµ€Z$⁺

Cobalah online! Atau lihat suite tes .

Tautan monadik yang menerima dan mengembalikan daftar daftar.

Bagaimana?

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

Anda dapat menyimpan byte:j00,0jµ€Z$⁺
Erik the Outgolfer

Oh tentu saja terima kasih!
Jonathan Allan


6

MATL , 12 byte

FTXdX*0JQt&(

Input adalah matriks dengan ;pemisah baris.

Cobalah online!

Penjelasan

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Ã"²

Uji secara online! (Menggunakan -Qbendera agar hasilnya lebih mudah dimengerti.)

Mirip dengan jawaban Jelly, tapi jauh lebih lama ...

Penjelasan

Bagian luar kode hanyalah solusi untuk mensimulasikan Jelly's :

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

Kode itu sendiri adalah:

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.

Diulang dua kali, proses ini memberikan output yang diinginkan. Hasilnya dicetak secara implisit.


5

Sekam , 12 byte

₁₁
Tm»o:0:;0

Mengambil dan mengembalikan array integer 2D. Cobalah online!

Penjelasan

Gagasan yang sama seperti di banyak jawaban lain: tambahkan nol ke setiap baris dan transpos, dua kali. Operasi baris diimplementasikan dengan flip.

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

Mathematica, 39 byte

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

Cobalah di kotak pasir Wolfram! Sebut saja seperti " r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r@{{1,2},{3,4}}".

Seperti banyak jawaban lain, ini bekerja dengan mentransposisi dan mengacak nol di setiap baris kemudian melakukan hal yang sama lagi. Terinspirasi oleh jelly Jonathan Allan yang menjawab secara spesifik, tetapi hanya karena saya kebetulan melihat jawaban itu terlebih dahulu.


4

Dyalog APL, 24 byte

4 byte disimpan berkat @ZacharyT

5 byte disimpan berkat @KritixiLithos

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

Cobalah online!


Anda tidak perlu orangtua di sekitar 1,1,⍴⍵, kan?
Zacharý


@KritixiLithos penggunaan yang bagus 1 1+!
Uriel

Berorientasi array APL, jadi apakah akan 1+berhasil?
Zacharý

@ ZakaryT Saya baru menyadari bahwa setelah melihat jawaban Anda ...
Kritixi Lithos


3

Python 3 , 104 101 97 93 86 byte

  • @ Zakary T menyimpan 3 byte: variabel yang tidak digunakan wdihapus dan satu ruang yang tidak diinginkan
  • @ Zachary T menyimpan 4 byte lagi: [a,b]hanya a,bsaat menambahkan ke daftar
  • @nore tersimpan 4 byte: penggunaan slicing
  • @Zachary T dan @ovs membantu menghemat 7 byte: memeras pernyataan untuk loop
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

Cobalah online!


1
Anda dapat menghapus wdan menyimpan 2 byte: repl.it/JBPE
Zacharý

1
Oh, Anda memiliki ruang yang tidak dibutuhkan setelah barism+=[r,w]
Zacharý

1
Juga, dapatkah Anda menyimpan 4 byte dengan mengubah [j,0]ke j,0dan [r,m[0]ke r,m[0]?
Zacharý

1
Anda dapat menyimpan 4 byte lainnya menggunakan irisan array .
Nore

1
Anda dapat menyimpan tiga byte dengan mengonversi ke python2 dan mengubah forlekukan loop ke satu tab.
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

Pertama kali bermain golf! Bukan yang terbaik, tapi saya cukup bangga jika saya bisa mengatakannya sendiri!

  • -17 byte dari komentar Wheat
  • -4 byte dari inlining yang kedua untuk loop

Halo dan selamat datang di situs ini. Anda tampaknya memiliki banyak ruang kosong di sini. Misalnya beberapa dari Anda +=dan =dikelilingi oleh spasi, yang dapat dihapus. Selain itu melakukan +=dua kali berturut-turut dapat disederhanakan menjadi satu pernyataan, misalnyae+=str(d)+'0'
Wisaya Gandum

@WheatWizard: Terima kasih dan terima kasih. Disimpan 17 byte :)
Liren

Saya sekarang memperhatikan bahwa Anda dapat menutup forlingkaran dalam Anda ke satu baris for d in c:e+=str(d)+'0', tetapi Anda mungkin ingin pergi dengan peta bergabung (str, d)) + '0' , in which case it becomes pointless to define e` sama sekali.
Wheat Wizard

1
Ah, pikirkan itu sendiri! Hmm, saya harus belajar apa. Jo dan map () pertama saya kira. Aku akan kembali!
Liren

1
Anda dapat meletakkan definisi zdan rpada baris yang sama (dengan ;sela di antaranya), menyimpan byte indentasi.
Nore

3

R, 65 byte

Terima kasih kepada Jarko Dubbeldam dan Giuseppe untuk komentar yang sangat berharga!

Kode

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

Input untuk fungsi harus berupa array matriks atau dua dimensi.

Uji

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

Keluaran

> 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

Sekilas saya pikir menggunakan a=dim(x)*2+1bukan nrowdan ncolakan lebih baik. Anda kemudian dapat melakukan y=matrix(0);dim(y)=adan 2*1:a[1],2*1:a[2].
JAD

1
Sebenarnya y=array(0,a)akan lebih pendek.
JAD

1
Saya percaya Anda dapat menghapus tanda kurung di sekitar indeks, yaitu, 2*1:a[1]karena :memiliki prioritas lebih tinggi daripada*
Giuseppe


2

PHP , 98 byte

Input sebagai array 2D, Output sebagai string

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

Cobalah online!

PHP , 116 byte

Input dan Output sebagai array 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);

Cobalah online!


2

Clojure, 91 byte

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

Ulangi rentang dalam setengah langkah.



2

Python 2 , 64 byte

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

Cobalah online!

Fungsi gmenyelingi input antara nol. Fungsi utama mentranspos input saat menerapkan g, kemudian melakukannya lagi. Mungkin ada cara untuk menghindari pengulangan di fungsi utama.


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)

Diformat dan dikomentari

Memasukkan nol secara horizontal dan vertikal adalah operasi yang sangat mirip. Idenya di sini adalah menggunakan fungsi yang sama g () untuk kedua langkah.

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

Uji kasus


2

Arang , 49 byte

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

Cobalah online!

Input adalah string tunggal yang memisahkan baris dengan titik koma.


1
Arang modern dapat melakukan ini dalam 24 byte: ≔E⪪θ;⪫00⪫ι0θFθ⟦⭆ι0ι⟧⭆⊟θ0tetapi bahkan menghindari StringMap saya masih berpikir ini dapat dilakukan dalam 27 byte.
Neil

Oh, dan beberapa tips umum: ada variabel standar untuk string kosong, dan Anda bisa membuat string nol dengan panjang tertentu menggunakan Times atau Mold.
Neil

2

C ++ 17 + Modul, 192 byte

Input sebagai baris string dari cin , Output ke 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


Data

  • Input Int32[,] m Matriks yang akan meledak
  • Output Int32[,] Matriks yang meledak

Golf

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

Tidak disatukan

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

Tidak terbaca dibaca

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

Kode lengkap

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

Rilis

  • v1.0 - 146 bytes- Solusi awal.

Catatan

  • Tidak ada

Anda tidak perlu (int[,] m)=>, m=>cukup saja jika Anda menyatakan madalah 2D int-array int jawaban Anda. Juga, Anda dapat mengubah ,x,ke ,x=0,dan menyingkirkan x=0inisialisasi for-loop untuk -1 byte. Dan Anda dapat menghapus y++dari loop dalam dengan mengubah =m[x,y];ke =m[x,y++];untuk -1 byte tambahan. Tapi +1 dari saya, dan jika saya membuat port jawaban Anda juga lebih pendek dari jawaban Java saya saat ini. :)
Kevin Cruijssen

1

Dyalog APL, 24 byte

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

Setiap perbaikan disambut dan diinginkan!




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

Meminta matriks, mengembalikan matriks terlampir.

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

Cobalah online!

a←⎕ meminta matriks dan menetapkan ke a

 dimensi a (baris, kolom)

 kalikan dengan dua

1+ tambahkan satu

⍴∘0 1¨ gunakan masing-masing untuk r eshape (secara siklis) angka nol dan satu

{... }/ kurangi dengan menyisipkan fungsi anonim berikut antara dua angka:

⍵\a memperluas * kolom yang sesuai dengan argumen yang tepat

⍺⍀a perluas * baris yang sesuai dengan argumen kiri

* 0 memasukkan kolom / baris nol, 1 memasukkan kolom / baris data asli


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

Input dan output sebagai a int[][].

-33 byte dengan membuat port jawaban C # @auhmaan .

Penjelasan:

Coba di sini.

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


Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.