폭발 시키세요!


33

양의 정수로 된 행렬을 입력 하여 분해하십시오!


행렬을 분해하는 방법은 외부 경계를 포함하여 모든 요소 주위에 단순히 0을 추가하는 것입니다.

입력 / 출력 형식은 항상 선택 사항입니다!

테스트 사례 :

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

답변:


59

인화점 스크립팅 언어, 182 바이트

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}

언 골프 드 :

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
}

전화 :

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

산출:

도전의 정신에서 :


6
알 수 없는; 남자; 천.
MooseBoys 2016 년

2
지금 나는 혼란스러워한다
Grajdeanu Alex.

@MrGrj 명령은 문자 그대로 무언가를 날려

1
두 번째 gif " 도전의 정신 "에 +1 ! :)
Kevin Cruijssen 2016 년

10

젤리 ,  12  11 바이트

Outgolfer Erik 덕분에 -1 바이트

j00,0jµ€Z$⁺

온라인으로 사용해보십시오! 또는 테스트 스위트를 참조하십시오.

목록을 수락하고 리턴하는 모나드 링크.

방법?

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

바이트를 절약 할 수 있습니다 :j00,0jµ€Z$⁺
Outgolfer Erik

아, 물론 고마워요!
Jonathan Allan


6

MATL , 12 바이트

FTXdX*0JQt&(

입력은 ;행 구분 기호 가있는 행렬입니다 .

온라인으로 사용해보십시오!

설명

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

apt , 18 바이트

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

온라인으로 테스트하십시오! ( -Q출력을 이해하기 쉽도록 플래그를 사용합니다 .)

젤리 답변과 비슷하지만 훨씬 길다.

설명

코드의 외부 부분은 젤리를 시뮬레이션하는 해결 방법 일뿐입니다 .

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

코드 자체는 다음과 같습니다.

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.

이 과정을 두 번 반복하면 원하는 결과를 얻을 수 있습니다. 결과는 암시 적으로 인쇄됩니다.


5

껍질 , 12 바이트

₁₁
Tm»o:0:;0

2D 정수 배열을 가져와 반환합니다. 온라인으로 사용해보십시오!

설명

다른 많은 답변과 동일한 아이디어 : 각 행에 0을 추가하고 두 번 바꿉니다. 행 연산은 접기로 구현됩니다.

₁₁         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 바이트

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

Wolfram 샌드 박스에서 사용해보십시오! " r=Riffle[#,0,{1,-1,2}]&/@Thread@#&;r@*r@{{1,2},{3,4}}" 처럼 호출하십시오 .

다른 많은 답변과 마찬가지로 이것은 각 행에서 0을 바꾸고 리플 링 한 다음 동일한 작업을 다시 수행하여 작동합니다. 조나단 앨런의 영감 Jelly가 특별히 대답 했지만, 그 대답을 먼저 보았 기 때문입니다.


4

Dyalog APL, 24 바이트

@ZacharyT 덕분에 4 바이트 절약

@KritixiLithos 덕분에 5 바이트 절약

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

온라인으로 사용해보십시오!


주변에 괄호가 필요 1,1,⍴⍵하지 않습니까?
Zacharý


@KritixiLithos의 좋은 사용 1 1+!
Uriel

APL의 배열 지향적 1+입니까?
Zacharý

@ZacharyT 깨달았어요 당신의 대답은 ...보고 후
Kritixi LITHOS을


3

파이썬 3 , 104 101 97 93 86 바이트

  • @Zachary T는 3 바이트를 절약했습니다 : 사용하지 않는 변수가 w제거되었고 원치 않는 공간이 하나 있습니다.
  • @Zachary T는 또 다른 4 바이트를 저장 : [a,b]처럼 a,b목록에 추가하면서
  • @nore 저장 4 바이트 : 슬라이싱 사용
  • @Zachary T와 @ovs는 7 바이트를 절약하는 데 도움을줍니다 : 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

온라인으로 사용해보십시오!


1
당신은 w2 바이트를 제거 하고 저장할 수 있습니다 : repl.it/JBPE
Zacharý

1
오, 당신은 줄 뒤에 불필요한 공간이 있습니다m+=[r,w]
Zacharý

1
또한 및 로 변경 [j,0]하여 4 바이트를 절약 할 수 있습니까? j,0[r,m[0]r,m[0]
Zacharý

1
배열 슬라이스를 사용하여 다른 4 바이트를 저장할 수 있습니다 .
NORE

1
python2로 변환하고 for루프 들여 쓰기를 단일 탭으로 변경하여 3 바이트를 절약 할 수 있습니다 .
Zacharý

3

파이썬 3, 118 바이트

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

처음으로 골프! 최고는 아니지만, 내가 그렇게 말할 수 있다면 정말 자랑 스럽습니다!

  • 밀 주석에서 -17 바이트
  • 두 번째 for 루프 인라인에서 -4 바이트

안녕하세요. 사이트에 오신 것을 환영합니다. 여기에 많은 공백이있는 것 같습니다. 예를 들어 여러분 중 일부 +=와는 =제거 할 수 있습니다 공간에 둘러싸여 있습니다. 하고 또한 +=두 번 연속 예를 들어, 하나의 문장으로 간단하게 할 수있다e+=str(d)+'0'
밀 마법사

@WheatWizard : 감사합니다. 17 바이트 저장 :)
Liren

이제 내부 for루프를 한 줄로 축소 할 수 있음을 for d in c:e+=str(d)+'0'알았지 만 조인 맵 (str, d)) + ' , in which case it becomes pointless to define 0'e`를 사용하고 싶을 수도 있습니다.
밀 마법사

1
아, 그냥 생각 했어! 흠, .join과 map ()이 무엇인지 먼저 알아야합니다. 돌아 올게요!
Liren

1
당신의 정의를 넣을 수 있습니다 zr(A와 같은 줄에 ;들여 쓰기의 바이트를 저장, 그들 사이).
Nore

3

R, 65 바이트

Jarko Dubbeldam과 Giuseppe에게 감사의 말을 전합니다!

암호

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

함수의 입력은 행렬 또는 2 차원 배열이어야합니다.

테스트

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

산출

> 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=dim(x)*2+1대신 nrow하고 ncol더 좋을 것이다. 당신은 할 수 y=matrix(0);dim(y)=a2*1:a[1],2*1:a[2].
JAD

1
실제로 y=array(0,a)는 더 짧을 것입니다.
JAD

1
난 당신이 즉, 인덱스, 주위에 괄호를 제거 할 수 있다고 생각 2*1:a[1]하기 때문에 :보다 높은 우선 순위를 가지고*
주세페



2

클로저, 91 바이트

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

범위를 반 단계 씩 반복합니다.



2

파이썬 2 , 64 바이트

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

온라인으로 사용해보십시오!

이 함수 g는 0 사이의 입력을 산재합니다. 메인 함수는를 적용하는 동안 입력을 바꾸고 g다시 적용 합니다. 주요 기능에서 반복을 피할 수있는 방법이있을 수 있습니다.


2

자바 스크립트 (ES6), 73 72 바이트

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

형식화 및 의견

수평 및 수직으로 0을 삽입하는 것은 매우 유사한 작업입니다. 여기서 아이디어는 두 단계 모두에 동일한 함수 g () 를 사용하는 것 입니다.

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

테스트 사례


2

, 49 바이트

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

온라인으로 사용해보십시오!

입력은 행을 세미콜론으로 구분하는 단일 문자열입니다.


1
현대 숯은 24 ≔E⪪θ;⪫00⪫ι0θFθ⟦⭆ι0ι⟧⭆⊟θ0바이 트로이 작업을 수행 할 수 있지만 StringMap을 피하더라도 여전히 27 바이트로 수행 할 수 있다고 생각합니다.
Neil

아, 그리고 몇 가지 일반적인 팁 : 빈 문자열에 사전 정의 된 변수가 있으며 Times 또는 Mold를 사용하여 주어진 길이의 0으로 문자열을 만들 수 있습니다.
Neil

2

C ++ 17 + 모듈, 192 바이트

cin 에서 문자열 행으로 입력 , 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

기음# , 146 바이트


데이터

  • 입력 Int32[,] m 분해 할 매트릭스
  • Int32[,]분해 된 매트릭스 출력

골프

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

언 골프

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

언 골프 가능

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

전체 코드

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

자료

  • V1.0 - 146 bytes- 초기 솔루션입니다.

노트

  • 없음

당신은 필요하지 않습니다 (int[,] m)=>만, m=>당신 상태가 있으면 충분하다 m답 INT 차원의 int 배열입니다. 또한 -1 바이트의 for-loop 초기화에서로 변경 ,x,하여 ,x=0,제거 할 수 있습니다 x=0. 그리고 당신은 제거 할 수 있습니다 y++변경하여 내부 루프에서 =m[x,y];=m[x,y++];추가 -1 바이트를 위해. 그러나 나에게서 +1하고, 당신의 답변 포트를 만들면 그것은 현재 Java 답변보다 짧습니다. :)
Kevin Cruijssen 2016 년

1

Dyalog APL, 24 바이트

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

모든 개선을 환영하며 원합니다!




1

자바 스크립트 (ES6), 80 78 바이트

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 바이트

행렬을 묻습니다. 동봉 된 행렬을 반환합니다.

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

온라인으로 사용해보십시오!

a←⎕ 행렬에 대한 프롬프트를 표시 하고

 의 차원 (행, 열)

 2를 곱하다

1+ 하나 추가

⍴∘0 1¨ 각을 사용하여 , R의 eshape (순환) 번호는 0과 1

{}/ 두 숫자 사이에 다음 익명 함수를 삽입하여 줄입니다.

⍵\a 확장 *의 열 오른쪽 인자에 따라

⍺⍀a 왼쪽 인수에 따라 행을 확장하십시오.

* 0은 열 / 행 0을 삽입하고 1은 원본 데이터 열 / 행을 삽입합니다


1

자바 (8) 183 166 162 129 바이트

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

로 입력 및 출력 int[][].

@auhmaan 의 C # 응답 포트를 생성하여 -33 바이트 .

설명:

여기에서 시도하십시오.

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


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.