f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Pruébalo en línea!
El cambio aquí se basa en el cambio entre números para encontrar. Los dos turnos que comienzan en 0 son n-1
y n+1
, por lo tanto n=5
, si , los números para n-1
sería 0,4,8,12,16,20
y para n+1
sería 0,6,12,18,24
. Combinando estos y dando 1-indexación (en lugar de 0-indexación) da 1,5,7,9,13,17,19,21,25
. El desplazamiento desde n
se logra utilizando la negación bit a bit (operación de complemento bit a bit), donde ~-n==n-1
y -~n==n+1
.
Versión antigua
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}]";}
Pruébalo en línea!
Este enfoque utiliza los índices de columna y fila para determinar si los números están en las diagonales. i/n
da el índice de la fila y i%n
da el índice de la columna.
Devolviendo solo la matriz de números
Si se considera que construir solo la matriz de números cuenta para el costo de bytes, entonces se podría hacer lo siguiente, según la sugerencia de Dennis.Verweij ( using System.Linq;
agrega 18 bytes adicionales):
C # (.NET Core) , 66 + 18 = 84 bytes
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Pruébalo en línea!