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
додається до кожного запису, а отримані цифри інтерпретуються як кодові точки та перетворюються в символи (таким чином, починаючи з 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