MATL , 30 28 27 바이트
t:P"@:s:@/Xk&+@+8MPt&(]30+c
온라인으로 사용해보십시오!
보너스 기능 :
들어 26 바이트 , 다음과 같은 수정 된 버전은 생산 그래픽 출력을 :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
MATL Online 에서 사용해보십시오 !
이미지가 약간의 색상 을 요구하고 있으며 7 바이트 만 소요됩니다.
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
MATL Online 에서 사용해보십시오 !
또는 더 긴 버전 (37 바이트)을 사용하여 문자 행렬이 점차 어떻게 구축 되는지 확인하십시오 .
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
MATL Online 에서 사용해보십시오 !
출력 예
input is 8의 경우 다음은 기본 버전, 그래픽 출력 및 컬러 그래픽 출력을 보여줍니다.



설명
일반 절차
숫자 형 매트릭스는 외부 레이어에서 내부 레이어로 N단계적으로 구성되며 N입력 위치 입니다. 각 단계는 이전 행렬의 내부 (왼쪽 위) 부분을 덮어 씁니다. 결국, 얻어진 행렬의 숫자는 문자로 변경됩니다.
예
입력을 4위해 첫 번째 행렬은
10 10 9 9 9 9 8 8 8 8
10 10 9 9 9 9 8 8 8 8
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
두 번째 단계로 매트릭스
7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5
후자의 상반부에 덮어 씁니다. 그런 다음 동일하게 수행됩니다.
6 5 5
5 4 4
5 4 4
그리고 마지막으로
3
결과 행렬은
3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
마지막으로 30각 항목에 추가되고 결과 숫자는 코드 포인트로 해석되어 문자로 변환됩니다 (따라서 시작하여 33에 해당 !).
중간 행렬의 구성
입력의 N경우 값을 k에서 N로 줄이는 것을 고려하십시오 1. 각각 k으로부터 정수 벡터 1에이 k*(k+1)발생하고, 각 항목으로 나누어 k과 올림. 예를 들어, 이것에 대해 k=4(모든 블록은 k마지막 블록을 제외하고 크기가 있습니다 ) :
1 1 1 1 2 2 2 2 3 3
반면 k=3결과는 다음과 같습니다 (모든 블록의 크기는 k다음과 같습니다).
1 1 1 2 2 2
이 벡터는 브로드 캐스트와 함께 요소별로 전치 된 사본에 추가됩니다. 그런 다음 k각 항목에 추가됩니다. 대한 k=4이 있습니다
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
8 8 8 8 9 9 9 9 10 10
8 8 8 8 9 9 9 9 10 10
이것은 가로 및 세로로 뒤집힌 것을 제외하고는 위에 표시된 중간 행렬 중 하나입니다. 따라서 남은 것은이 행렬을 뒤집어 지금까지 "누적 된"행렬의 왼쪽 상단 모서리에 쓰고 첫 번째 k=N단계 ( ) 의 빈 행렬로 초기화하는 것입니다.
암호
t % Implicitly input N. Duplicate. The first copy of N serves as the
% initial state of the "accumulated" matrix (size 1×1). This will be
% extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
:P % Range and flip: generates vector [N, N-1, ..., 1]
" % For each k in that vector
@: % Push vector [1, 2, ..., k]
s % Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
: % Range: gives vector [1, 2, ..., k*(k+1)/2]
@/ % Divide each entry by k
Xk % Round up
&+ % Add vector to itself transposed, element-wise with broadcast. Gives
% a square matrix of size k*(k+1)/2 × k*(k+1)/2
@+ % Add k to each entry of the this matrix. This is the flipped
% intermediate matrix
8M % Push vector [1, 2, ..., k*(k+1)/2] again
Pt % Flip and duplicate. The two resulting, equal vectors are the row and
% column indices where the generated matrix will be written. Note that
% flipping the indices has the same effect as flipping the matrix
% horizontally and vertically (but it's shorter)
&( % Write the (flipped) intermediate matrix into the upper-left
% corner of the accumulated matrix, as given by the two (flipped)
% index vectors
] % End
30+ % Add 30 to each entry of the final accumulated matrix
c % Convert to char. Implicitly display