MATL , 59 54 52 byte
4t:g2I5vXdK8(3K23h32h(H14(t!XR+8: 7:Pht3$)'DtdTX.'w)
Provalo online!
Spiegazione
Il codice segue tre passaggi principali:
Genera 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
Estendilo alla 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
Indicizza la stringa 'DtdTX.'
con quella matrice per produrre il risultato desiderato.
Passo 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
Ora dobbiamo riempire le voci fuori diagonale diverse da zero. Riempiremo solo quelli al di sotto della diagonale, quindi utilizzeremo la simmetria per riempire gli altri.
Per riempire ogni valore utilizziamo l'indicizzazione lineare (vedi questa risposta , frammento di lunghezza 12). Ciò significa accedere alla matrice come se avesse solo una dimensione. Per una matrice 8 × 8, ogni valore dell'indice lineare si riferisce a una voce come segue:
1 9 57
2 10 58
3 11
4
5 ... ...
6
7 63
8 16 ... ... 64
Quindi, il seguente assegna il valore 4 alla voce in basso a sinistra:
K % Push 4
8 % Push 8
( % Assign 4 to the entry with linear index 8
Il codice per il valore 3 è simile. In questo caso l'indice è un vettore, perché dobbiamo riempire diverse voci:
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
E per 2:
H % Push 2
14 % Push 14
( % Assign 2 to that entry
Ora abbiamo 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
Per riempire la metà superiore sfruttiamo la simmetria:
t! % Duplicate and transpose
XR % Keep the upper triangular part without the diagonal
+ % Add element-wise
Passo 2
Lo stack ora contiene la matrice 8 × 8 risultante dal passaggio 1. Per estendere questa matrice utilizziamo l'indicizzazione, questa volta nelle due dimensioni.
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
Passaggio 3
Lo stack ora contiene la matrice 15 × 15 risultante dal passaggio 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
e non*
rappresentare la stella? : o