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-1
dan n+1
, jadi jika n=5
, angka untuk n-1
akan 0,4,8,12,16,20
dan untuk n+1
akan 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 n
dicapai 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/n
memberikan indeks baris, dan i%n
memberikan 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!