f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Experimente online!
A alteração aqui é baseada no deslocamento entre os números a serem encontrados. Os dois turnos que começam em 0 são n-1
e n+1
, portanto n=5
, se os números para n-1
seriam 0,4,8,12,16,20
e para n+1
seriam 0,6,12,18,24
. Combiná-los e fornecer indexação 1 (em vez de indexação 0) fornece 1,5,7,9,13,17,19,21,25
. O deslocamento de n
é obtido usando negação bit a bit (operação de complemento bit a bit), onde ~-n==n-1
e -~n==n+1
.
Versão antiga
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}]";}
Experimente online!
Essa abordagem usa os índices de coluna e linha para determinar se os números estão nas diagonais. i/n
fornece o índice da linha e i%n
o índice da coluna.
Retornando apenas a matriz numérica
Se a construção de apenas a matriz numérica for considerada como contando para o custo de bytes, o seguinte poderá ser feito, com base na sugestão de Dennis.Verweij ( using System.Linq;
adiciona 18 bytes extras):
C # (.NET Core) , 66 + 18 = 84 bytes
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Experimente online!