MATL , 15 bajtów
X>ttq*QwoEqGd*+
Wypróbuj online!
Zbierz i wydrukuj jako matrycę
W jaki sposób?
Edycja: Ta sama technika, co odpowiedź @ Doorknob, po prostu przyszła inaczej.
Różnica między diagonalnymi elementami spirali to ciąg arytmetyczny . Suma n wyrażeń tego wynosi n ( n - 1 ) (zgodnie ze zwykłą formułą AP). Ta suma, zwiększona o 1, daje element diagonalny w pozycji ( n , n ) .0 , 2 , 4 , 6 , 8 , …nn ( n - 1 )( n , n )
( x , y)v = n ( n - 1 ) + 1( x , y)v + x - yv - x + y
X> % Get the maximum of the input coordinates, say n
ttq* % Duplicate that and multiply by n-1
Q % Add 1 to that. This is the diagonal value v at layer n
wo % Bring the original n on top and check if it's odd (1 or 0)
Eq % Change 1 or 0 to 1 or -1
Gd % Push input (x, y) again, get y - x
* % Multiply by 1 or -1
% For odd layers, no change. For even layers, y-x becomes x-y
+ % Add that to the diagonal value v
% Implicit output
Alternatywne 21 bajtowe rozwiązanie:
Pdt|Gs+ttqq*4/QJb^b*+
Wypróbuj online!
Zbieraj i drukuj jako matrycę
Z powyższego wiemy, że potrzebujemy funkcji
fa= m ∗ ( m - 1 ) + 1 + ( - 1 )m∗ ( x - y)
m = m a x ( x , y)
Niektóre podstawowe obliczenia pokażą, że jest jedno wyrażenie dla maksymalnie dwóch liczb
m = m a x ( x , y) = x + y+ a b s ( x - y)2)
fa
fa= ( x - y) ⋅ ik+ 14( ( k - 2 ) ⋅ k ) + 1
k = a b s ( x - y) + x + y
Jest to funkcja implementowana przez rozwiązanie.