MATL , 15 byte
X>ttq*QwoEqGd*+
Provalo online!
Colleziona e stampa come una matrice
Come?
Modifica: stessa tecnica della risposta di @ Doorknob, appena arrivata in modo diverso.
La differenza tra gli elementi diagonali della spirale è la sequenza aritmetica . La somma di n termini di questo è n ( n - 1 ) (con la solita formula AP). Questa somma, incrementata di 1, fornisce l'elemento diagonale in posizione ( n , n ) .0,2,4,6,8,…nn(n−1)(n,n)
Dato , troviamo il massimo di questi due, che è lo "strato" della spirale a cui appartiene questo punto. Quindi, troviamo il valore diagonale di quel livello come v = n ( n - 1 ) + 1 . Per i livelli pari, il valore in ( x , y ) è quindi v + x - y , per i livelli dispari 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
Soluzione alternativa a 21 byte:
Pdt|Gs+ttqq*4/QJb^b*+
Provalo online!
Raccogli e stampa come matrice
Da quanto sopra, sappiamo che la funzione che vogliamo è
f=m∗(m−1)+1+(−1)m∗(x−y)
dove .m=max(x,y)
Alcuni calcoli di base mostreranno che è un'espressione per un massimo di due numeri
m=max(x,y)=x+y+abs(x−y)2
f
f= ( x - y) ⋅ iK+ 14( ( k - 2 ) ⋅ k ) + 1
k = a b s ( x - y) + x + y
Questa è la funzione implementata dalla soluzione.