MATL , 30 28 27 byte
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Hãy thử trực tuyến!
Tính năng thưởng:
Dành cho 26 byte , phiên bản sửa đổi sau đây tạo đầu ra đồ họa :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Hãy thử nó tại MATL Online!
Hình ảnh đang cầu xin một số màu và nó chỉ tốn 7 byte:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Hãy thử nó tại MATL Online!
Hoặc sử dụng phiên bản dài hơn (37 byte) để xem ma trận ký tự là như thế nào xây dựng dần dần :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Hãy thử nó tại MATL Online!
Ví dụ đầu ra
Đối với đầu vào là 8
, sau đây cho thấy phiên bản cơ bản, đầu ra đồ họa và đầu ra đồ họa màu.
Giải trình
Thủ tục chung
Một ma trận số được xây dựng từ các lớp bên ngoài đến bên trong N
theo các bước, trong đó N
là đầu vào. Mỗi bước ghi đè lên một phần bên trong (phía trên bên trái) của ma trận trước đó. Cuối cùng, các số trong ma trận thu được được thay đổi thành ký tự.
Thí dụ
Đối với đầu vào 4
ma trận đầu tiên là
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
Bước thứ hai, ma trận
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
được ghi đè lên nửa trên của cái sau. Sau đó, tương tự được thực hiện với
6 5 5
5 4 4
5 4 4
và cuối cùng với
3
Ma trận kết quả là
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
Cuối cùng, 30
được thêm vào mỗi mục và các số kết quả được hiểu là các điểm mã và được chuyển đổi thành các ký tự (do đó bắt đầu từ 33
, tương ứng với !
).
Xây dựng các ma trận trung gian
Đối với đầu vào N
, xem xét giảm giá trị k
từ N
đến 1
. Đối với mỗi k
, một vectơ số nguyên từ 1
đến k*(k+1)
được tạo ra, và sau đó mỗi mục được chia cho k
và làm tròn lên. Ví dụ, đối với k=4
điều này mang lại (tất cả các khối có kích thước k
ngoại trừ cuối cùng):
1 1 1 1 2 2 2 2 3 3
trong khi đó đối k=3
với kết quả sẽ là (tất cả các khối có kích thước k
):
1 1 1 2 2 2
Vectơ này được thêm vào, yếu tố khôn ngoan với phát sóng, vào một bản sao được chuyển đổi của chính nó; và sau đó k
được thêm vào mỗi mục. Đối với k=4
điều này cho
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
Đây là một trong những ma trận trung gian được hiển thị ở trên, ngoại trừ việc nó được lật theo chiều ngang và chiều dọc. Vì vậy, tất cả những gì còn lại là lật ma trận này và viết nó vào góc trên bên trái của ma trận "tích lũy" cho đến nay, được khởi tạo thành một ma trận trống cho bước đầu tiên ( k=N
).
Mã
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