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