首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >零碎的对峙

零碎的对峙
EN

Code Golf用户
提问于 2022-10-18 19:56:23
回答 4查看 1.4K关注 0票数 21

这个挑战需要少量关于国际象棋的知识。如果你不熟悉国际象棋或想要复习,你可以在下面找到所需细节的描述。

对于一个只由皇后组成的棋盘配置,我们可以说每个皇后的威胁数是它威胁的其他皇后的数量。

下面是一个标有每个皇后的威胁号的例子板:

代码语言:javascript
复制
. . . . . . . .
. . . . . . . .
. . . 2 . . . .
. . . . . . . .
. . . . . . . .
. 2 . 3 . . 2 .
. 1 . . . . . .
. . . . . . . 0

如果每个女王只能以与自己相同的威胁号攻击其他女王,董事会将处于和平对峙状态。

例如:

代码语言:javascript
复制
. . . . . . . .
. . . . . . . .
. 2 . 2 . . . .
. . . . . . . .
. . . . . . . .
. 2 . 2 . . . .
. . . . . . . .
. . . . . . . .

每个女王可以攻击另外两个,所以这是一个和平的对峙。

另一个例子是:

代码语言:javascript
复制
3 . . . . . . 3
. . . . . . . .
. 1 . . . . 1 .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
3 . . . . . . 3

这里并不是所有的皇后都有相同的威胁号。有些人威胁另外3人,有些人只威胁1人。然而,没有一个3s威胁1 (反之亦然),所以它是和平的。

任务

你将接受一个棋盘作为输入,并输出它是否是一个和平的僵局。您可以假设输入板总是8单位乘8单位的标准棋盘大小,您可以将其作为布尔人列表、棋子位置列表或任何其他合理格式。

您可能不需要在输入中预先计算威胁号。它们在上述示例中显示,但它们不是输入的一部分。

您应该输出两个一致的不同值中的一个。一种是当投入是一种和平的对峙,另一种则不是。

这是密码-高尔夫,所以目标是最小化源代码的大小(以字节为单位)。

测试用例

代码语言:javascript
复制
. . . . . . . .
. . . . . . . .
. . . Q . . . .
. . . . . . . .
. . . . . . . .
. Q . Q . . Q .
. Q . . . . . .
. . . . . . . Q

. . . . . . . .
. Q . Q . Q . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

True

代码语言:javascript
复制
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . Q . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

. . . . . . . .
. . . Q . . . .
. . . . . . . .
. . . . . . . .
. Q . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .


. . . . . . . .
. . . . . . . .
. . Q Q . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .

. . . . . . . .
. . . . . . . .
. Q . Q . . . .
. . . . . . . .
. . . . . . . .
. Q . Q . . . .
. . . . . . . .
. . . . . . . .

Q . . . . . . Q
. . . . . . . .
. Q . . . . Q .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
Q . . . . . . Q

Q . . . . . . Q
. . Q . . Q . .
. Q . . Q . Q .
. . Q . . . . .
. . . . . Q . .
. Q . Q . . Q .
. . Q . . Q . .
Q . . . . . . Q

国际象棋

国际象棋是在8乘8平方网格上玩的一种游戏。网格上的每个位置最多可以有1块。其中之一就是“女王”。皇后区可以攻击位于同一行、列或对角线上的任何一块,只要它们之间没有另一块是它们的目标。如果一件物品能攻击一件物品,它就被认为是“威胁”该件物品。

EN

回答 4

Code Golf用户

发布于 2022-10-18 23:19:55

JavaScript (ES6),157个字节

期望一个二进制矩阵。返回反向布尔值。

代码语言:javascript
复制
m=>(F=p=>m.some((r,y)=>r.some((v,x)=>!p*([s=0,..."1235678"].map(d=>(g=X=>((X+=d%3-1)|(Y+=~-(d/3)))&8?0:v*(V=m[Y][X])?s+=p|V!=v:g(X))(x,Y=y)),r[x]=s))))(F(1))

在网上试试!

怎么做?

这段代码在两次传递中解决了这个难题:

  • 当使用p=1调用时,F计算与每个皇后交互的皇后数量,相应地更新矩阵并返回\text{false}
  • 当调用p=\text{false}时,F测试是否至少有一个女王与与不同数量的皇后交互。

评论

主包装器

代码语言:javascript
复制
m => F(F(1))         // call F(1), then call F(false)

帮助函数F

代码语言:javascript
复制
F = p =>             // p = pass
m.some((r, y) =>     // for each row r[] at position y in m[]:
  r.some((v, x) =>   //   for each value v at position x in r[]:
    !p * (           //     do not trigger some() during the 1st pass
      [ s = 0,       //     initialize s to 0 and build the list
        ..."1235678" //     [ 0..3, 5..8 ]
      ].map(d =>     //     for each direction d in this list:
        g(x, Y = y)  //       invoke g with (X, Y) = (x, y)
      ),             //     end of map()
      r[x] = s       //     update m[y][x] to s
    )                //
  )                  //   end of inner some()
)                    // end of outer some()

帮助函数g

代码语言:javascript
复制
g = X =>             // X is passed explicitly,
                     // Y is passed implicitly
(                    //
  (X += d % 3 - 1) | // add dx = (d mod 3) - 1 to X
  (Y += ~-(d / 3))   // add dy = floor(d / 3) - 1 to Y
)                    //
& 8 ?                // if the resulting position is out of bounds:
  0                  //   stop the recursion
:                    // else:
  v *                //   force the test to fail if there's no queen
                     //   on the source square
  (V = m[Y][X])      //   let V be the value stored at (X, Y)
  ?                  //   if there's a queen there:
    s +=             //     increment s if:
      p |            //       this is the first pass
      V != v         //       or V is not equal to v
  :                  //   else:
    g(X)             //     keep testing this ray
票数 8
EN

Code Golf用户

发布于 2022-10-18 23:54:13

Python3,301个字节:

代码语言:javascript
复制
lambda b:all(all(len([*t(b,x,y)])==len([*t(b,X,Y)])for X,Y in t(b,x,y))for x in R(8)for y in R(8)if b[x][y])
R=range
def t(b,x,y):
 q=[(x,y,X,Y)for X in[-1,0,1]for Y in[-1,0,1]if X or Y]
 while q:
  x,y,X,Y=q.pop(0)
  A,B=x+X,y+Y
  if 0<=A<8 and 0<=B<8:
   if b[A][B]:yield(A,B)
   else:q+=[(A,B,X,Y)]

在网上试试!

票数 3
EN

Code Golf用户

发布于 2022-10-18 23:50:36

C (gcc),256个字节

代码语言:javascript
复制
#define A(c)for(i=0;i<64;++i)for(m=j=0;j<64;++j)if(j-i&&b[i]>0&b[j]>0){x=i/8-j/8,y=i%8-j%8;t=0;x||(t=(y>0)+1);y||(t=(x>0)*4+4);abs(x)-abs(y)||(t=16<<((x>0)+(y>0)*2));if(t&&!(m&t)){c;}}
f(b,i,j,m,t,y,x)int*b;{A(b[i]++;m|=t)A(if(b[i]-b[j])return 0)return 1;}

在网上试试!

票数 2
EN
页面原文内容由Code Golf提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codegolf.stackexchange.com/questions/253410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档