N×N板上的骑士图


20

在国际象棋中,骑士只能相对于其当前位置(♞标记)移动到标记为X的位置:

骑士可以移动的地方


一个骑士的图形是表示在棋盘的骑士棋子的所有法律动作的图表。此图的每个顶点代表棋盘的一个正方形,每个边都连接两个正方形,这两个正方形彼此分开。

对于标准的8 x 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
这实际上只是边缘情况!:)
乔纳森·艾伦

Answers:


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卷积,将每个位置的合法骑士移动目标的1s相加

结果矩阵隐式显示。


您可以将卷积矩阵编码为,11043370BP5e但这并不是更短的……
Giuseppe


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=[0,2,3,4,4,0,6,0,6]

其中表示未使用的插槽。0

我们将每个像元为:(x,y)

{T(ix,y)if ix,y88otherwise

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)

单链链接产生一个平面列表-使用KSab在他们的Python答案中首先使用的想法-骑士的举动具有“边” 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⍴⎕ N×N矩阵的索引-长度为2的向量的矩阵

∘.-⍨ 互相减去每对索引,得到一个N×N×N×N数组

| 绝对值

×/¨ 每个产品

2=2s在哪里?返回布尔(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。所以我很高兴N只能转到8 =)

⟦₅⟨∋≡∋⟩ᶠ;?z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • 切换到KSab的公式为-25个字节
  • 归功于sundar,将数组展平了-7个字节

在线尝试!


Brachylog44 36字节

此数字也适用于大于9的数字

gP&⟦₅⟨∋≡∋⟩ᶠ;z{{hQ&t⟦₅↰₁;Qz-ᵐ×ȧ2}ᶜ}ᵐ
  • 借助sundar使数组变平,从而获得-8个字节

在线尝试!


1
您也可以使用⟨∋≡∋⟩早期生成矩阵坐标,并总共节省7个字节(输出是一个平面列表,OP允许):在线尝试!
sundar-恢复莫妮卡

2

视网膜,161字节

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

在线尝试!链接包括测试用例。说明:

.+
*

转换为一元。

L$`_
$=

为值中的每个值列出一次_值,即创建一个正方形。

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

_正则表达式的中间开始,尝试匹配足够的上下文,以确定八位骑士的动作是否可行。如果匹配成功,则每个模式都捕获一个字符。我尝试使用命名组,以便捕获数量直接等于所需的结果,但是花费15个字节。

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

连接所有成功的捕获并花费时间。


2

Wolfram语言(Mathematica),34个字节

内置了另一个Mathematica。

VertexDegree@KnightTourGraph[#,#]&

返回扁平化列表。

在线尝试!


我实际上是用这个答案在挑战下发表评论的(尽管语法不正确,因为我不了解WL)。稍后我删除了它,因为我认为其他人可能希望将其发布为真实答案。
Stewie Griffin


1

C(gcc)133125字节

该解决方案应适用于任何尺寸的电路板。

#define T(x,y)(x<3?x:2)*(y<3?y:2)/2+
a,b;f(i){for(a=i--;a--;)for(b=i+1;b--;)printf("%i ",T(a,b)T(i-a,b)T(a,i-b)T(i-a,i-b)0);}

在线尝试!


@ceilingcat当然,谢谢!但我看不出第二个建议会发生什么变化
Curtis Bechtel
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.