MATL , 59 54 52 byte
4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)
Hãy thử trực tuyến!
Giải trình
Mã theo ba bước chính:
Tạo ma trận 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
Mở rộng nó sang ma trận 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
Lập chỉ mục chuỗi 'DtdTX.'
với ma trận đó để tạo ra kết quả mong muốn.
Bước 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
Bây giờ chúng ta cần điền vào các mục không chéo. Chúng tôi sẽ chỉ điền những cái bên dưới đường chéo, và sau đó sử dụng tính đối xứng để điền vào những cái khác.
Để điền vào từng giá trị, chúng tôi sử dụng lập chỉ mục tuyến tính (xem câu trả lời này , đoạn dài 12 đoạn). Điều đó có nghĩa là truy cập vào ma trận như thể nó chỉ có một chiều. Đối với ma trận 8 × 8, mỗi giá trị của chỉ số tuyến tính đề cập đến một mục như sau:
1 9 57
2 10 58
3 11
4
5 ... ...
6
7 63
8 16 ... ... 64
Vì vậy, sau đây gán giá trị 4 cho mục dưới bên trái:
K % Push 4
8 % Push 8
( % Assign 4 to the entry with linear index 8
Mã cho giá trị 3 là tương tự. Trong trường hợp này, chỉ mục là một vectơ, bởi vì chúng ta cần điền vào một số mục:
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
Và cho 2:
H % Push 2
14 % Push 14
( % Assign 2 to that entry
Bây giờ chúng ta có ma trận
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
Để lấp đầy nửa trên, chúng ta khai thác tính đối xứng:
t! % Duplicate and transpose
XR % Keep the upper triangular part without the diagonal
+ % Add element-wise
Bước 2
Bây giờ ngăn xếp chứa ma trận 8 × 8 kết quả từ bước 1. Để mở rộng ma trận này, chúng tôi sử dụng lập chỉ mục, lần này theo hai chiều.
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
Bước 3
Bây giờ ngăn xếp chứa ma trận 15 × 15 từ bước 2.
'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
và không*
đại diện cho ngôi sao? : o