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-1
und n+1
, wenn also n=5
, die Zahlen für n-1
wären 0,4,8,12,16,20
und für n+1
wä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 n
wird durch bitweise Negation (bitweise Komplementoperation) erreicht, wobei ~-n==n-1
und-~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/n
gibt 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!