MATL、30 28 27バイト
t:P"@:s:@/Xk&+@+8MPt&(]30+c
オンラインでお試しください!
ボーナス機能:
以下のために26のバイト、次の修正版を生成するグラフィカル出力:
t:P"@:s:@/Xk&+@+8MPt&(]1YG
MATL Onlineでお試しください!
画像はある色のために物ggingいをしており、わずか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
2番目のステップとして、行列
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
fromの値を減らすことを検討し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
これは、上記の中間行列の1つですが、水平および垂直に反転される点が異なります。したがって、残っているのは、この行列を反転し、「累積」行列の左上隅に書き込むこと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