f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Спробуйте в Інтернеті!
Зміна тут ґрунтується на зрушенні між числами для пошуку. Дві зміни, що починаються з 0, є, n-1
і n+1
, якщо б n=5
, числа для n-1
були б 0,4,8,12,16,20
і n+1
були 0,6,12,18,24
. Поєднання цих даних та надання 1-індексації (замість 0-індексації) дає 1,5,7,9,13,17,19,21,25
. Зсув від n
досягається за допомогою бітового заперечення (побітової операції доповнення), де ~-n==n-1
і-~n==n+1
.
Стара версія
f=>{var s="[";for(int i=0;i<n*n-1;i++)s+=(i/n!=i%n&&n-1-i/n!=i%n?"":i+1+",");return s+$"{n*n}]";}
Спробуйте в Інтернеті!
Цей підхід використовує індекси стовпців та рядків для визначення, чи є числа на діагоналях. i/n
дає індекс рядка таi%n
дає індекс стовпців.
Повернення лише масив чисел
Якщо побудова лише масиву чисел вважається таким, що зараховується до вартості байтів, тоді можна зробити наступне, виходячи із пропозиції Dennis.Verweij ( using System.Linq;
додає додаткові 18 байт):
C # (.NET Core) , 66 + 18 = 84 байти
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Спробуйте в Інтернеті!