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
ตอนนี้เราจำเป็นต้องกรอกข้อมูลที่ไม่ใช่ศูนย์แนวทแยง เราจะเติมที่อยู่ใต้เส้นทแยงมุมจากนั้นใช้สมมาตรเพื่อเติมเต็มส่วนอื่น ๆ
ในการเติมแต่ละค่าเราใช้การจัดทำดัชนีเชิงเส้น (ดูคำตอบนี้ความยาว -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
สแต็กตอนนี้มีเมทริกซ์ 8 × 8 ซึ่งเป็นผลมาจากขั้นตอนที่ 1 ในการขยายเมทริกซ์นี้เราใช้การจัดทำดัชนีคราวนี้เป็นสองมิติ
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
สแต็กตอนนี้มีเมทริกซ์ 15 × 15 ที่เกิดจากขั้นตอนที่ 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
และไม่*
เป็นตัวแทนของดาว? : o