MATL , 59 54 52 octets
4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)
Essayez-le en ligne!
Explication
Le code suit trois étapes principales:
Générez la matrice 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
Étendez-le à la matrice 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
Indexez la chaîne 'DtdTX.'
avec cette matrice pour produire le résultat souhaité.
Étape 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
Maintenant, nous devons remplir les entrées hors diagonales non nulles. Nous ne remplirons que ceux en dessous de la diagonale, puis utiliserons la symétrie pour remplir les autres.
Pour remplir chaque valeur, nous utilisons une indexation linéaire (voir cette réponse , extrait de longueur 12). Cela signifie accéder à la matrice comme si elle n'avait qu'une seule dimension. Pour une matrice 8 × 8, chaque valeur de l'indice linéaire fait référence à une entrée comme suit:
1 9 57
2 10 58
3 11
4
5 ... ...
6
7 63
8 16 ... ... 64
Ainsi, ce qui suit affecte la valeur 4 à l'entrée en bas à gauche:
K % Push 4
8 % Push 8
( % Assign 4 to the entry with linear index 8
Le code de la valeur 3 est similaire. Dans ce cas, l'index est un vecteur, car nous devons remplir plusieurs entrées:
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
Et pour 2:
H % Push 2
14 % Push 14
( % Assign 2 to that entry
Nous avons maintenant la matrice
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
Pour remplir la moitié supérieure, nous exploitons la symétrie:
t! % Duplicate and transpose
XR % Keep the upper triangular part without the diagonal
+ % Add element-wise
Étape 2
La pile contient maintenant la matrice 8 × 8 issue de l'étape 1. Pour étendre cette matrice, nous utilisons l'indexation, cette fois dans les deux dimensions.
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
Étape 3
La pile contient désormais la matrice 15 × 15 issue de l'étape 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
et ne*
pas représenter l'étoile? : o