25 lines
915 B
Text
25 lines
915 B
Text
def single_solution_queens(n):
|
|
def q: "♛";
|
|
def init(k): reduce range(0;k) as $i ([]; . + ["."]);
|
|
def matrix(k): init(k) as $row | reduce range(0;k) as $i ([]; . + [$row]);
|
|
def place(stream; i; j):
|
|
# jq indexing is based on offsets but we are using the 1-based formulae:
|
|
reduce stream as $s (.; setpath([-1+($s|i), -1+($s|j)]; q) );
|
|
def even(k):
|
|
if ((k-2) % 6) != 0 then
|
|
place( range(1; 1+(k/2)); .; 2*. )
|
|
| place( range(1; 1+(k/2)); (k/2) + .; 2*. -1 )
|
|
else place( range(1; 1+(k/2)); .; 1 + ((2*. + (k/2) - 3) % k))
|
|
| place( range(1; 1+(n/2)); n + 1 - .; n - ((2*. + (n/2) - 3) % n))
|
|
end;
|
|
|
|
matrix(n) # the chess board
|
|
| if (n % 2) == 0 then even(n)
|
|
else even(n-1) | .[n-1][n-1] = q
|
|
end;
|
|
|
|
# Example:
|
|
def pp: reduce .[] as $row
|
|
(""; reduce $row[] as $x (.; . + $x) + "\n");
|
|
|
|
single_solution_queens(8) | pp
|