f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
Provalo online!
Il cambiamento qui si basa sullo spostamento tra i numeri da trovare. I due turni che iniziano da 0 sono n-1
e n+1
, quindi n=5
, se i numeri per n-1
sarebbero 0,4,8,12,16,20
e per n+1
sarebbero 0,6,12,18,24
. Combinando questi e dando 1-indicizzazione (invece di 0-indicizzazione) si ottiene 1,5,7,9,13,17,19,21,25
. L'offset da n
viene ottenuto mediante negazione bit a bit (operazione di complemento bit a bit), dove ~-n==n-1
e-~n==n+1
.
Vecchia versione
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}]";}
Provalo online!
Questo approccio utilizza gli indici di colonna e riga per determinare se i numeri si trovano sulle diagonali. i/n
fornisce l'indice di riga e i%n
fornisce l'indice di colonna.
Restituzione solo della matrice numerica
Se si ritiene che la costruzione della sola serie numerica contenga ai fini del costo in byte, è possibile eseguire le seguenti operazioni, in base al suggerimento di Dennis.Verweij (using System.Linq;
aggiunge altri 18 byte):
C # (.NET Core) , 66 + 18 = 84 byte
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
Provalo online!