MATL , 59 54 52 Bytes
4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)
Probieren Sie es online!
Erläuterung
Der Code folgt drei Hauptschritten:
Generieren Sie die 8x8-Matrix
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
Erweitern Sie es auf die 15x15-Matrix
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
Indizieren Sie die Zeichenfolge 'DtdTX.'
mit dieser Matrix, um das gewünschte Ergebnis zu erzielen.
Schritt 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
Jetzt müssen wir die nicht diagonalen Einträge ungleich Null ausfüllen. Wir werden nur die unterhalb der Diagonale füllen und dann Symmetrie verwenden, um die anderen zu füllen.
Um jeden Wert zu füllen, verwenden wir die lineare Indizierung (siehe diese Antwort , Länge-12-Snippet). Das bedeutet, auf die Matrix zuzugreifen, als ob sie nur eine Dimension hätte. Bei einer 8 × 8-Matrix bezieht sich jeder Wert des linearen Index wie folgt auf einen Eintrag:
1 9 57
2 10 58
3 11
4
5 ... ...
6
7 63
8 16 ... ... 64
Das Folgende weist also dem Eintrag unten links den Wert 4 zu:
K % Push 4
8 % Push 8
( % Assign 4 to the entry with linear index 8
Der Code für den Wert 3 ist ähnlich. In diesem Fall ist der Index ein Vektor, da wir mehrere Einträge füllen müssen:
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
Und für 2:
H % Push 2
14 % Push 14
( % Assign 2 to that entry
Wir haben jetzt die Matrix
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
Um die obere Hälfte zu füllen, nutzen wir die Symmetrie:
t! % Duplicate and transpose
XR % Keep the upper triangular part without the diagonal
+ % Add element-wise
Schritt 2
Der Stapel enthält nun die aus Schritt 1 resultierende 8 × 8-Matrix. Um diese Matrix zu erweitern, verwenden wir die Indizierung, diesmal in den beiden Dimensionen.
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
Schritt 3
Der Stapel enthält jetzt die aus Schritt 2 resultierende 15 × 15-Matrix.
'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
und nicht*
, um den Stern darzustellen? : o