f=>{var s="[";for(int i=0;i<n*n-1;)s+=i%-~n<1|i++%~-n<1?i+",":"";return s+n*n+"]";}
オンラインでお試しください!
ここでの変更は、検索する数値間のシフトに基づいています。0から始まる2つのシフトであるn-1
とn+1
そうであれば、n=5
のための番号は、n-1
あろう0,4,8,12,16,20
とするためn+1
であろう0,6,12,18,24
。これらを組み合わせて(0インデックス付けの代わりに)1インデックス付けを行うと、が得られ1,5,7,9,13,17,19,21,25
ます。以下からのオフセットn
ビット単位の否定(ビット単位の補数演算)、使用して達成される~-n==n-1
とします-~n==n+1
。
古いバージョン
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}]";}
オンラインでお試しください!
このアプローチでは、列と行のインデックスを使用して、数値が対角線上にあるかどうかを判断します。i/n
行インデックスと列インデックスをi%n
提供します。
数値配列のみを返す
数値配列のみの構築がバイトコストにカウントされると見なされる場合、Dennis.Verweijの提案に基づいて、以下を実行できます(using System.Linq;
追加の18バイトが追加されます)。
C#(.NET Core)、66 + 18 = 84バイト
x=>Enumerable.Range(1,x*x).Where(v=>~-v%~-x<1|~-v%-~x<1).ToArray()
オンラインでお試しください!