1

我刚刚玩了 8 Queens 谜题_dvlk(v2)发现k(v4). 我还检查了ngn k impls的其他k版本,并找到了运算符 in ,例如在JohnEarnest 的 impl中: ^k(v6)

l^a 或 l^l 除外。从 x 中删除每个 y 的所有实例。

k) 1 3 2 5 1 2 3^1 3 5
2 2

我真的很喜欢 SQL 风格,并希望将它应用到q. 但是,以下方式是惯用的q/k(v4)吗?它是一个好的解决方案吗?或者也许有更短的方法来做这样的列表比较/排除存在:

q)show s:til 8
0 1 2 3 4 5 6 7
q)s where not s in 2 4 6 /bother about this line, can it be shorter?
0 1 3 5 7

我的q8代码版本比nsl k2的版本长一点,没有递归和没有条件:

f:{raze {(x,) each (til 8) where not (til 8) in {x,(x-f),x+f:reverse 1+til count x} x} each x}
\ts:10 7 f/til 8 /248 100128
count  7 f/til 8 /92
first  7 f/til 8 /0 4 7 5 2 6 1 3

更新:我正在寻找的命令

q)f:{raze {(x,) each (til 8) except {x,(x-f),x+f:reverse 1+til count x} x} each x}

Upd2:广义8皇后解决方案k(v4)

k){(x-1){,/{(x,)'(!y)@&~(!y)in{x,(x-f),x+f:|1+!#x}x}[;y]'x}[;x]/!x}8

Upd3:在博客中添加8 个皇后拼图

4

1 回答 1

2

它只是关键字except

如何找到它:我们知道惯用的k构造@&,所以只需在.q命名空间中搜索它:

q)qfind:{([] q:k;k:.q k:key[.q] where (string value .q) like "*",x,"*")}
q)qfind "@&"
q      k
-----------------------------------
inter  k){x@&x in y}
except k){x@&~x in y}
xcols  k){(x,f@&~(f:cols y)in x)#y}

q) (til 8) except 2 4 6
0 1 3 5 7
于 2020-05-25T18:03:58.817 回答