MATL , 15 байт
X>ttq*QwoEqGd*+
Спробуйте в Інтернеті!
Збирайте та друкуйте як матрицю
Як?
Редагувати: та сама техніка, що і у відповіді @ Doorknob.
Різниця між діагональними елементами спіралі - це арифметична послідовність . Сума доданків цього дорівнює (за звичайною формулою AP). Ця сума, збільшена на 1, дає діагональний елемент у положенні .n n ( n - 1 ) ( n , n )0,2,4,6,8,…nn(n−1)(n,n)
Враховуючи , ми знаходимо максимум цих двох, який є «шаром» спіралі, до якого належить ця точка. Тоді ми знаходимо діагональне значення цього шару як . Для парних шарів значенням є , для непарних шарів .v = n ( n - 1 ) + 1 ( x , y ) v + x - y 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
Черговий 21-байтний розчин:
Pdt|Gs+ttqq*4/QJb^b*+
Спробуйте в Інтернеті!
Збирати та друкувати як матрицю
Із вищесказаного ми знаємо, що потрібна функція
f=m∗(m−1)+1+(−1)m∗(x−y)
де .m=max(x,y)
Деякі основні розрахунки покажуть, що один вираз для максимум двох чисел є
m=max(x,y)=x+y+abs(x−y)2
Підключивши одну до іншої, ми виявимо, що одна альтернативна форма для - це:f
f=(x−y)⋅ik+14((k−2)⋅k)+1
де .k=abs(x−y)+x+y
Це функція, яку реалізує рішення.