MATL , 30 28 27 bajtów
t:P"@:s:@/Xk&+@+8MPt&(]30+c
Wypróbuj online!
Dodatkowe atrybuty:
Dla 26 bajtów następująca zmodyfikowana wersja generuje wyjście graficzne :
t:P"@:s:@/Xk&+@+8MPt&(]1YG
Wypróbuj w MATL Online!
Obraz prosi o jakiś kolor i kosztuje tylko 7 bajtów:
t:P"@:s:@/Xk&+@+8MPt&(]1YG59Y02ZG
Wypróbuj w MATL Online!
Lub użyj dłuższej wersji (37 bajtów), aby zobaczyć, jak stopniowo budowana jest matryca znaków :
t:P"@:s:@/Xk&+@+8MPt&(t30+cD9&Xx]30+c
Wypróbuj w MATL Online!
Przykładowe dane wyjściowe
Dla danych wejściowych 8
poniżej pokazano wersję podstawową, wyjście graficzne i kolorowe wyjście graficzne.
Wyjaśnienie
Generalna procedura
Matryca numeryczna jest budowana od warstw zewnętrznych do wewnętrznych w N
krokach, gdzie N
jest wejście. Każdy krok zastępuje wewnętrzną (lewą górną) część poprzedniej macierzy. Na koniec liczby w uzyskanej macierzy są zamieniane na znaki.
Przykład
Dla danych wejściowych 4
pierwszą macierzą jest
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
Jako drugi krok macierz
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
jest nadpisywany w górnej połowie tego ostatniego. To samo dzieje się z
6 5 5
5 4 4
5 4 4
i wreszcie z
3
Otrzymana macierz to
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
Na koniec 30
jest dodawany do każdego wpisu, a uzyskane liczby są interpretowane jako punkty kodowe i konwertowane na znaki (zaczynając od 33
, odpowiadając !
).
Konstrukcja macierzy pośrednich
W przypadku danych wejściowych N
rozważ zmniejszenie wartości k
od N
do 1
. Dla każdego generowany jest k
wektor liczb całkowitych od 1
do k*(k+1)
, a następnie każdy wpis jest dzielony przez k
i zaokrąglany w górę. Jako przykład k=4
podajemy (wszystkie bloki mają rozmiar k
oprócz ostatniego):
1 1 1 1 2 2 2 2 3 3
natomiast dla k=3
wyniku byłoby (wszystkie bloki mają rozmiar k
):
1 1 1 2 2 2
Wektor ten jest dodawany, elementarnie z rozgłoszeniem, do transponowanej kopii samego siebie; a następnie k
jest dodawany do każdego wpisu. Do k=4
tego daje
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
Jest to jedna z pośrednich matryc pokazanych powyżej, z tym wyjątkiem, że jest odwracana poziomo i pionowo. Pozostaje tylko odwrócić tę macierz i zapisać ją w lewym górnym rogu dotychczasowej macierzy „nagromadzonej”, zainicjowanej na pustą macierz dla pierwszego ( k=N
) kroku.
Kod
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