Fallo esplodere!


33

Prendi una matrice di numeri interi positivi come input e fallo esplodere!


Il modo in cui esplodi una matrice è semplicemente aggiungendo zeri attorno ad ogni elemento, compresi i bordi esterni.

I formati di input / output sono opzionali come sempre!

Casi test:

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

Risposte:


59

Operazione linguaggio di 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}

Ungolfed:

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
}

Chiama con:

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

Produzione:

Nello spirito della sfida:


6
Sconosciuto; uomo; mille.
MooseBoys,

2
Ora sono confuso
Grajdeanu Alex.

@MrGrj Il comando fa letteralmente esplodere qualcosa

1
+1 per la seconda gif " Nello spirito della sfida "! :)
Kevin Cruijssen,

10

Gelatina ,  12  11 byte

-1 byte grazie a Erik the Outgolfer (non è necessario utilizzare argomenti scambiati per un join)

j00,0jµ€Z$⁺

Provalo online! O vedi una suite di test .

Un collegamento monadico che accetta e restituisce elenchi di elenchi.

Come?

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

È possibile salvare un byte:j00,0jµ€Z$⁺
Erik the Outgolfer,

Oh, certo, grazie!
Jonathan Allan,


6

MATL , 12 byte

FTXdX*0JQt&(

L'input è una matrice con ;come separatore di riga.

Provalo online!

Spiegazione

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

Provalo online! (Utilizza il -Qflag in modo che l'output sia più facile da capire.)

Simile alla risposta di Jelly, ma molto più a lungo ...

Spiegazione

La parte esterna del codice è solo una soluzione alternativa per simulare Jelly :

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

Il codice stesso è:

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.

Ripetuto due volte, questo processo fornisce l'output desiderato. Il risultato viene stampato implicitamente.


5

Buccia , 12 byte

₁₁
Tm»o:0:;0

Accetta e restituisce un array di numeri interi 2D. Provalo online!

Spiegazione

Stessa idea di molte altre risposte: aggiungi zero a ciascuna riga e trasponi due volte. L'operazione di riga viene implementata con una piega.

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

Provalo nella sandbox Wolfram! Chiamalo come " r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r@{{1,2},{3,4}}".

Come molte altre risposte, questo funziona trasponendo e sfogliando gli zeri in ogni riga e poi ripetendo la stessa cosa. Ispirato dalla risposta Jelly di Jonathan Allan in particolare, ma solo perché mi è capitato di vedere prima quella risposta.


4

Dyalog APL, 24 byte

4 byte salvati grazie a @ZacharyT

5 byte salvati grazie a @KritixiLithos

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

Provalo online!


Non hai bisogno di genitori intorno al 1,1,⍴⍵, vero?
Zacharý,


@KritixiLithos buon uso di 1 1+!
Uriel,

Orientato all'array di APL, quindi 1+funzionerebbe?
Zacharý,

@ZacharyT Mi sono appena reso conto che dopo aver visto la tua risposta ...
Kritixi Lithos,


3

Python 3 , 104 101 97 93 86 byte

  • @Zachary T ha salvato 3 byte: la variabile non utilizzata è stata wrimossa e uno spazio indesiderato
  • @Zachary T ha salvato ancora altri 4 byte: [a,b]come solo a,bdurante l'aggiunta a un elenco
  • @nore ha salvato 4 byte: uso di slicing
  • @Zachary T e @ovs hanno contribuito a salvare 7 byte: comprimendo le istruzioni per il ciclo
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

Provalo online!


1
Puoi rimuovere we salvare 2 byte: repl.it/JBPE
Zacharý il

1
Oh, hai uno spazio non necessario dopo la lineam+=[r,w]
Zacharý,

1
Inoltre, puoi salvare 4 byte cambiando [j,0]in j,0e [r,m[0]in r,m[0]?
Zacharý,

1
È possibile salvare altri 4 byte utilizzando le sezioni di array .
nore

1
Puoi salvare tre byte convertendoli in python2 e cambiando il forrientro del loop in una singola scheda.
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

Prima volta a giocare a golf! Non il migliore, ma sono abbastanza orgoglioso di poterlo dire io stesso!

  • -17 byte dai commenti sul grano
  • -4 byte dall'allineamento del secondo per il ciclo

Ciao e benvenuto nel sito. Sembra che tu abbia una buona dose di spazio qui. Ad esempio alcuni dei tuoi +=e =sono circondati da spazi, che possono essere rimossi. Inoltre, fare +=due volte di seguito potrebbe essere semplificato in una singola istruzione, ad esempioe+=str(d)+'0'
Wheat Wizard,

@WheatWizard: grazie e grazie. Salvato 17 byte :)
Liren il

Ora sto notando che puoi comprimere il tuo forciclo interno su una singola linea for d in c:e+=str(d)+'0', ma potresti voler andare con una mappa di join (str, d)) + '0' , in which case it becomes pointless to define e` affatto.
Wheat Wizard

1
Ah, ci ho pensato solo io! Hmm, dovrò imparare cosa .join e map () sono i primi immagino. Tornerò!
Liren,

1
È possibile inserire le definizioni di ze rsulla stessa riga (con una ;tra di esse), salvando un byte di rientro.
nore

3

R, 65 byte

Grazie a Jarko Dubbeldam e Giuseppe per i commenti molto preziosi!

Codice

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

L'input per la funzione deve essere una matrice o una matrice bidimensionale.

Test

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

Produzione

> 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

A prima vista, penso che usare a=dim(x)*2+1invece di nrowe ncolsarebbe meglio. Potresti quindi fare y=matrix(0);dim(y)=ae 2*1:a[1],2*1:a[2].
JAD,

1
In realtà y=array(0,a)sarebbe ancora più breve.
JAD,

1
Credo che puoi rimuovere le parentesi attorno agli indici, ovvero 2*1:a[1]perché :ha una precedenza più alta di*
Giuseppe,

2

Mathematica, 55 byte

(a=ArrayFlatten)@{o={0,0},{0,a@Map[{{#,0},o}&,#,{2}]}}&

3
o={0,0}può essere ridotto ao=0{,}
JungHwan Min

2

PHP , 98 byte

Input come array 2D, Output come stringa

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

Provalo online!

PHP , 116 byte

Input e Output come 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);

Provalo 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)))

Scorre le gamme in semipassi.



2

Python 2 , 64 byte

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

Provalo online!

La funzione ginfrange l'ingresso tra zero. La funzione principale traspone l'ingresso durante l'applicazione g, quindi lo fa di nuovo. Forse c'è un modo per evitare la ripetizione nella funzione principale.


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)

Formattato e commentato

L'inserimento di zeri in orizzontale e in verticale sono operazioni molto simili. L'idea qui è di usare la stessa funzione g () per entrambi i passaggi.

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

Casi test


2

Carbone , 49 byte

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

Provalo online!

L'input è una singola stringa che separa le righe con un punto e virgola.


1
Il carbone moderno può farlo in 24 byte: ≔E⪪θ;⪫00⪫ι0θFθ⟦⭆ι0ι⟧⭆⊟θ0ma anche evitando StringMap penso ancora che ciò possa essere fatto in 27 byte.
Neil,

Oh, e un paio di suggerimenti generali: esiste una variabile predefinita per la stringa vuota e puoi creare una stringa di zeri di una determinata lunghezza usando Times o Mold.
Neil,

2

Moduli C ++ 17 +, 192 byte

Input come file di stringhe da cin , Output a 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


Dati

  • Input Int32[,] m La matrice da esplodere
  • Output Int32[,] La matrice esplosa

golfed

(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

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

Leggibile non golfato

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

Codice completo

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

Uscite

  • v1.0 - 146 bytes- Soluzione iniziale.

Gli appunti

  • Nessuna

Non avrai bisogno di (int[,] m)=>, basta solo m=>se dichiari che mè un int-array 2D nella tua risposta. Inoltre, è possibile modificare ,x,per ,x=0,e sbarazzarsi del x=0nella inizializzazione per-loop per -1 di byte. E puoi rimuoverlo y++dal ciclo interno cambiando =m[x,y];in =m[x,y++];per un ulteriore -1 byte. Ma +1 da me, e se creo una porta della tua risposta è anche più breve della mia attuale risposta Java. :)
Kevin Cruijssen,

1

Dyalog APL, 24 byte

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

Eventuali miglioramenti sono benvenuti e desiderati!




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

Richiede matrice, restituisce matrice racchiusa.

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

Provalo online!

a←⎕ richiesta di matrice e assegnare ad una

 le dimensioni di un (righe, colonne)

 moltiplicare per due

1+ Aggiungi uno

⍴∘0 1¨ utilizzare ciascuno per r eshape (ciclicamente) i numeri zero e uno

{... }/ riduci inserendo la seguente funzione anonima tra i due numeri:

⍵\a espandi * le colonne di a secondo l'argomento giusto

⍺⍀a espandere * le righe di questo secondo l'argomento sinistro

* 0 inserisce una colonna / riga di zeri, 1 inserisce una colonna / riga di dati originali


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 e output come a int[][].

-33 byte creando una porta della risposta C # di @auhmaan .

Spiegazione:

Provalo qui.

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


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.