N行N列のボード上の騎士のグラフ


20

チェスでは、ナイトは、withでマークされた現在の位置に対してXでマークされた位置にのみ移動できます。

騎士が移動できる場所


A ナイトのグラフは、チェス盤の騎士チェスの駒のすべての法的動きを表したグラフです。このグラフの各頂点はチェス盤の正方形を表し、各エッジは騎士が互いに離れている2つの正方形を接続します。

標準の8行8列のボードでは、グラフは次のようになります。

ここに画像の説明を入力してください


チャレンジ:

整数所与N、ここで3≤N≤8 、出力NバイNの各位置からの可能な移動の数が示されている基板を表す行列、。以下のためにN = 8、出力は、上記グラフの各頂点の値を示す行列であろう。

出力形式は柔軟です。リストのリストまたはフラット化されたリストなども受け入れられる形式です。


テストケースの完全なセット:

--- N = 3 ---
2 2 2
2 0 2
2 2 2
--- N = 4 ---
2 3 3 2
3 4 4 3
3 4 4 3
2 3 3 2
--- N = 5 ---
2 3 4 3 2
3 4 6 4 3
4 6 8 6 4
3 4 6 4 3
2 3 4 3 2
--- N = 6 ---
2 3 4 4 3 2
3 4 6 6 4 3
4 6 8 8 6 4
4 6 8 8 6 4
3 4 6 6 4 3
2 3 4 4 3 2
--- N = 7 ---
2 3 4 4 4 3 2
3 4 6 6 6 4 3
4 6 8 8 8 6 4
4 6 8 8 8 6 4
4 6 8 8 8 6 4
3 4 6 6 6 4 3
2 3 4 4 4 3 2
--- N = 8 ---
2 3 4 4 4 4 3 2
3 4 6 6 6 6 4 3
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
4 6 8 8 8 8 6 4
3 4 6 6 6 6 4 3
2 3 4 4 4 4 3 2

これはため、各言語で最も短いソリューションが優先されます。説明が奨励されています!


1
8 * 8ボード上の正方形からのナイトの移動数を照会するための関連する課題
xnor

出力はn * n要素のフラットリストにできますか?
xnor

13
これは文字通りエッジケースです!:)
ジョナサンアラン

回答:


13

MATL17 16バイト

t&l[2K0]B2:&ZvZ+

オンラインでお試しください!

(@Luis Mendoのおかげで1バイト。)

コードの主な部分は、畳み込み用の行列作成です。K

K=(0101010001000001000101010)

(マトリックスの中心に対して、各1は有効なナイトの動きです。)

t&l-すべて1のnxn行列を作成します(nは入力)。これをMとします。

[2K0] -[2、4、0]を含む配列をスタックにプッシュします

B -すべてをバイナリに変換し、必要に応じて0でパディング

0 1 0
1 0 0
0 0 0

2:&Zv-最終的な行/列を繰り返さずに、両方の次元でそれをミラーリングします(「対称範囲のインデックス付け」)。これにより、必要な行列Kが得られます。

0 1 0 1 0
1 0 0 0 1
0 0 0 0 0
1 0 0 0 1
0 1 0 1 0

Z+-初期の行列M(conv2(M, K, 'same'))でKの2D畳み込みを実行し、各位置の正当なナイト移動ターゲットで1を合計します

結果マトリックスは暗黙的に表示されます。


畳み込み行列をエンコードすることができますが、11043370BP5eそれは短くありません
ジュゼッペ


8

JavaScript(ES6)、88バイト

文字列を返します。

n=>(g=k=>--k?[n>3?'-2344-6-6'[(h=k=>k*2<n?~k:k-n)(k%n)*h(k/n|0)]||8:k-4&&2]+g(k):2)(n*n)

オンラインでお試しください!

どうやって?

n=3

20

(222202222)

3<n8

(x,y)0x<n0y<nix,y

ix,y=min(x+1,nx)×min(y+1,ny)

n=8

1234432124688642369121296348121616128448121616128436912129632468864212344321

T

T=[023440606]

0

バツy

{Tバツyもし バツy88さもないと

JavaScript(ES7)、107バイト

実際にすべての動きを試みる単純な実装。

n=>[...10**n-1+''].map((_,y,a)=>a.map((k,x)=>~[...b=i='01344310'].map(v=>k-=!a[x-v+2]|!a[y-b[i++&7]+2])+k))

オンラインでお試しください!


6

ゼリー 23 22 14  10 バイト

²ḶdðạP€ċ2)

フラットリストを生成するモナドリンク-Pythonの回答で KSabが最初に使用したアイデアを使用します -ナイトのムーブには、「サイド」1と2、2の唯一の要因があります。

オンラインでお試しください!(フッターはプログラムの唯一のリンクを呼び出し、結果をグリッドとしてフォーマットします)

または、10バイトの場合²Ḷdðạ²§ċ5)(ナイトの動きは距離持つすべての可能な動きです5

どうやって?

²ḶdðạP€ċ2) - Link: integer, n (any non-negative) e.g. 8
²          - square n                                 64
 Ḷ         - lowered range                            [0,    1,    2,    3,    4,    5,    6,    7,    8,    9,    10,   11,   12,   13,   14,   15,   16,   17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32,   33,   34,   35,   36,   37,   38,   39,   40,   41,   42,   43,   44,   45,   46,   47,   48,   49,   50,   51,   52,   53,   54,   55,   56,   57,   58,   59,   60,   61,   62,   63]
  d        - divmod (vectorises) i.e. x->[x//n,x%n]   [[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[0,6],[0,7],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[1,6],[1,7],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[2,6],[2,7],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[3,6],[3,7],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[4,6],[4,7],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[5,6],[5,7],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5],[6,6],[6,7],[7,0],[7,1],[7,2],[7,3],[7,4],[7,5],[7,6],[7,7]]
   ð     ) - new dyadic chain for each - call that L ( & e.g. R = [1,2] representing the "2nd row, 3rd column" ...-^ )
    ạ      -   absolute difference (vectorises)       [[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[0,2],[0,1],[0,0],[0,1],[0,2],[0,3],[0,4],[0,5],[1,2],[1,1],[1,0],[1,1],[1,2],[1,3],[1,4],[1,5],[2,2],[2,1],[2,0],[2,1],[2,2],[2,3],[2,4],[2,5],[3,2],[3,1],[3,0],[3,1],[3,2],[3,3],[3,4],[3,5],[4,2],[4,1],[4,0],[4,1],[4,2],[4,3],[4,4],[4,5],[5,2],[5,1],[5,0],[5,1],[5,2],[5,3],[5,4],[5,5],[6,2],[6,1],[6,0],[6,1],[6,2],[6,3],[6,4],[6,5]]
     P€    -   product of €ach                        [2,    1,    0,    1,    2,    3,    4,    5,    0,    0,    0,    0,    0,    0,    0,    0,    2,    1,    0,    1,    2,    3,    4,    5,    4,    2,    0,    2,    4,    6,    8,    10,   6,    3,    0,    3,    6,    9,    12,   15,   8,    4,    0,    4,    8,    12,   16,   20,   10,   5,    0,    5,    10,   15,   20,   25,   12,   6,    0,    6,    12,   18,   24,   30]
       ċ2  -   count 2s                          6:    ^-...1                  ^-...2                                                                  ^-...3                  ^-...4                        ^-...5      ^-...6
           - )                                                                                                     v-...that goes here
           -   ->                                  -> [2,    3,    4,    4,    4,    4,    3,    2,    3,    4,    6,    6,    6,    6,    4,    3,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    4,    6,    8,    8,    8,    8,    6,    4,    3,    4,    6,    6,    6,    6,    4,    3,    2,    3,    4,    4,    4,    4,    3,    2]

前の22バイト

2RżN$Œp;U$+,ḟ€³R¤Ẉ¬Sðþ

完全なプログラム(による³)。

オンラインでお試しください!(フッターはプログラムの唯一のリンクを呼び出し、結果をグリッドとしてフォーマットします)

すべての動きを見つけて、計算によって間違いなく打ち負かす可能 性のあるボードに着地する動きをカウントします(「ボード上の着地」ロジックを変更することによって打ち勝つことができる)。


4

APL(Dyalog Classic)、18バイト

+/+/2=×/¨|∘.-⍨⍳2⍴⎕

オンラインでお試しください!

評価された入力N

2⍴⎕ Nの2つのコピー

⍳2⍴⎕ N×N行列のインデックス-長さ2のベクトルの行列

∘.-⍨ インデックスの各ペアを他の各ペアから減算し、N×N×N×N配列を取得します

| 絶対値

×/¨ 各製品

2=2はどこですか?ブール(0/1)行列を返します

ナイトは一方の軸で±1移動し、他方の軸で±2移動するため、これらのステップの積の絶対値は2であることに注意してください。

+/+/ 最後の次元に沿って合計2回


3

RAD51 46 39バイト

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵

オンラインでお試しください!

どうやって?

どの騎士の動きがボードに着弾するかを確認することにより、各広場の有効な騎士の動きの数をカウントします。

{+/(⍵∘+¨(⊖,⊢)(⊢,-)(⍳2)(1¯2))∊,W}¨¨W←⍳⍵⍵
 +/                                     - The number of ...
                            ∊,W         - ... in-bounds ...
        (⊖,⊢)(⊢,-)(⍳2)(1¯2)             - ... knight movements ...
   (⍵∘+¨                   )            - ... from ...
{                              }¨¨W←⍳⍵⍵ - ... each square

3

Brachylog65 40 33バイト

これは、Nが9より大きい場合に分解されます。したがって、Nが8にしか行けないことを嬉しく思います=)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • KSabの式に切り替えて-25バイト
  • スンダのおかげで配列を平坦化することで-7バイト

オンラインでお試しください!


Brachylog44 36バイト

これは9より大きい数字でも機能します

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • スンダのおかげで配列を平坦化することにより-8バイト

オンラインでお試しください!


1
あなたは使用することができます⟨∋≡∋⟩あまりにも行列座標を生成するために、早い段階で、と(出力はOPによって許可されているフラットリスト、である)全体の7つのバイトを保存:オンラインそれをお試しください!
スンダ

2

網膜、161バイト

.+
*
L$`_
$=
(?<=(¶)_+¶_+)?(?=(?<=(¶)_*¶_*)__)?(?<=(¶)__+)?(?=(?<=(¶)_*)___)?_(?=(?<=___)_*(¶))?(?=__+(¶))?(?=(?<=__)_*¶_*(¶))?(?=_+¶_+(¶))?
$.($1$2$3$4$5$6$7$8)

オンラインでお試しください!リンクにはテストケースが含まれます。説明:

.+
*

単項に変換します。

L$`_
$=

値の各値を1回リストします_。つまり、正方形を作成します。

(?<=(¶)_+¶_+)?
(?=(?<=(¶)_*¶_*)__)?
(?<=(¶)__+)?
(?=(?<=(¶)_*)___)?
_
(?=(?<=___)_*(¶))?
(?=__+(¶))?
(?=(?<=__)_*¶_*(¶))?
(?=_+¶_+(¶))?

_正規表現の途中から始めて、8人の騎士の動きが可能かどうかを判断するために十分なコンテキストを一致させてください。一致が成功した場合、各パターンは単一の文字をキャプチャします。キャプチャの数が目的の結果に直接等しくなるように名前付きグループを使用してみましたが、15バイトかかりました。

$.($1$2$3$4$5$6$7$8)

成功したすべてのキャプチャを連結し、長さをとります。


2

Wolfram言語(Mathematica)、34バイト

さらに別のMathematicaが組み込まれています。

VertexDegree@KnightTourGraph[#,#]&

フラット化されたリストを返します。

オンラインでお試しください!


私は実際にこの答えでチャレンジの下でコメントをしました(WLを知らないので正しい構文ではありませんが)。他の誰かが本当の答えとして投稿したいと思ったので、少し後に削除しました。
スティーヴィーグリフィン


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.