这个挑战需要少量关于国际象棋的知识。如果你不熟悉国际象棋或想要复习,你可以在下面找到所需细节的描述。
对于一个只由皇后组成的棋盘配置,我们可以说每个皇后的威胁数是它威胁的其他皇后的数量。
下面是一个标有每个皇后的威胁号的例子板:
. . . . . . . .
. . . . . . . .
. . . 2 . . . .
. . . . . . . .
. . . . . . . .
. 2 . 3 . . 2 .
. 1 . . . . . .
. . . . . . . 0如果每个女王只能以与自己相同的威胁号攻击其他女王,董事会将处于和平对峙状态。
例如:
. . . . . . . .
. . . . . . . .
. 2 . 2 . . . .
. . . . . . . .
. . . . . . . .
. 2 . 2 . . . .
. . . . . . . .
. . . . . . . .每个女王可以攻击另外两个,所以这是一个和平的对峙。
另一个例子是:
3 . . . . . . 3
. . . . . . . .
. 1 . . . . 1 .
. . . . . . . .
. . . . . . . .
. . . . . . . .
. . . . . . . .
3 . . . . . . 3这里并不是所有的皇后都有相同的威胁号。有些人威胁另外3人,有些人只威胁1人。然而,没有一个3s威胁1 (反之亦然),所以它是和平的。
你将接受一个棋盘作为输入,并输出它是否是一个和平的僵局。您可以假设输入板总是8单位乘8单位的标准棋盘大小,您可以将其作为布尔人列表、棋子位置列表或任何其他合理格式。
您可能不需要在输入中预先计算威胁号。它们在上述示例中显示,但它们不是输入的一部分。
您应该输出两个一致的不同值中的一个。一种是当投入是一种和平的对峙,另一种则不是。
这是密码-高尔夫,所以目标是最小化源代码的大小(以字节为单位)。
. . . . . . . .
. . . . . . . .
. . . 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 .
. . Q . . . . .
. . . . . Q . .
. Q . Q . . Q .
. . Q . . Q . .
Q . . . . . . Q国际象棋是在8乘8平方网格上玩的一种游戏。网格上的每个位置最多可以有1块。其中之一就是“女王”。皇后区可以攻击位于同一行、列或对角线上的任何一块,只要它们之间没有另一块是它们的目标。如果一件物品能攻击一件物品,它就被认为是“威胁”该件物品。
发布于 2022-10-18 23:19:55
期望一个二进制矩阵。返回反向布尔值。
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))这段代码在两次传递中解决了这个难题:
m => F(F(1)) // call F(1), then call F(false)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 = 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发布于 2022-10-18 23:54:13
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)]发布于 2022-10-18 23:50:36
https://codegolf.stackexchange.com/questions/253410
复制相似问题