MATL , 15 bytes
X>ttq*QwoEqGd*+
Pruébalo en línea!
Recoger e imprimir como una matriz
¿Cómo?
Editar: La misma técnica que la respuesta de @ Doorknob, acaba de llegar de manera diferente.
La diferencia entre los elementos diagonales de la espiral es la secuencia aritmética . La suma de n términos de esto es n ( n - 1 ) (según la fórmula AP habitual). Esta suma, incrementada en 1, da el elemento diagonal en la posición ( n , n ) .0 , 2 , 4 , 6 , 8 , ...norten ( n - 1 )( n , n )
Dado , encontramos el máximo de estos dos, que es la "capa" de la espiral a la que pertenece este punto. Luego, encontramos el valor diagonal de esa capa como v = n ( n - 1 ) + 1 . Para las capas pares, el valor en ( x , y ) es entonces v + x - y , para las capas impares 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
Solución alternativa de 21 bytes:
Pdt|Gs+ttqq*4/QJb^b*+
Pruébalo en línea!
Recopilar e imprimir como una matriz
De lo anterior, sabemos que la función que queremos es
f=m∗(m−1)+1+(−1)m∗(x−y)
donde m=max(x,y) .
Algunos cálculos básicos mostrarán que una expresión para un máximo de dos números es
m=max(x,y)=x+y+abs(x−y)2
F
F= ( x - y) ⋅ ik+ 14 4( ( k - 2 ) ⋅ k ) + 1
k = a b s ( x - y) + x + y
Esta es la función que implementa la solución.