RosettaCodeData/Task/N-queens-problem/Jq/n-queens-problem-1.jq
2017-09-25 22:28:19 +02:00

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