f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Essayez-le en ligne!
Le changement ici est basé sur le décalage entre les nombres à rechercher. Les deux quarts de travail à partir de 0 sont n-1
et n+1
, donc si n=5
, les chiffres pour n-1
serait 0,4,8,12,16,20
et pour n+1
seraient 0,6,12,18,24
. La combinaison de ces éléments et l'indexation 1 (au lieu de l'indexation 0) donne 1,5,7,9,13,17,19,21,25
. Le décalage par rapport à n
est obtenu en utilisant la négation au niveau du bit (opération de complément au niveau du bit), où ~-n==n-1
et-~n==n+1
.
Ancienne 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}]";}
Essayez-le en ligne!
Cette approche utilise les indices de colonne et de ligne pour déterminer si les nombres sont sur les diagonales. i/n
donne l'index de ligne et i%n
l'index de colonne.
Retourner uniquement le tableau de nombres
Si la construction uniquement du tableau de nombres est réputée compter pour le coût en octets, alors ce qui suit pourrait être fait, sur la base de la suggestion de Dennis.Verweij ( using System.Linq;
ajoute 18 octets supplémentaires):
C # (.NET Core) , 66 + 18 = 84 octets
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Essayez-le en ligne!