f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Çevrimiçi deneyin!
Buradaki değişiklik, bulunacak sayılar arasındaki geçişe dayanmaktadır. 0'dan başlayarak iki vardiya vardır n-1
ve n+1
eğer öyleyse, n=5
için numaralar n-1
olacağını 0,4,8,12,16,20
ve için n+1
olurdu 0,6,12,18,24
. Bunları birleştirip 1-indeksleme (0-indeksleme yerine) verir 1,5,7,9,13,17,19,21,25
. Uzaklık, n
bitsel negatifleme (bitsel tamamlayıcı işlemi) kullanılarak elde edilir, burada ~-n==n-1
ve-~n==n+1
.
Eski versiyon
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}]";}
Çevrimiçi deneyin!
Bu yaklaşım, sayıların köşegenler üzerinde olup olmadığını belirlemek için sütun ve satır indekslerini kullanır. i/n
satır dizinini verir vei%n
sütun dizinini verir.
Yalnızca Sayı Dizisini Döndürme
Yalnızca sayı dizisini oluşturmanın bayt maliyetine sayıldığı kabul edilirse, Dennis.Verweij'in önerisine dayanarak aşağıdakiler yapılabilir ( using System.Linq;
fazladan 18 bayt ekler):
C # (.NET Core) , 66 + 18 = 84 bayt
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Çevrimiçi deneyin!