차이 피라미드를 시각화


15

차이 피라미드는 각 새 대각선이 마지막 대각선의 요소 간 차이의 절대 값 인 피라미드입니다. 예를 들어 배열로 시작하면

2 5 4 9 3 4

이제 우리는 이것을 대각선 열에 배열합니다.

     2
      5
       4
        9
         3
          4

이제 다음 대각선을 채 웁니다. 이 배열의 연속 요소 간의 절대 차이점은 다음과 같습니다.

3 1 5 6 1

이것이 우리의 다음 대각선입니다.

     2
    3 5
     1 4
      5 9
       6 3
        1 4

피라미드가 채워질 때까지 반복하십시오.

     2
    3 5
   2 1 4
  2 4 5 9
 1 3 1 6 3
0 1 4 5 1 4

도전

range의 양의 정수 목록이 주어지면 [0, 9]해당 특정 배열에 대한 차이 피라미드의 ASCII 아트 표현을 생성하십시오. 입력에는 두 가지 이상의 요소가 포함됩니다. 이 숫자는 합리적인 형식으로 취할 수 있습니다. (배열 / 목록 / 이것이 무엇이든, 문자열, 명령 행 인수 등) 각 행의 후행 공백과 최대 하나의 후행 줄 바꿈이 허용됩니다.

IO 테스트

[1, 2, 3, 4, 5, 6, 7, 8, 9]

        1
       1 2
      0 1 3
     0 0 1 4
    0 0 0 1 5
   0 0 0 0 1 6
  0 0 0 0 0 1 7
 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

[4, 7]

 4
3 7

[3, 3, 3]

  3
 0 3
0 0 3

[1, 3, 6, 3, 4, 9]

     1
    2 3
   1 3 6
  1 0 3 3
 1 2 2 1 4
1 0 2 4 5 9


[8, 7, 3, 2, 4, 5, 9, 1, 6]

        8
       1 7
      3 4 3
     0 3 1 2
    2 2 1 2 4
   0 2 0 1 1 5
  0 0 2 2 3 4 9
 1 1 1 1 1 4 8 1
0 1 0 1 0 1 3 5 6

평소와 같이 이것은 코드 골프이므로 표준 허점이 적용되어 바이트 단위의 최단 답변이 이깁니다!


영감을받은 이 OEIS 하고 이 추측 .

답변:


8

젤리 , 16 바이트

IA$ṖпUṚz”@ṚGḟ”@

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

배경

차이점을 생성하는 것은 매우 간단합니다. 입력

[1, 2, 3, 4, 5, 6, 7, 8, 9]

IA$Ṗп (하나 이상의 요소가있는 동안 증분의 절대 값)은 다음과 같은 거친 2D 배열을 생성합니다.

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 1, 1, 1, 1, 1, 1, 1]
[0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0]
[0, 0]
[0]

U순서와 행 순서를 반대로하여 다음을 생성합니다.

[0]
[0, 0]
[0, 0, 0]
[0, 0, 0, 0]
[0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0]
[1, 1, 1, 1, 1, 1, 1, 1]
[9, 8, 7, 6, 5, 4, 3, 2, 1]

이제 z”@행으로 변환하기 전에 모든 행을 같은 길이로 채우는로 행과 열을 바꿉니다. 결과는 다음과 같습니다.

[0, 0, 0, 0, 0, 0, 0, 1, 9]
[@, 0, 0, 0, 0, 0, 0, 1, 8]
[@, @, 0, 0, 0, 0, 0, 1, 7]
[@, @, @, 0, 0, 0, 0, 1, 6]
[@, @, @, @, 0, 0, 0, 1, 5]
[@, @, @, @, @, 0, 0, 1, 4]
[@, @, @, @, @, @, 0, 1, 3]
[@, @, @, @, @, @, @, 1, 2]
[@, @, @, @, @, @, @, @, 1]

행을 뒤집 으면

[@, @, @, @, @, @, @, @, 1]
[@, @, @, @, @, @, @, 1, 2]
[@, @, @, @, @, @, 0, 1, 3]
[@, @, @, @, @, 0, 0, 1, 4]
[@, @, @, @, 0, 0, 0, 1, 5]
[@, @, @, 0, 0, 0, 0, 1, 6]
[@, @, 0, 0, 0, 0, 0, 1, 7]
[@, 0, 0, 0, 0, 0, 0, 1, 8]
[0, 0, 0, 0, 0, 0, 0, 1, 9]

2D 배열을 공백으로 구분 된 문자열로 바꾸려면 내장 그리드 아톰 ( G)을 사용합니다. 공백으로 열과 줄 바꿈으로 행을 결합하여 다음과 같은 결과를 얻습니다.

@ @ @ @ @ @ @ @ 1
@ @ @ @ @ @ @ 1 2
@ @ @ @ @ @ 0 1 3
@ @ @ @ @ 0 0 1 4
@ @ @ @ 0 0 0 1 5
@ @ @ 0 0 0 0 1 6
@ @ 0 0 0 0 0 1 7
@ 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

할 남은 모든 것은 함께 패딩 문자를 제거하고 ḟ”@산출

        1
       1 2
      0 1 3
     0 0 1 4
    0 0 0 1 5
   0 0 0 0 1 6
  0 0 0 0 0 1 7
 0 0 0 0 0 0 1 8
0 0 0 0 0 0 0 1 9

원하는 출력입니다.



2

J, 46 42 39 36 바이트

(#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]

간단한 구현입니다. 각 쌍 간의 연속적인 차이 테이블을 생성하고 입력 배열의 길이와 동일한 횟수만큼 반복합니다. 그런 다음 해당 테이블의 각 대각선을 가로 질러 삼각형의 행을 형성합니다. 나머지는 행을 피라미드로 형식화합니다.

용법

   f =: (#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]
   f 2 5 4 9 3 4
     2     
    3 5    
   2 1 4   
  2 4 5 9  
 1 3 1 6 3 
0 1 4 5 1 4
   f 4 7
 4 
3 7
   f 8 7 3 2 4 5 9 1 6
        8        
       1 7       
      3 4 3      
     0 3 1 2     
    2 2 1 2 4    
   0 2 0 1 1 5   
  0 0 2 2 3 4 9  
 1 1 1 1 1 4 8 1 
0 1 0 1 0 1 3 5 6

설명

(#\-#)|."_1#{.[:":@|./.<@#2&(|@-/\)]  Input: list A
                         #            Get len(A)
                       <@             Box it
                                   ]  Get A
                          2&(     )   Repeat len(A) times on A initially
                          2      \      Get each iverlapping sublist of size 2
                                /       Reduce it using
                             |@-          The absolute value of the difference

                                      This will form a table where each row contains the
                                      successive differences
              [:     /.               Operate on the diagonals of that table
                   |.                 Reverse each diagonal
                ":@                   Format each into a string
           #                          Get len(A)
            {.                        Take that many from the strings of diagonals
 #\                                   Get the length of each prefix of A
                                      Makes the range [1, 2, ..., len(A)]
    #                                 Get len(A)
   -                                  Subtract the len(A) from each in the prefix range
                                      Makes [-len(A)+1, ..., -1, 0]
      |."_1                           Rotate each string left using each value
                                      A negative rotate left = rotate right
                                      Output the pyramid


1

파이썬 3, 144 바이트

def f(x):
 y=[x]
 for i in range(len(x)-1):y+=[['']*-~i+[abs(y[i][j]-y[i][j+1])for j in range(i,len(y[i])-1)]]
 for i in zip(*y):print(*i[::-1])

x인수를 통해 목록 을 입력 하고 결과를 STDOUT에 인쇄 하는 함수입니다 .

작동 원리

프로그램은리스트의 입력을 x받아 중첩리스트를 초기화 y합니다 y[0] = x. 그런 다음 y(처음에 x) 마지막 목록의 절대 차이 가 생성되어 y길이 목록에 1도달 할 때까지 목록으로 추가됩니다 . 각 단계에서 목록은 공백으로 미리 채워져 있으므로 모든 목록의 y길이는와 같습니다 x. 다음으로, y각 출력 라인에 대한 튜플을 포함하지만 뒤집힌 채로 바뀝니다. 조옮김의 각 튜플은 포장을 풀고 뒤집어 인쇄하여 STDOUT에 차이 피라미드를 남깁니다.

Ideone에서 사용해보십시오

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