За исключением (^ или _dvl) аналога в примере k4, 8 Queens - PullRequest
0 голосов
/ 25 мая 2020

Я только что поиграл с головоломкой 8 Queens и обнаружил, что в k(v4) нет оператора _dvl (из k(v2)). Также я проверил другие k версии из ngn k impls и нашел оператор ^ в k(v6), например, в JohnEarnest's impl :

l ^ a или l ^ l кроме. Удалите все экземпляры каждого из y из x.

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

Мне очень нравится стиль SQL, и я хотел бы применить его в q. Но есть ли следующий способ идиоматии c в 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

Upd: команда, которую я искал, это за исключением :

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

Upd2: обобщенное решение 8 Queens в k(v4):

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

Upd3: добавить 8 королев головоломка в блог

1 Ответ

1 голос
/ 25 мая 2020

Это просто ключевое слово except.

Как его найти: мы знаем идиоматику c 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
...