f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Cobalah online!
Perubahan di sini didasarkan pada pergeseran antar angka untuk ditemukan. Dua shift mulai dari 0 adalah n-1dan n+1, jadi jika n=5, angka untuk n-1akan 0,4,8,12,16,20dan untuk n+1akan 0,6,12,18,24. Menggabungkan ini dan memberikan 1-pengindeksan (bukan pengindeksan 0) memberi 1,5,7,9,13,17,19,21,25. Offset dari ndicapai menggunakan negasi bitwise (operasi komplemen bitwise), di mana~-n==n-1 dan -~n==n+1.
Versi lama
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}]";}
Cobalah online!
Pendekatan ini menggunakan indeks kolom dan baris untuk menentukan apakah angka ada di diagonal. i/nmemberikan indeks baris, dan i%nmemberikan indeks kolom.
Hanya Mengembalikan Array Angka
Jika membangun hanya nomor array dianggap diperhitungkan terhadap biaya byte, maka berikut ini dapat dilakukan, berdasarkan saran Dennis.Verweij (using System.Linq; menambahkan 18 byte tambahan):
C # (.NET Core) , 66 + 18 = 84 byte
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Cobalah online!