MATL,30 28 27字节
t:P"@:s:@/Xk&+@+8MPt&(]30+c
在线尝试!
奖励功能:
对于26个字节,以下修改后的版本将产生图形输出:
t:P"@:s:@/Xk&+@+8MPt&(]1YG
在MATL在线上尝试一下!
该图像乞求某种颜色,它仅花费7个字节:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
在MATL在线上尝试一下!
或使用更长的版本(37字节)来查看字符矩阵是如何逐步构建的:
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
在MATL在线上尝试一下!
输出示例
输入为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
将其添加到每个条目,并将生成的数字解释为代码点并转换为字符(因此从开头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
结果将是(所有块都具有size 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