MATL , 59 54 52 바이트
4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)
온라인으로 사용해보십시오!
설명
코드는 세 가지 주요 단계를 따릅니다.
8x8 행렬 생성
4 0 0 3 0 0 0 4
0 1 0 0 0 2 0 0
0 0 1 0 0 0 3 0
3 0 0 1 0 0 0 3
0 0 0 0 1 0 0 0
0 2 0 0 0 2 0 0
0 0 3 0 0 0 3 0
4 0 0 3 0 0 0 5
15x15 매트릭스로 확장
4 0 0 3 0 0 0 4 0 0 0 3 0 0 4
0 1 0 0 0 2 0 0 0 2 0 0 0 1 0
0 0 1 0 0 0 3 0 3 0 0 0 1 0 0
3 0 0 1 0 0 0 3 0 0 0 1 0 0 3
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
0 2 0 0 0 2 0 0 0 2 0 0 0 2 0
0 0 3 0 0 0 3 0 3 0 0 0 3 0 0
4 0 0 3 0 0 0 5 0 0 0 3 0 0 4
0 0 3 0 0 0 3 0 3 0 0 0 3 0 0
0 2 0 0 0 2 0 0 0 2 0 0 0 2 0
0 0 0 0 1 0 0 0 0 0 1 0 0 0 0
3 0 0 1 0 0 0 3 0 0 0 1 0 0 3
0 0 1 0 0 0 3 0 3 0 0 0 1 0 0
0 1 0 0 0 2 0 0 0 2 0 0 0 1 0
4 0 0 3 0 0 0 4 0 0 0 3 0 0 4
'DtdTX.'
원하는 결과를 얻기 위해 해당 행렬로 문자열 을 색인화하십시오 .
1 단계
4 % Push 4
t: % Duplicate, range: pushes [1 2 3 4]
g % Logical: convert to [1 1 1 1]
2I5 % Push 2, then 3, then 5
v % Concatenate all stack vertically into vector [4 1 1 1 1 2 3 5]
Xd % Generate diagonal matrix from that vector
이제 0이 아닌 비 대각선 항목을 채워야합니다. 우리는 대각선 아래의 것을 채우고 대칭을 사용하여 다른 것을 채 웁니다.
각 값을 채우기 위해 선형 인덱싱을 사용합니다 ( 이 답변 , 길이 -12 스 니펫 참조). 그것은 마치 마치 하나의 차원을 가진 것처럼 매트릭스에 액세스하는 것을 의미합니다. 8 × 8 행렬의 경우 선형 인덱스의 각 값은 다음과 같이 항목을 나타냅니다.
1 9 57
2 10 58
3 11
4
5 ... ...
6
7 63
8 16 ... ... 64
따라서 다음은 왼쪽 하단 항목에 값 4를 지정합니다.
K % Push 4
8 % Push 8
( % Assign 4 to the entry with linear index 8
값 3의 코드는 비슷합니다. 이 경우 색인은 벡터입니다. 여러 항목을 채워야하기 때문입니다.
3 % Push 3
K % Push 4
23h % Push 23 and concatenate horizontally: [4 23]
32h % Push 32 and concatenate horizontally: [4 23 32]
( % Assign 4 to the entries specified by that vector
그리고 2 :
H % Push 2
14 % Push 14
( % Assign 2 to that entry
우리는 이제 행렬을
4 0 0 0 0 0 0 0
0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0
3 0 0 1 0 0 0 0
0 0 0 0 1 0 0 0
0 2 0 0 0 2 0 0
0 0 3 0 0 0 3 0
4 0 0 3 0 0 0 5
상반부를 채우기 위해 대칭을 활용합니다.
t! % Duplicate and transpose
XR % Keep the upper triangular part without the diagonal
+ % Add element-wise
2 단계
스택에는 이제 1 단계의 결과 인 8 × 8 행렬이 포함됩니다.이 행렬을 확장하기 위해 이번에는 2 차원으로 인덱싱을 사용합니다.
8: % Push vector [1 2 ... 7 8]
7:P % Push vector [7 6 ... 1]
h % Concatenate horizontally: [1 2 ... 7 8 7 ... 2 1]. This will be the row index
t % Duplicate. This will be the column index
3$ % Specify that the next function will take 3 inputs
) % Index the 8×8 matrix with the two vectors. Gives a 15×15 matrix
3 단계
스택에는 이제 2 단계에서 생성 된 15 × 15 매트릭스가 포함됩니다.
'DtdTX.' % Push this string
w % Swap the two elements in the stack. This brings the matrix to the top
) % Index the string with the matrix
X
하지*
않습니까? : o