피라미드 행렬 만들기


23

피라미드 행렬은 아래 두 행렬과 같이 모든 숫자가 중심점에서 증가하거나 감소하는 정사각 행렬입니다.

1  1  1  1  1
1  2  2  2  1
1  2  3  2  1
1  2  2  2  1
1  1  1  1  1

또는:

3  3  3  3  3
3  2  2  2  3
3  2  1  2  3
3  2  2  2  3
3  3  3  3  3

비제로 정수 감안 n번호로부터 어디로, 피라미드 행렬을 생성 1n증가하는 순서로 하나 (경우 N 중심으로부터 <0)하거나 감소하는 순서 (만약 N> 0). 경우 n도이며, 다음 4 개 센터 번호가있을 것입니다 (예 참조).

언제나처럼 :

  • 선택적 입력 및 출력 형식
    • 공백 수, 구분 기호 등은 선택 사항입니다.

테스트 사례 :

1
1

-1
1

5
1  1  1  1  1  1  1  1  1
1  2  2  2  2  2  2  2  1
1  2  3  3  3  3  3  2  1
1  2  3  4  4  4  3  2  1
1  2  3  4  5  4  3  2  1
1  2  3  4  4  4  3  2  1
1  2  3  3  3  3  3  2  1
1  2  2  2  2  2  2  2  1
1  1  1  1  1  1  1  1  1

-5
5  5  5  5  5  5  5  5  5
5  4  4  4  4  4  4  4  5
5  4  3  3  3  3  3  4  5
5  4  3  2  2  2  3  4  5
5  4  3  2  1  2  3  4  5
5  4  3  2  2  2  3  4  5
5  4  3  3  3  3  3  4  5
5  4  4  4  4  4  4  4  5
5  5  5  5  5  5  5  5  5

2
1  1  1  1
1  2  2  1
1  2  2  1
1  1  1  1

-2
2  2  2  2
2  1  1  2
2  1  1  2
2  2  2  2

-4
4  4  4  4  4  4  4  4
4  3  3  3  3  3  3  4
4  3  2  2  2  2  3  4
4  3  2  1  1  2  3  4
4  3  2  1  1  2  3  4
4  3  2  2  2  2  3  4
4  3  3  3  3  3  3  4
4  4  4  4  4  4  4  4

10
짝수 경우가 홀수 경우와 다른 이유는 무엇입니까? 행렬이 모두 동일한 패턴을 따를 수없는 이유는 없습니다.
Greg Martin

2
입력은 측벽의 길이 여야했기 때문에 홀수와 짝수 사이에는 차이가 있습니다. 대신 최대 값을 사용하기로 결정했지만 거기에서 이상하고 심지어는 차이를 유지했습니다. 이상하게 보일 수도 있고 좋은 설명이 아닐 수도 있지만 왜 차이가 있는지에 대한 설명 입니다. :-)
Stewie Griffin

2
우리는 가정 할 수 있습니까 -10 < n < 10?
Titus

2
그렇지 않은 경우는 괜찮아 보이는 만큼 그는 하나의 숫자로 말하기의 같은 정사각형처럼. 많은 10 초와 행 괜찮아요 다음 몇 10 초 ... 가진 사람들이 넓은 경우
스튜이 그리핀

답변:


5

젤리 , 18 17 바이트

|1ŒḄfR«þ`
AÇạẋ¡CG

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 .

작동 원리

|1ŒḄfR«þ`  Helper link. Argument: k (positive integer)

|1         Take the bitwise OR with 1. This increments k if it is even.
  ŒḄ       Bounce; yield [1, 2, ..., k | 1, ..., 2, 1].
    fR     Filter range; remove elements not in [1, ..., k] from the array.
           This results in [1, 2, ..., k, ..., 2, 1] if k is odd and in
           [1, 2, ..., k, k, ..., 2, 1] if k is even.
        `  Pass the last return value as left and right argument to:
      «þ     Minimum table; take the minimum of each pair of elements in the
             generated array, returning a 2D array.


AÇạẋ¡CG      Main link. Argument: n

A            Take the absolute value of n.
 Ç           Call the helper link on the result.
     C       Complement; yield 1 - n.
    ¡        Conditional application:
   ẋ           If repeating the return value of Ç 1 - n times results in a non-
               empty array, i.e., if n < 1:
  ạ              Take the absolute differences of the generated integers and 1 - n.
      G      Grid; join columns by spaces, rows by linefeeds.

7

엑셀 : 126 바이트

=MAX(MIN(MIN(CELL("row",RC)-1,CELL("col",RC)-1),MIN(((ABS(R1C1)-1)*2+3)-CELL("row",RC),((ABS(R1C1)-1)*2+3)-CELL("col",RC))),0)

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

참고 :이 답변은 R1C1 표기법을 사용합니다. 직접 시도해보십시오. Excel 옵션에서 켜야합니다.

주어진 공식은 (2,2)를 넘어 존재하는 모든 세포에 있어야합니다. 원하는 피라미드 크기를 (1,1)에 넣으십시오.

작동하는 수식의 빠른 화면 캡 :
여기에 이미지 설명을 입력하십시오

다음은 조건부 서식을 사용하여 재미있는 추가 그림입니다!

* 현재 업데이트하는 데 시간이 오래 걸립니다.


이것은 부정적인 경우 나 짝수 경우를 제대로 처리하지 못합니다. 또한 =MAX(MIN(MIN(ROW()-1,COLUMN()-1),MIN(((ABS(A1)-1)*2+3)-ROW(),((ABS(A1)-1)*2+3)-COLUMN())),0)92 바이트 인 코드를 줄일 수 있습니다 . 그래도 여전히 케이스를 처리하지 않으며 셀 참조가 잠겨 있지 않으므로 수식을 드래그 할 수 없습니다.
gtwebb

1
그래도 더 많은 골프 같은 문제. =MEDIAN(MIN(ROW()-1,COLUMN()-1),ABS(A1)*2+1-MAX(ROW(),COLUMN()),0)
gtwebb

@gtwebb 고맙습니다. 수정해야합니다

-1. 작동하지 않습니다. 음수 입력을 처리하지 않습니다. 입력조차 처리하지 않습니다. 적용 가능한 모든 셀 에이 수식을 Range넣으려면 126 바이트 이상이 필요합니다.
AdmBorkBork

7

파이썬 2, 109 99 98

n=input()
r=range(1,abs(n)+1)
l=r+r[~n|-2::-1]
for j in l:print[abs((n<0)*~-n+min(i,j))for i in l]

리스트 작성

l = [1,2,3,4,5,4,3,2,1]

조금 가지고 놀아주세요.


편집 : 2 바이트에 대한 목록 + thx Lynn을 만드는 새로운 방법


If n is even, then there will be 4 center numbers
Rod

@로드 아니에요. 어떤 것이 너를 그렇게 생각하게 만들었습니까?
pacholik

3
이것은 규칙 중 하나입니다
Rod

@로드 오. 몇 분 전에 편집했습니다.
pacholik

2
새롭지 않고 강조되지 않았습니다 : c
Rod

6

MATL , 26 24 바이트

oXyG|to-:"TTYaQ]G0<?G+q|

온라인으로 사용해보십시오! 또는 모든 테스트 사례를 확인하십시오 (테스트 스위트 역할을하기 위해 약간 수정 된 코드).

설명

이 코드는 먼저 양의 입력을 가정하여 출력 배열을 빌드합니다 n. 배열은 1홀수 입력 또는 짝수 입력을위한 빈 배열로 초기화됩니다 (입력의 패리티와 크기가 같은 항등 행렬로 생성됨). 그런 다음 n균등 한 입력과 n-1홀수 입력의 시간 이 반복 됩니다.를 포함하는 프레임으로 배열을 확장하고 모든 요소에 0추가하십시오 1.

예를 들어, 입력 단계 n는 다음과 같습니다.

  • 초기 배열 :

    1
    
  • 프레임으로 확장 :

    0 0 0
    0 1 0
    0 0 0
    
  • 추가 1:

    1 1 1
    1 2 1
    1 1 1
    
  • 프레임으로 확장 :

    0 0 0 0 0
    0 1 1 1 0
    0 1 2 1 0
    0 1 1 1 0
    0 0 0 0 0
    
  • 추가 1:

    1 1 1 1 1
    1 2 2 2 1
    1 2 3 2 1
    1 2 2 2 1
    1 1 1 1 1
    

이것은 양의 입력에 대한 올바른 출력을 제공합니다. 입력이 음수이면 입력에서 빼기를 더하고 1절대 값을 취하여 배열을 수정해야 합니다.

    3 3 3 3 3
    3 2 2 2 3
    3 2 1 2 3
    3 2 2 2 3
    3 3 3 3 3

MATL Online 에서 배열이 커지는 것을 볼 수 있습니다 (중간 단계를 표시하도록 수정 된 코드) . 통역사는 여전히 베타 버전입니다. 작동하지 않으면 "실행"을 다시 누르거나 페이지를 다시로드하십시오.

주석이 달린 코드

o        % Take input implicitly and push 0 if even or 1 if odd
Xy       % Identity matrix of that size. Gives either 1 or empty array
G|       % Absolute value of input
to-      % Subtract 1 if odd
:"       % For loop: repeat that many times
  TTYa   %   Add a frame of zeros in the two dimensions
  Q      %   Add 1 to all elements
]        % End for
G        % Push input again
0>       % is it negative?
?        % If so
  G      %   Push input again
  +      %   Add
  q      %   Subtract 1
  |      %   Absolute value
         % End if implicitly
         % Display implicitly

애니메이션 질문에서 코드를 재사용했음을 알았습니다. 대박! 재미있는 부분은,이 코드는 다른 버전보다 길더라도 여전히 그 질문에서 이길 수 있다는 것입니다.).
Magic Octopus Urn

1
예 @carusocomputing, 그것은 유사 : 중복, 디스플레이, 선명한 출력을 1 초 일시 정지 :-)
루이스 Mendo

또한 이유는 확실하지 않지만 14를 초과하는 입력은 14에서 중지됩니다. 취소는 온라인 콘솔 "작동 시간 초과"의 제한 사항입니다.
Magic Octopus Urn

@carusocomputing 오류에 "작동 시간 초과"가 표시됩니다. 통역사가 너무 오래 걸리는 것 같습니다. 시도 말을 일시 정지를 감소 .2
루이스 Mendo에게

@carusocomputing 온라인 인터프리터의 타임 아웃입니다. 현재 작업을 30 초로 제한합니다. 루이스에서 알 수 있듯이, 당신은 일시 정지 시간을 줄일 수 있습니다
Suever

3

파이썬 2.7 : 123 122 120 바이트

프로브는 여전히 몇 바이트를 절약 할 수 있습니다 ...

from numpy import*
n=input()
N=abs(n)
e=N*2-N%2
a=ones([e,e])
for i in range(N):a[i:e-i,i:e-i]=(i+1)*(n>0)or-n-i
print a

edit1 : N=abs(n)1 바이트 저장

edit2 : (i+1)*(n>0)or-n-i2 바이트 저장


3

하스켈 119 113 110 104 102 101 바이트

f x|(h,t)<-splitAt(mod x 2)$[x,x-1..1]++[1.. -x]=foldl(\m n->(n#)<$>(n<$m)#m)[[y]|y<-h]t
x#y=x:y++[x]

행렬을 정수 목록으로 리턴합니다 (예 : f 2->) [[1,1,1,1],[1,2,2,1],[1,2,2,1],[1,1,1,1]].

작동 방식 :

            [x,x-1..1]++[1.. -x]      -- make list from x down to 1 followed by
                                      -- 1 to (-x). One of the sublists will be
                                      -- empty. The resulting list contains the
                                      -- numbers of the pyramid from inside to out.
   (h,t)<-splitAt(mod x 2)            -- bind h to the first element if x is odd
                                      -- or to the empty list if x is even
                                      -- bind t to the rest (tail or full list)

foldl (     ) [[y]|y<-h] t            -- fold the following function into t with a
                                      -- starting value of [] if x is even or
                                      -- [[h]] if x is odd

   \m n ->                            -- the current matrix m with the next number
                                      -- n is transformed into a new matrix:

               (n#)<$>(n<$m)#m        -- prepend and append a n to 
                                      -- m prepended and append by a line of n's

x#y=x:y++[x]                          -- helper function to prepend and append an
                                      -- element x to a list y

2

펄, 175 바이트

에 대해 1 바이트를 포함합니다 -p.

($t,$v,$w)=($_,(abs)x2);$k=$_.$k for 1..$v;map{$r.=$_ for(@v=1..$_-1),$_ x(2*$v---$w%2),reverse@v;$r.=$/}1..$v;$_=$r.~~reverse$r;eval"y/1-$w/$k/"if$t<0;$w%2&&s/

.*//||s;

;

(마크 다운으로 표시하는 방법을 모르는 후행 줄 바꿈이 있지만 필요합니다).

요구 -p뿐만 아니라 같은 -M5.010또는 -E실행하는 :

perl -pE '($t,$v,$w)=($_,(abs)x2);$k=$_.$k for 1..$v;map{$r.=$_ for(@v=1..$_-1),$_ x(2*$v---$w%2),reverse@v;$r.=$/}1..$v;$_=$r.~~reverse$r;eval"y/1-$w/$k/"if$t<0;$w%2&&s/

.*//||s;

;
' <<< 5

젠장, 이건 너무 길다. 시간이 있으면 다른 방법을 시도 할 것이다.


왜 사용 eval합니까?
Titus

@Titus 때문에 y///보간, 그래서 보간에 따옴표를 사용하지 않는 $w$k다음 eval실행 y///.
Dada

2

파이썬 2, 109 바이트

n=input()
a=abs(n)
s=a*2-a%2
r=range(s)
for y in r:print[(min,max)[n<0](x+1,s-x,y+1,s-y)-(n<0)*s/2for x in r]

2

J, 29 26 바이트

1+**[:<./~**i.,2&|1&}.i.@-

용법

   f =: 1+**[:<./~**i.,2&|1&}.i.@-
   f 1
1
   f _1
1
   f 2
1 1 1 1
1 2 2 1
1 2 2 1
1 1 1 1
   f _2
2 2 2 2
2 1 1 2
2 1 1 2
2 2 2 2
   f 3
1 1 1 1 1
1 2 2 2 1
1 2 3 2 1
1 2 2 2 1
1 1 1 1 1
   f _3
3 3 3 3 3
3 2 2 2 3
3 2 1 2 3
3 2 2 2 3
3 3 3 3 3

설명

양수 와 음수에 대한 범위 i.동사 출력 은 여기서 유용합니다.[0, 1, ..., n-1]n[n-1, n-2, ..., 0]n

1+**[:<./~**i.,2&|1&}.i.@-  Input: integer n
                         -  Negate n
                      i.@   Creates range for -n
               2&|          Take n modulo 2, returns 0 or 1
                  1&}.      If n is odd, drop the first value from the range for -n
                            Else do nothing and pass it unmodified
              ,             Append it to
            i.              The range for n
          *                 Get the sign of n
           *                Multiply elementwise with the joined ranges
    [:<./~                  Form a table of the minimum values of the range
  *                         Get the sign of n
   *                        Multiply elementwise with the joined ranges
1+                          Add 1 to each and return

2

Mathematica, 78 바이트

Abs[Fold[ArrayPad[#,1,#2]&,Table[0,#,#]&@Mod[#,2,1],Range[Abs@#-1]]+1~Min~-#]&

설명

Table[0,#,#]&@Mod[#,2,1]

초기 행렬을 홀수이면 1x1, 짝수이면 2x2로 만듭니다.

Range[Abs@#-1]

1에서 abs (input)-1까지 목록을 생성하십시오.

Fold[ArrayPad[#,1,#2]&, ..., ...]

위에서 언급 한 목록을 사용하여 초기 배열을 채 웁니다.

... +1~Min~-#

1 또는-입력 중 더 작은 값을 추가하십시오.

Abs

전체 행렬에 절대 값을 적용합니다.


1

PHP, 177 157 바이트

for($y=-$n=abs($z=$argv[1])+1;++$y<$n;)if($y&&($n&1||$y-1)){for($x=-$n;++$x<$n;)if($x&&($n&1||$x-1)){$v=max(abs($x),abs($y));echo$z<0?$v:$n-$v," ";}echo"
";}

와 실행 php -r '<code>

행과 열을 반복하고 중심까지의 거리에 따라 값을 인쇄합니다.

  • $n=abs($z)+1다음은 +1몇 저장 +1하고 -1나중에 표현의를
  • 루프에서 이동 -$n+1(조건에 사전 증가!)을 $n-1( -abs($z)abs($z))
  • 행 / 열 0 (및 홀수 $n: 1)을 건너 뜁니다
    ( $n&1여기의 열에도 적용됩니다. +1?를 기억하십시오 )
  • 긍정적 인 $ z 인쇄는 또한로부터 혜택을받습니다 +1.

1

하스켈 191 183 173 169 168 바이트

r=reverse;m=map
x!y=(((++)<*>(x.r)).).zipWith(++).m y
g n|n<0=m(m$abs.((n-1)+)).g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n]
g.(0-)

용법:

mapM_ print $ (g.(0-)) 3

[1,1,1,1,1]
[1,2,2,2,1]
[1,2,3,2,1]
[1,2,2,2,1]
[1,1,1,1,1]

2 10 20 24 바이트의 nimi 덕분에 !


1
negate입니다 (0-)
nimi

1
당신은 변경할 수 있습니다 f[id!id,tail!init]!!mod n 2다음 인라인을로 g하고 사용 1<2지점의 중간 결과를 결합하는 가드 : g n| ... |q<-r<$>a n=([id!id,tail!init]!!mod n 2)q$a n. 기본 기능의 이름은 필요하지 않습니다.
nimi

1
아, 당신도 인라인 할 수 a있습니다 (그리고 1<2가드 로 다시 전환하십시오 ) g n| ... |1<2=[id!id,tail!init]!!mod n 2=<<map r$r$(\x->(x<$[1..x])++[x+1..n])<$>[1..n].
nimi

1
오늘의 마지막 : m=map, in !: ...(++).m yg: g n|n<0=m(m(abs.((n-1)+)))$g$abs n|1<2=[id!id,tail!init]!!mod n 2=<<m r$r$m(\x->(x<$[1..x])++[x+1..n])[1..n].
nimi

1

자바 스크립트 (ES6), 107 바이트

(n,l=Math.abs(n+n-n%2))=>[...Array(l--)].map((_,i,a)=>a.map((_,j)=>(j=Math.min(i,l-i,j,l-j),n<0?-n-j:j+1)))

l배열의 크기입니다. 는 n<0?-n-j:j+1어색한 듯 보이지만 난 아무것도 더 나은 찾을 수 없습니다.


1

빔, 152 143 바이트

나는 이것이 더 마지막으로 골프를 칠 수 있다고 확신합니다. 특히 마지막 두 줄입니다.

D:let@z=@-/abs(@-)
a"nywYp:s/\d/x/g<C-v>
YggP:%s/.*/x \0 x<C-v>
:%s/x\+/\=@n-@z/g<C-v>
<Esc>v0"qda<C-r>=@z<0?1:@-*@z
<Esc>@=@-%2?"":"YPJYp"
@=@-*@z-1.(@-*@z>1?"@q":"")

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

다음은 인쇄 할 수없는 문자가있는 xxd 형식입니다.

0000000: 443a 6c65 7440 7a3d 402d 2f61 6273 2840  D:let@z=@-/abs(@
0000010: 2d29 0a61 226e 7977 5970 3a73 2f5c 642f  -).a"nywYp:s/\d/
0000020: 782f 6716 0a59 6767 503a 2573 2f2e 2a2f  x/g..YggP:%s/.*/
0000030: 7820 5c30 2078 160a 3a25 732f 785c 2b2f  x \0 x..:%s/x\+/
0000040: 5c3d 406e 2d40 7a2f 6716 0a1b 7630 2271  \=@n-@z/g...v0"q
0000050: 6461 123d 407a 3c30 3f31 3a40 2d2a 407a  da.=@z<0?1:@-*@z
0000060: 0a1b 403d 402d 2532 3f22 223a 2259 504a  ..@=@-%2?"":"YPJ
0000070: 5970 220a 403d 402d 2a40 7a2d 312e 2840  Yp".@=@-*@z-1.(@
0000080: 2d2a 407a 3e31 3f22 4071 223a 2222 29    -*@z>1?"@q":"")

설명

그것은 센터 번호를 xes 와 함께 중심에서 바깥쪽으로 피라미드를 만듭니다 .

x x x
x 5 x
x x x

그런 다음 xes를 다음 숫자로 바꾸고 xes로 다시 둘러 쌉니다 .

x x x x x
x 4 4 4 x
x 4 5 4 x
x 4 4 4 x
x x x x x

...등등. 짝수의 경우 동일한 작업을 수행하지만 2x2 기본으로 시작합니다.

코드는 "ungolfed"입니다. 매크로를 버퍼에 입력하고 (따라서 모든 <C-v>s) 레지스터에 삭제 하여 매크로를 "레코딩"한다는 점에서 다소 관습 적이 지 않습니다. 이것이 실제로 키 스트로크를 실행하지 않고 매크로를 구성하는 가장 좋은 방법입니다.

D:let@z=@-/abs(@-)<CR>       " Delete the input (into @-) and set @z to -1 if @- is negative; otherwise 1
a                            " Enter insert mode to compose the macro
  "nyw                         " Copy the number under the cursor to @n
  Yp                           " Copy this line and paste it below
  :s/\d/x/g<C-v><CR>           " Replace digits in the copy with 'x'
  YggP                         " Copy this line and paste it at the top of the buffer
  :%s/.*/x \0 x<C-v><CR>       " Add an 'x' before and after each line
  :%s/x\+/\=@n-@z/g<C-v><CR>   " Replace all 'x'es (and 'xx'es etc.) with the next number
<Esc>v0"qd                   " Done composing macro; delete it into @q (buffer is now empty)
a<C-r>=@z<0?1:@-*@z          " Append the center number (1 or abs(@-)) to the buffer
<Esc>@=@-%2?"":"YPJYp"       " If the input is even, make a 2x2 square
@=@-*@z-1.(@-*@z>1?"@q":"")  " Execute the macro abs(@-)-1 times if it's > 1

0

PHP, 215 바이트

for($i=0;$i<$m=($r=($s=abs($n=$argv[1]))*2-$s%2)**2;){$i%$r?:print"\n";$l=min(($x=$i%$r+1)<$s?$x:$x=$r-$x+1,($z=1+floor($i++/$r))<$s?$z:$z=$r-$z+1);$o=($n>0)?$l:$s+1-$l;echo str_pad(" ",1+strlen($s)-strlen($o)).$o;}

0

R, 112 바이트

k=abs(n);l=2*k;m=diag(l);for(i in 1:k){m[i:(l+1-i),i:(l+1-i)]=i};if(n%%2==1){m=m[-k,-k]};if(n<0){m=abs(m-1+n)};m

n작업 공간에 정수 가 필요합니다 . 그렇지 않으면 n=scan()추가 8 바이트를 실행하십시오 .

k=abs(n)
l=2*k
m=diag(l)                    # Initialize quadratic 2*|n| matrix
for(i in 1:k){
    m[i:(l+1-i),i:(l+1-i)]=i # Assign values to matrix elements according
                             # to their index
}
if(n%%2==1){
   m=m[-k,-k]                # If n is odd, delete middle row and column
}
if(n<0){
    m=abs(m-1+n)             # If n < 0, flip values
}
m                            # Print matrix
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.