f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Probieren Sie es online!
Die Änderung hier basiert auf der Verschiebung zwischen den zu findenden Zahlen. Die zwei Schichten, die bei 0 beginnen, sind n-1und n+1, wenn also n=5, die Zahlen für n-1wären 0,4,8,12,16,20und für n+1wären 0,6,12,18,24. Wenn Sie diese kombinieren und 1-Indizierung (anstelle von 0-Indizierung) geben, erhalten Sie 1,5,7,9,13,17,19,21,25. Der Offset von nwird durch bitweise Negation (bitweise Komplementoperation) erreicht, wobei ~-n==n-1und-~n==n+1 .
Alte Version
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}]";}
Probieren Sie es online!
Bei diesem Ansatz werden die Spalten- und Zeilenindizes verwendet, um zu bestimmen, ob sich die Zahlen auf den Diagonalen befinden. i/ngibt den Zeilenindex an undi%n den Spaltenindex an.
Nur das Zahlenarray zurückgeben
Wenn davon ausgegangen wird, dass die Erstellung nur des Zahlenfelds zu den Bytekosten beiträgt, könnte auf der Grundlage des Vorschlags von Dennis.Verweij (using System.Linq; zusätzliche 18 Byte) :
C # (.NET Core) , 66 + 18 = 84 Byte
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Probieren Sie es online!