MATL , 30 28 27 ไบต์
t:P"@:s:@/Xk&+@+8MPt&(]30+c
ลองออนไลน์!
คุณสมบัติโบนัส:
สำหรับ26 ไบต์เวอร์ชันที่แก้ไขต่อไปนี้จะสร้างเอาต์พุตกราฟิก :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
ลองที่MATL Online!
รูปภาพกำลังขอทานสำหรับบางสีและมีราคาเพียง 7 ไบต์:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
ลองที่MATL Online!
หรือใช้เวอร์ชันที่ยาวกว่า (37 ไบต์) เพื่อดูว่าตัวอักขระเมทริกซ์นั้นถูกสร้างขึ้นอย่างค่อยเป็นค่อยไป :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
ลองที่MATL Online!
ตัวอย่างผลลัพธ์
สำหรับอินพุตคือ8
สิ่งต่อไปนี้แสดงเวอร์ชันพื้นฐานเอาต์พุตกราฟิกและเอาต์พุตกราฟิกสี
คำอธิบาย
ขั้นตอนทั่วไป
เมทริกซ์ตัวเลขถูกสร้างจากเลเยอร์ด้านนอกไปยังเลเยอร์ด้านในเป็นN
ขั้นตอนโดยที่N
อินพุต แต่ละขั้นตอนจะเขียนทับส่วนด้านใน (ซ้ายบน) ของเมทริกซ์ก่อนหน้า ในตอนท้ายตัวเลขในเมทริกซ์ที่ได้จะถูกเปลี่ยนเป็นอักขระ
ตัวอย่าง
สำหรับอินพุต4
เมทริกซ์แรกคือ
10 10 9 9 9 9 8 8 8 8
10 10 9 9 9 9 8 8 8 8
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
9 9 8 8 8 8 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
ในฐานะที่เป็นขั้นตอนที่สองเมทริกซ์
7 7 7 6 6 6
7 7 7 6 6 6
7 7 7 6 6 6
6 6 6 5 5 5
6 6 6 5 5 5
6 6 6 5 5 5
ถูกเขียนทับลงในครึ่งบนของหลัง จากนั้นก็ทำแบบเดียวกันกับ
6 5 5
5 4 4
5 4 4
และสุดท้ายด้วย
3
เมทริกซ์ที่ได้คือ
3 5 5 6 6 6 8 8 8 8
5 4 4 6 6 6 8 8 8 8
5 4 4 6 6 6 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
6 6 6 5 5 5 7 7 7 7
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
8 8 7 7 7 7 6 6 6 6
สุดท้าย30
จะถูกเพิ่มเข้าไปในแต่ละรายการและตัวเลขที่ได้จะถูกแปลเป็น codepoints และแปลงเป็นอักขระ (เช่นเริ่มต้นที่33
ตรงกับ!
)
การสร้างเมทริกซ์ระดับกลาง
สำหรับการป้อนข้อมูลN
ให้พิจารณาการลดค่าของk
จากไปN
1
สำหรับแต่ละk
เวกเตอร์ของจำนวนเต็มจาก1
ถึงk*(k+1)
ถูกสร้างขึ้นจากนั้นแต่ละรายการจะถูกหารด้วยk
และปัดเศษขึ้น เป็นตัวอย่างสำหรับk=4
สิ่งนี้ (บล็อกทั้งหมดมีขนาดk
ยกเว้นอันสุดท้าย):
1 1 1 1 2 2 2 2 3 3
ในขณะk=3
ที่ผลลัพธ์จะเป็น (บล็อกทั้งหมดมีขนาดk
):
1 1 1 2 2 2
เวกเตอร์นี้ถูกเพิ่มองค์ประกอบที่ชาญฉลาดพร้อมการออกอากาศไปยังสำเนาที่ถูกย้ายของตัวเอง จากนั้นk
จะถูกเพิ่มในแต่ละรายการ สำหรับk=4
สิ่งนี้จะช่วยให้
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
6 6 6 6 7 7 7 7 8 8
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
7 7 7 7 8 8 8 8 9 9
8 8 8 8 9 9 9 9 10 10
8 8 8 8 9 9 9 9 10 10
นี่เป็นหนึ่งในเมทริกซ์กลางที่แสดงด้านบนยกเว้นว่ามันจะพลิกในแนวนอนและแนวตั้ง ดังนั้นสิ่งที่เหลืออยู่ก็คือการพลิกเมทริกซ์นี้และเขียนลงในมุมบนซ้ายของเมทริกซ์ "สะสม" จนถึงเริ่มต้นให้เป็นเมทริกซ์ที่ว่างเปล่าสำหรับk=N
ขั้นตอนแรก ( )
รหัส
t % Implicitly input N. Duplicate. The first copy of N serves as the
% initial state of the "accumulated" matrix (size 1×1). This will be
% extended to size N*(N+1)/2 × N*(N+1)/2 in the first iteration
:P % Range and flip: generates vector [N, N-1, ..., 1]
" % For each k in that vector
@: % Push vector [1, 2, ..., k]
s % Sum of this vector. This gives 1+2+···+k = k*(k+1)/2
: % Range: gives vector [1, 2, ..., k*(k+1)/2]
@/ % Divide each entry by k
Xk % Round up
&+ % Add vector to itself transposed, element-wise with broadcast. Gives
% a square matrix of size k*(k+1)/2 × k*(k+1)/2
@+ % Add k to each entry of the this matrix. This is the flipped
% intermediate matrix
8M % Push vector [1, 2, ..., k*(k+1)/2] again
Pt % Flip and duplicate. The two resulting, equal vectors are the row and
% column indices where the generated matrix will be written. Note that
% flipping the indices has the same effect as flipping the matrix
% horizontally and vertically (but it's shorter)
&( % Write the (flipped) intermediate matrix into the upper-left
% corner of the accumulated matrix, as given by the two (flipped)
% index vectors
] % End
30+ % Add 30 to each entry of the final accumulated matrix
c % Convert to char. Implicitly display