MATL , 15 octets
X>ttq*QwoEqGd*+
Essayez-le en ligne!
Recueillir et imprimer sous forme de matrice
Comment?
Edit: Même technique que la réponse de @ Doorknob, vient d'arriver différemment.
La différence entre les éléments diagonaux de la spirale est la séquence arithmétique . La somme de n termes de ceci est n ( n - 1 ) (par la formule AP habituelle). Cette somme, incrémentée de 1, donne l'élément diagonal en position ( n , n ) .0 , 2 , 4 , 6 , 8 , …nn ( n - 1 )( n , n )
Étant donné , nous trouvons le maximum de ces deux, qui est la "couche" de la spirale à laquelle ce point appartient. Ensuite, nous trouvons la valeur diagonale de cette couche comme v = n ( n - 1 ) + 1 . Pour les couches paires, la valeur en ( x , y ) est alors v + x - y , pour les couches impaires v - x + y .( 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
Solution alternative de 21 octets:
Pdt|Gs+ttqq*4/QJb^b*+
Essayez-le en ligne!
Recueillir et imprimer sous forme de matrice
D'après ce qui précède, nous savons que la fonction que nous voulons est
F= m ∗ ( m - 1 ) + 1 + ( - 1 )m∗ ( x - y)
m = m a x ( x , y)
Un calcul de base montrera qu'une expression pour un maximum de deux nombres est
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
C'est la fonction que la solution implémente.