МАТЛ, 30 28 27 байт
n=input()
R,J=range,''.join;r=[]
for i in R(n+1):
S=sum(R(i));c='AxBo'[i%2::2]
for j in R(S):r[~j]+=c[j/i%2]*i
r+=[J(c[-j/i%2]for j in R(S+i,0,-1))]*i
for l in r:print J(l)
Попробуйте онлайн!
Бонусные возможности:
Для 26 байт, следующая модифицированная версия создает графический вывод:
function(n){l=w=sum(1:n)
m=matrix(,l,l)
for(i in n:1){m[l:1,l:1]=outer(x<-(1:l-1)%/%i,x,`+`)+i
l=l-i}
write(m%%4,"",w,,"")}
Попробуйте это в МАТЛ Онлайн!
Изображение просит немного цвет, и он занимает всего 7 байт:
c(x,y,n) = c(x-n,y-n,n-1) if x >= n and y >= n
= (x div n + y div n + n) mod 3 otherwise
Попробуйте это в МАТЛ Онлайн!
Или используйте более длинную версию (37 байт), чтобы увидеть, как устроена матрица символов. постепенно строился:
000111
000111
000111
111220
111220
111001
Попробуйте это в МАТЛ Онлайн!
Примеры результатов
Для ввода f(n,m,i,x,y,k){for(m=n*-~n/2,i=m*m;i--;printf("\n%d"+!!(~i%m),(x/k+y/k+k)%3))for(x=i%m,y=i/m,k=n;x>=k&y>=k;x-=k--)y-=k;}
, the following shows the basic version, graphical output, and colour graphical output.
Объяснение
Общая процедура
Числовая матрица строится от внешнего слоя к внутреннему. l
steps, where F⮌…·¹N«≔÷×ι⁺¹ι²θF⁺¹÷鲫F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ
F « Loop over
…·¹ Inclusive range from 1 to
N Input as a number
⮌ Reversed
ι⁺¹ Add 1 to current index
× ι Multiply by current index
÷ ² Divide by 2
≔ θ Assign to q
F « Loop over
Implicit range from 0 to
÷ι² Half the current index
⁺¹ Plus 1
F « Loop over
#+@ Literal string
§ Circularly indexed by
⁺ικ Sum of outer and inner index
×ικ Multiply outer and inner index
⁻θ Subtract from q
UO θλ Draw an oblong (q-ik, q) using that character
UOθ⁻θ×ικλ Draw an oblong (q, q-ik) using that character
это вход. Каждый шаг перезаписывает внутреннюю (верхнюю левую) часть предыдущей матрицы. В конце цифры в полученной матрице заменяются символами.
Пример
Для ввода F⮌…·¹N«≔⊘×ι⊕ιθF⊕⊘ι«F§#+@⁺ικ«UO⁻θ×ικθλUOθ⁻θ×ικλ
the first matrix is
g=lambda y:y>1and[l+y*f(y,i)for i,l in enumerate(g(y-1))]+y*[''.join(f(y,i)for i in range(y*-~y/2))]or['#']
f=lambda y,i:'0@+#'[(y*~-y/2%y+i)/y%2+y%2*2]
На втором этапе матрица
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
перезаписывается в верхнюю половину последнего. Затем то же самое делается с
k=N
и, наконец, с
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=4
Наконец, k
is added to each entry and the resulting numbers are interpreted as codepoints and converted to characters (thus starting at 1 1 1 2 2 2
, соответствующий k
).
Построение промежуточных матриц
Для ввода k=3
, consider decreasing values of 1 1 1 1 2 2 2 2 3 3
от k
к k=4
. Для каждого k
, a vector of integers from k*(k+1)
to 1
is generated, and then each entry is divided by k
и округлил в большую сторону. В качестве примера для 1
this gives (all blocks have size N
кроме последнего):
k
тогда как для N
the result would be (all blocks have size !
):
33
Этот вектор добавляется поэлементно с помощью трансляции к своей транспонированной копии; а потом 30
is added to each entry. For 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
это дает
3
Это одна из промежуточных матриц, показанных выше, за исключением того, что она перевернута по горизонтали и вертикали. Итак, все, что остается, это перевернуть эту матрицу и записать ее в верхний левый угол «накопленной» матрицы, инициализируя ее первой пустой матрицей ( 6 5 5
5 4 4
5 4 4
) step.
Код
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
||answer||
Питон 2, 187 178 164 162 152 байт
-8 байт благодаря Mr.Xcoder
-1 байт благодаря Стивену
-10 байт благодаря Джонатану Фречу
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
Попробуйте онлайн!