MATL , 15 Bytes
X>ttq*QwoEqGd*+
Probieren Sie es online!
Sammle und drucke als Matrix
Wie?
Edit: Gleiche Technik wie @ Doorknobs Antwort, nur anders angekommen.
Der Unterschied zwischen den diagonalen Elementen der Spirale ist die arithmetische Folge . Die Summe von n Termen davon ist n ( n - 1 ) (durch die übliche AP-Formel). Diese um 1 erhöhte Summe ergibt das Diagonalelement an der Position ( 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
Alternative 21-Byte-Lösung:
Pdt|Gs+ttqq*4/QJb^b*+
Probieren Sie es online!
Sammeln und Drucken als Matrix
Aus dem oben Gesagten wissen wir, dass die gewünschte Funktion ist
f= m ∗ ( m - 1 ) + 1 + ( - 1 )m∗ ( x - y)
m = m a x ( x , y)
Einige grundlegende Berechnungen zeigen, dass ein Ausdruck für maximal zwei Zahlen ist
m = m a x ( x , y) = x + y+ a b s ( x - y)2
f
f= ( x - y) ⋅ ik+ 14( ( k - 2 ) ≤ k ) + 1
k = a b s ( x - y) + x + y
Dies ist die Funktion, die die Lösung implementiert.