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()
Попробуйте онлайн!