Peaceful chess queen armies: Difference between revisions

m
→‎{{header|jq}}: add newline
m (→‎{{header|jq}}: add newline)
 
(29 intermediate revisions by 9 users not shown)
Line 54:
* [https://oeis.org/A250000 A250000] OEIS
<br><br>
 
=={{header|11l}}==
{{trans|D}}
 
<syntaxhighlight lang="11l">T.enum Piece
EMPTY
BLACK
WHITE
 
F isAttacking(queen, pos)
R queen.x == pos.x
| queen.y == pos.y
| abs(queen.x - pos.x) == abs(queen.y - pos.y)
 
F place(m, n, &pBlackQueens, &pWhiteQueens)
I m == 0
R 1B
 
V placingBlack = 1B
L(i) 0 .< n
L(j) 0 .< n
V pos = (i, j)
L(queen) pBlackQueens
I queen == pos | (!placingBlack & isAttacking(queen, pos))
L.break
L.was_no_break
L(queen) pWhiteQueens
I queen == pos | (placingBlack & isAttacking(queen, pos))
L.break
L.was_no_break
I placingBlack
pBlackQueens [+]= pos
placingBlack = 0B
E
pWhiteQueens [+]= pos
I place(m - 1, n, &pBlackQueens, &pWhiteQueens)
R 1B
pBlackQueens.pop()
pWhiteQueens.pop()
placingBlack = 1B
 
I !placingBlack
pBlackQueens.pop()
R 0B
 
F printBoard(n, blackQueens, whiteQueens)
V board = [Piece.EMPTY] * (n * n)
 
L(queen) blackQueens
board[queen.x * n + queen.y] = Piece.BLACK
 
L(queen) whiteQueens
board[queen.x * n + queen.y] = Piece.WHITE
 
L(b) board
V i = L.index
I i != 0 & i % n == 0
print()
I b == BLACK
print(‘B ’, end' ‘’)
E I b == WHITE
print(‘W ’, end' ‘’)
E
V j = i I/ n
V k = i - j * n
I j % 2 == k % 2
print(‘x ’, end' ‘’)
E
print(‘o ’, end' ‘’)
print("\n")
 
V nms = [
(2, 1), (3, 1), (3, 2), (4, 1), (4, 2), (4, 3),
(5, 1), (5, 2), (5, 3), (5, 4), (5, 5),
(6, 1), (6, 2), (6, 3), (6, 4), (6, 5), (6, 6),
(7, 1), (7, 2), (7, 3), (7, 4), (7, 5), (7, 6), (7, 7)
]
 
L(nm) nms
print(‘#. black and #. white queens on a #. x #. board:’.format(nm[1], nm[1], nm[0], nm[0]))
[(Int, Int)] blackQueens, whiteQueens
I place(nm[1], nm[0], &blackQueens, &whiteQueens)
printBoard(nm[0], blackQueens, whiteQueens)
E
print("No solution exists.\n")</syntaxhighlight>
 
{{out}}
<pre>
1 black and 1 white queens on a 2 x 2 board:
No solution exists.
 
1 black and 1 white queens on a 3 x 3 board:
B o x
o x W
x o x
 
2 black and 2 white queens on a 3 x 3 board:
No solution exists.
 
1 black and 1 white queens on a 4 x 4 board:
B o x o
o x W x
x o x o
o x o x
 
2 black and 2 white queens on a 4 x 4 board:
B o x o
o x W x
B o x o
o x W x
 
3 black and 3 white queens on a 4 x 4 board:
No solution exists.
 
1 black and 1 white queens on a 5 x 5 board:
B o x o x
o x W x o
x o x o x
o x o x o
x o x o x
 
2 black and 2 white queens on a 5 x 5 board:
B o x o B
o x W x o
x W x o x
o x o x o
x o x o x
 
3 black and 3 white queens on a 5 x 5 board:
B o x o B
o x W x o
x W x o x
o x o B o
x W x o x
 
4 black and 4 white queens on a 5 x 5 board:
x B x B x
o x o x B
W o W o x
o x o x B
W o W o x
 
5 black and 5 white queens on a 5 x 5 board:
No solution exists.
 
1 black and 1 white queens on a 6 x 6 board:
B o x o x o
o x W x o x
x o x o x o
o x o x o x
x o x o x o
o x o x o x
 
2 black and 2 white queens on a 6 x 6 board:
B o x o B o
o x W x o x
x W x o x o
o x o x o x
x o x o x o
o x o x o x
 
3 black and 3 white queens on a 6 x 6 board:
B o x o B B
o x W x o x
x W x o x o
o x o x o x
x o W o x o
o x o x o x
 
4 black and 4 white queens on a 6 x 6 board:
B o x o B B
o x W x o x
x W x o x o
o x o x o B
x o W W x o
o x o x o x
 
5 black and 5 white queens on a 6 x 6 board:
x B x o B o
o x o B o B
W o x o x o
W x W x o x
x o x o x B
W x W x o x
 
6 black and 6 white queens on a 6 x 6 board:
No solution exists.
 
1 black and 1 white queens on a 7 x 7 board:
B o x o x o x
o x W x o x o
x o x o x o x
o x o x o x o
x o x o x o x
o x o x o x o
x o x o x o x
 
2 black and 2 white queens on a 7 x 7 board:
B o x o B o x
o x W x o x W
x o x o x o x
o x o x o x o
x o x o x o x
o x o x o x o
x o x o x o x
 
3 black and 3 white queens on a 7 x 7 board:
B o x o B o x
o x W x o x W
B o x o x o x
o x W x o x o
x o x o x o x
o x o x o x o
x o x o x o x
 
4 black and 4 white queens on a 7 x 7 board:
B o x o B o x
o x W x o x W
B o x o B o x
o x W x o x W
x o x o x o x
o x o x o x o
x o x o x o x
 
5 black and 5 white queens on a 7 x 7 board:
B o x o B o x
o x W x o x W
B o x o B o x
o x W x o x W
B o x o x o x
o x W x o x o
x o x o x o x
 
6 black and 6 white queens on a 7 x 7 board:
B o x o B o x
o x W x o x W
B o x o B o x
o x W x o x W
B o x o B o x
o x W x o x W
x o x o x o x
 
7 black and 7 white queens on a 7 x 7 board:
x B x o x B x
o B o x B x o
x B x o x B x
o x o x B x o
W o W o x o W
o x o W o x o
W o W W x o x
 
</pre>
 
=={{header|ATS}}==
{{trans|Scheme}}
 
The program can print either all solutions or all solutions that are ‘inequivalent’, in the sense of https://oeis.org/A260680
 
The program also can stop after printing a specified number of solutions, although the default is to print all solutions.
 
(Commentary by the author: this program suffers similarly of slowness, in eliminating rotational equivalents, as does its Scheme ancestor. Some reasons: it uses backtracking and that is slow; it uses essentially the same inefficient storage format for solutions [one could for instance use integers], and it does not precompute rotational equivalents. However, it does satisfy the task requirements, and might be regarded as a good start. And it can solve the m=5, n=6 case in practical time on a fast machine. m=7, n=7 is a more annoying case.)
 
<syntaxhighlight lang="ats">(********************************************************************)
 
#define ATS_DYNLOADFLAG 0
 
#include "share/atspre_define.hats"
#include "share/atspre_staload.hats"
 
staload UN = "prelude/SATS/unsafe.sats"
 
#define NIL list_vt_nil ()
#define :: list_vt_cons
 
#ifndef NDEBUG #then
(* Safety is relatively unimportant in this program.
Therefore I have made it so you can put ‘-DATS NDEBUG=1’ on
your patscc command line, to skip some assertloc tests. *)
#define NDEBUG 0
#endif
 
(********************************************************************)
 
#define EMPTY 0
#define BLACK 1
#define WHITE ~1
 
stadef is_color (c : int) : bool = (~1 <= c && c <= 1)
stadef reverse_color (c : int) : int = ~c
 
typedef color_t (tk : tkind, c : int) =
[is_color c]
g1int (tk, c)
typedef color_t (tk : tkind) =
[c : int | is_color c]
g1int (tk, c)
 
fn {tk : tkind}
reverse_color {c : int | is_color c}
(c : g1int (tk, c)) :<>
[c_rev : int | is_color c_rev;
c_rev == reverse_color c]
g1int (tk, c_rev) =
(* This template is a fancy way to say ‘minus’. *)
~c
 
(********************************************************************)
 
(* Matrix indices will run from 0..n-1 rather than 1..n. *)
 
#define SIDE_MAX 16 (* The maximum side size. For
efficiency, please make it a
power of two. *)
#define BOARD_SIZE 256 (* The storage size for a board. *)
 
prval _ = prop_verify {SIDE_MAX * SIDE_MAX == BOARD_SIZE} ()
 
fn {tk : tkind}
row_index {k : int | 0 <= k; k < BOARD_SIZE}
(k : g1int (tk, k)) :<>
[i : int | 0 <= i; i < SIDE_MAX]
g1int (tk, i) =
(* Let the C compiler convert this to bitmasking. *)
g1int_nmod (k, g1i2i SIDE_MAX)
 
fn {tk : tkind}
column_index {k : int | 0 <= k; k < BOARD_SIZE}
(k : g1int (tk, k)) :<>
[i : int | 0 <= i; i < SIDE_MAX]
g1int (tk, i) =
(* Let the C compiler convert this to a shift. *)
k / g1i2i SIDE_MAX
 
fn {tk : tkind}
storage_index {i, j : int | 0 <= i; i < SIDE_MAX;
0 <= j; j < SIDE_MAX}
(i : g1int (tk, i),
j : g1int (tk, j)) :<>
[k : int | 0 <= k; k < BOARD_SIZE]
g1int (tk, k) =
(* Let the C compiler convert this to a shift and add. *)
i + (j * g1i2i SIDE_MAX)
 
(********************************************************************)
 
extern fn {tk_index : tkind}
test_equiv$reindex_i
{i, j : int | 0 <= i; 0 <= j}
{n : int | 0 <= n; n <= SIDE_MAX;
i < n; j < n}
(i : g1int (tk_index, i),
j : g1int (tk_index, j),
n : g1int (tk_index, n)) :<>
[i1 : int | 0 <= i1; i1 < SIDE_MAX]
g1int (tk_index, i1)
 
extern fn {tk_index : tkind}
test_equiv$reindex_j
{i, j : int | 0 <= i; 0 <= j}
{n : int | 0 <= n; n <= SIDE_MAX;
i < n; j < n}
(i : g1int (tk_index, i),
j : g1int (tk_index, j),
n : g1int (tk_index, n)) :<>
[j1 : int | 0 <= j1; j1 < SIDE_MAX]
g1int (tk_index, j1)
 
extern fn {tk_color : tkind}
test_equiv$recolor
{c : int | is_color c}
(c : g1int (tk_color, c)) :<>
[c1 : int | is_color c1]
g1int (tk_color, c1)
 
fn {tk_index, tk_color : tkind}
test_equiv {n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
macdef reindex_i = test_equiv$reindex_i<tk_index>
macdef reindex_j = test_equiv$reindex_j<tk_index>
macdef recolor = test_equiv$recolor<tk_color>
 
fun
loopj {j : int | ~1 <= j; j < n} .<j + 1>.
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n),
j : g1int (tk_index, j)) :
bool =
if j < g1i2i 0 then
true
else
let
fun loopi {i : int | ~1 <= i; i < n} .<i + 1>.
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n),
j : g1int (tk_index, j),
i : g1int (tk_index, i)) :
bool =
if i < g1i2i 0 then
true
else
let
val ka = storage_index<tk_index> (i, j)
val color_a = a[ka]
 
val i1 = test_equiv$reindex_i<tk_index> (i, j, n)
val j1 = test_equiv$reindex_j<tk_index> (i, j, n)
val kb = storage_index<tk_index> (i1, j1)
val color_b = recolor b[kb]
in
if color_a = color_b then
loopi (a, b, n, j, pred i)
else
false
end
in
if loopi (a, b, n, j, g1i2i (pred n)) then
loopj (a, b, n, pred j)
else
false
end
in
loopj (a, b, n, g1i2i (pred n))
end
 
fn {tk_index, tk_color : tkind}
test_equiv_rotate0
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* No rotations or reflections. *)
implement
test_equiv$reindex_i<tk_index> (i, j, n) = i
implement
test_equiv$reindex_j<tk_index> (i, j, n) = j
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_rotate90
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Matrix rotation counterclockwise by 90 degrees. *)
implement
test_equiv$reindex_i<tk_index> {i, j} {n} (i, j, n) = pred n - j
implement
test_equiv$reindex_j<tk_index> (i, j, n) = i
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_rotate180
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Matrix rotation by 180 degrees. *)
implement
test_equiv$reindex_i<tk_index> {i, j} {n} (i, j, n) = pred n - i
implement
test_equiv$reindex_j<tk_index> {i, j} {n} (i, j, n) = pred n - j
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_rotate270
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Matrix rotation counterclockwise by 270 degrees. *)
implement
test_equiv$reindex_i<tk_index> (i, j, n) = j
implement
test_equiv$reindex_j<tk_index> {i, j} {n} (i, j, n) = pred n - i
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_reflecti
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Reverse the order of the rows. *)
implement
test_equiv$reindex_i<tk_index> {i, j} {n} (i, j, n) = pred n - i
implement
test_equiv$reindex_j<tk_index> (i, j, n) = j
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_reflectj
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Reverse the order of the columns. *)
implement
test_equiv$reindex_i<tk_index> (i, j, n) = i
implement
test_equiv$reindex_j<tk_index> {i, j} {n} (i, j, n) = pred n - j
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_reflect_diag_down
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Transpose the matrix around its main diagonal. *)
implement
test_equiv$reindex_i<tk_index> (i, j, n) = j
implement
test_equiv$reindex_j<tk_index> (i, j, n) = i
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
test_equiv_reflect_diag_up
{n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
bool =
let
(* Transpose the matrix around its main skew diagonal. *)
implement
test_equiv$reindex_i<tk_index> {i, j} {n} (i, j, n) = pred n - j
implement
test_equiv$reindex_j<tk_index> {i, j} {n} (i, j, n) = pred n - i
in
test_equiv<tk_index, tk_color> (a, b, n)
end
 
fn {tk_index, tk_color : tkind}
board_equiv {n : int | 0 <= n; n <= SIDE_MAX}
(a : &(@[color_t tk_color][BOARD_SIZE]),
b : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n),
rotation_equiv_classes : bool) :
bool =
let
(* Leave the colors unchanged. *)
implement test_equiv$recolor<tk_color> (c) = c
 
(* Test without rotations or reflections. *)
val equiv = test_equiv_rotate0<tk_index, tk_color> (a, b, n)
in
if ~rotation_equiv_classes then
equiv
else
let
(* Leave the colors unchanged. *)
implement test_equiv$recolor<tk_color> (c) = c
 
val equiv =
(equiv ||
test_equiv_rotate90<tk_index, tk_color> (a, b, n) ||
test_equiv_rotate180<tk_index, tk_color> (a, b, n) ||
test_equiv_rotate270<tk_index, tk_color> (a, b, n) ||
test_equiv_reflecti<tk_index, tk_color> (a, b, n) ||
test_equiv_reflectj<tk_index, tk_color> (a, b, n) ||
test_equiv_reflect_diag_down<tk_index, tk_color> (a, b, n) ||
test_equiv_reflect_diag_up<tk_index, tk_color> (a, b, n))
 
(* Reverse the colors of b in each test. *)
implement test_equiv$recolor<tk_color> (c) = reverse_color c
 
val equiv =
(equiv ||
test_equiv_rotate0<tk_index, tk_color> (a, b, n) ||
test_equiv_rotate90<tk_index, tk_color> (a, b, n) ||
test_equiv_rotate180<tk_index, tk_color> (a, b, n) ||
test_equiv_rotate270<tk_index, tk_color> (a, b, n) ||
test_equiv_reflecti<tk_index, tk_color> (a, b, n) ||
test_equiv_reflectj<tk_index, tk_color> (a, b, n) ||
test_equiv_reflect_diag_down<tk_index, tk_color> (a, b, n) ||
test_equiv_reflect_diag_up<tk_index, tk_color> (a, b, n))
in
equiv
end
end
 
(********************************************************************)
 
fn {tk_index : tkind}
fprint_rule {n : int | 0 <= n; n <= SIDE_MAX}
(f : FILEref,
n : g1int (tk_index, n)) :
void =
let
fun
loop {j : int | 0 <= j; j <= n} .<n - j>.
(j : g1int (tk_index, j)) :
void =
if j <> n then
begin
fileref_puts (f, "----+");
loop (succ j)
end
in
fileref_puts (f, "+");
loop (g1i2i 0)
end
 
fn {tk_index, tk_color : tkind}
fprint_board {n : int | 0 <= n; n <= SIDE_MAX}
(f : FILEref,
a : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n)) :
void =
if n <> 0 then
let
fun
loopi {i : int | ~1 <= i; i < n} .<i + 1>.
(f : FILEref,
a : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n),
i : g1int (tk_index, i)) :
void =
if i <> ~1 then
let
fun
loopj {j : int | 0 <= j; j <= n} .<n - j>.
(f : FILEref,
a : &(@[color_t tk_color][BOARD_SIZE]),
n : g1int (tk_index, n),
i : g1int (tk_index, i),
j : g1int (tk_index, j)) :
void =
if j <> n then
let
val k = storage_index<tk_index> (i, j)
val color = a[k]
val representation =
if color = g1i2i BLACK then
"| B "
else if color = g1i2i WHITE then
"| W "
else
"| "
in
fileref_puts (f, representation);
loopj (f, a, n, i, succ j)
end
in
fileref_puts (f, "\n");
loopj (f, a, n, i, g1i2i 0);
fileref_puts (f, "|\n");
fprint_rule (f, n);
loopi (f, a, n, pred i)
end
in
fprint_rule (f, n);
loopi (f, a, n, pred n)
end
 
(********************************************************************)
 
(* M2_MAX equals the maximum number of queens of either color.
Thus it is the maximum of 2*m, where m is the number of queens
in an army. *)
#define M2_MAX BOARD_SIZE
 
(* The even-index queens are BLACK, the odd-index queens are WHITE. *)
 
vtypedef board_record_vt (tk_color : tkind,
p : addr) =
@{
pf = @[color_t tk_color][BOARD_SIZE] @ p,
pfgc = mfree_gc_v p |
p = ptr p
}
vtypedef board_record_vt (tk_color : tkind) =
[p : addr | null < p]
board_record_vt (tk_color, p)
 
vtypedef board_record_list_vt (tk_color : tkind,
n : int) =
list_vt (board_record_vt tk_color, n)
vtypedef board_record_list_vt (tk_color : tkind) =
[n : int]
board_record_list_vt (tk_color, n)
 
fn
board_record_vt_free
{tk_color : tkind}
{p : addr}
(record : board_record_vt (tk_color, p)) :
void =
let
val @{
pf = pf,
pfgc = pfgc |
p = p
} = record
in
array_ptr_free (pf, pfgc | p)
end
 
overload free with board_record_vt_free
 
fn
board_record_list_vt_free
{tk_color : tkind}
{n : int}
(lst : board_record_list_vt (tk_color, n)) :
void =
let
fun
loop {n : int | 0 <= n} .<n>.
(lst : board_record_list_vt (tk_color, n)) :
void =
case+ lst of
| ~ NIL => ()
| ~ head :: tail =>
begin
free head;
loop tail
end
 
prval _ = lemma_list_vt_param lst
in
loop lst
end
 
fn {tk_index, tk_color : tkind}
any_board_equiv {n : int | 0 <= n; n <= SIDE_MAX}
(board : &(@[color_t tk_color][BOARD_SIZE]),
lst : !board_record_list_vt tk_color,
n : g1int (tk_index, n),
rotation_equiv_classes : bool) :
bool =
let
macdef board_equiv = board_equiv<tk_index, tk_color>
 
fun
loop {k : int | 0 <= k} .<k>.
(board : &(@[color_t tk_color][BOARD_SIZE]),
lst : !board_record_list_vt (tk_color, k),
n : g1int (tk_index, n)) :
bool =
case+ lst of
| NIL => false
| head :: tail =>
if board_equiv (!(head.p), board, n,
rotation_equiv_classes) then
true
else
loop (board, tail, n)
 
prval _ = lemma_list_vt_param lst
in
loop (board, lst, n)
end
 
fn {tk_index, tk_color : tkind}
queens_to_board
{count : int | 0 <= count; count <= M2_MAX}
(queens : &(@[g1int tk_index][M2_MAX]),
count : int count) :
[p : addr | null < p]
board_record_vt (tk_color, p) =
let
typedef color_t = color_t tk_color
 
fun
loop {k : int | ~1 <= k; k < count} .<k + 1>.
(queens : &(@[g1int tk_index][M2_MAX]),
board : &(@[color_t tk_color][BOARD_SIZE]),
k : int k) :
void =
if 0 <= k then
let
val [coords : int] coords = queens[k]
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {0 <= coords} ()
prval _ = $UN.prop_assert {coords < BOARD_SIZE} ()
#else
val _ = assertloc (g1i2i 0 <= coords)
val _ = assertloc (coords < g1i2i BOARD_SIZE)
#endif
in
if g1int_nmod (k, 2) = 0 then
board[coords] := g1i2i BLACK
else
board[coords] := g1i2i WHITE;
loop (queens, board, pred k)
end
 
val @(pf, pfgc | p) = array_ptr_alloc<color_t> (i2sz BOARD_SIZE)
val _ = array_initize_elt<color_t> (!p, i2sz BOARD_SIZE,
g1i2i EMPTY)
val _ = loop (queens, !p, pred count)
in
@{
pf = pf,
pfgc = pfgc |
p = p
}
end
 
fn {tk : tkind}
queen_would_fit_in
{count : int | 0 <= count; count <= M2_MAX}
{i, j : int | 0 <= i; i < SIDE_MAX;
0 <= j; j < SIDE_MAX}
(queens : &(@[g1int tk][M2_MAX]),
count : int count,
i : g1int (tk, i),
j : g1int (tk, j)) :
bool =
(* Would a new queen at (i,j) be feasible? *)
if count = 0 then
true
else
let
fun
loop {k : int | ~1 <= k; k < count}
(queens : &(@[g1int tk][M2_MAX]),
k : int k) :
bool =
if k < 0 then
true
else
let
val [coords : int] coords = queens[k]
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {0 <= coords} ()
prval _ = $UN.prop_assert {coords < BOARD_SIZE} ()
#else
val _ = assertloc (g1i2i 0 <= coords)
val _ = assertloc (coords < g1i2i BOARD_SIZE)
#endif
 
val i1 = row_index<tk> coords
val j1 = column_index<tk> coords
in
if g1int_nmod (k, 2) = g1int_nmod (count, 2) then
(* The two queens are of the same color. They may not
share the same square. *)
begin
if i <> i1 || j <> j1 then
loop (queens, pred k)
else
false
end
else
(* The two queens are of different colors. They may not
share the same square nor attack each other. *)
begin
if (i <> i1 &&
j <> j1 &&
i + j <> i1 + j1 &&
i - j <> i1 - j1) then
loop (queens, pred k)
else
false
end
end
in
loop (queens, pred count)
end
 
fn {tk : tkind}
latest_queen_fits_in
{count : int | 1 <= count; count <= M2_MAX}
(queens : &(@[g1int tk][M2_MAX]),
count : int count) :
bool =
let
val [coords : int] coords = queens[pred count]
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {0 <= coords} ()
prval _ = $UN.prop_assert {coords < BOARD_SIZE} ()
#else
val _ = assertloc (g1i2i 0 <= coords)
val _ = assertloc (coords < g1i2i BOARD_SIZE)
#endif
 
val i = row_index<tk> coords
val j = column_index<tk> coords
in
queen_would_fit_in<tk> (queens, pred count, i, j)
end
 
fn {tk_index, tk_color : tkind}
find_solutions
{m : int | 0 <= m; 2 * m <= M2_MAX}
{n : int | 0 <= n; n <= SIDE_MAX}
{max_solutions : int | 0 <= max_solutions}
(f : FILEref,
m : int m,
n : g1int (tk_index, n),
rotation_equiv_classes : bool,
max_solutions : int max_solutions) :
[num_solutions : int | 0 <= num_solutions;
num_solutions <= max_solutions]
@(int num_solutions,
board_record_list_vt (tk_color, num_solutions)) =
(* This template function both prints the solutions and returns
them as a linked list. *)
if m = 0 then
@(0, NIL)
else if max_solutions = 0 then
@(0, NIL)
else
let
macdef latest_queen_fits_in = latest_queen_fits_in<tk_index>
macdef queens_to_board = queens_to_board<tk_index, tk_color>
macdef fprint_board = fprint_board<tk_index, tk_color>
macdef any_board_equiv = any_board_equiv<tk_index, tk_color>
macdef row_index = row_index<tk_index>
macdef column_index = column_index<tk_index>
macdef storage_index = storage_index<tk_index>
 
fnx
loop {num_solutions : int | 0 <= num_solutions;
num_solutions <= max_solutions}
{num_queens : int | 0 <= num_queens;
num_queens <= 2 * m}
(solutions : board_record_list_vt (tk_color,
num_solutions),
num_solutions : int num_solutions,
queens : &(@[g1int tk_index][M2_MAX]),
num_queens : int num_queens) :
[num_solutions1 : int | 0 <= num_solutions1;
num_solutions1 <= max_solutions]
@(int num_solutions1,
board_record_list_vt (tk_color, num_solutions1)) =
if num_queens = 0 then
@(num_solutions, solutions)
else if num_solutions = max_solutions then
@(num_solutions, solutions)
else if latest_queen_fits_in (queens, num_queens) then
begin
if num_queens = 2 * m then
let
val board = queens_to_board (queens, num_queens)
val equiv_solution =
any_board_equiv (!(board.p), solutions, n,
rotation_equiv_classes)
in
if ~equiv_solution then
begin
fprintln! (f, "Solution ",
succ num_solutions);
fprint_board (f, !(board.p), n);
fileref_puts (f, "\n\n");
move_a_queen (board :: solutions,
succ num_solutions,
queens, num_queens)
end
else
begin
free board;
move_a_queen (solutions, num_solutions,
queens, num_queens)
end
end
else
add_another_queen (solutions, num_solutions,
queens, num_queens)
end
else
move_a_queen (solutions, num_solutions,
queens, num_queens)
and
add_another_queen
{num_solutions : int |
0 <= num_solutions;
num_solutions <= max_solutions}
{num_queens : int | 0 <= num_queens;
num_queens + 1 <= 2 * m}
(solutions : board_record_list_vt
(tk_color, num_solutions),
num_solutions : int num_solutions,
queens : &(@[g1int tk_index][M2_MAX]),
num_queens : int num_queens) :
[num_solutions1 : int | 0 <= num_solutions1;
num_solutions1 <= max_solutions]
@(int num_solutions1,
board_record_list_vt (tk_color, num_solutions1)) =
let
val coords = storage_index (g1i2i 0, g1i2i 0)
in
queens[num_queens] := coords;
loop (solutions, num_solutions, queens, succ num_queens)
end
and
move_a_queen {num_solutions : int |
0 <= num_solutions;
num_solutions <= max_solutions}
{num_queens : int | 0 <= num_queens;
num_queens <= 2 * m}
(solutions : board_record_list_vt
(tk_color, num_solutions),
num_solutions : int num_solutions,
queens : &(@[g1int tk_index][M2_MAX]),
num_queens : int num_queens) :
[num_solutions1 : int | 0 <= num_solutions1;
num_solutions1 <= max_solutions]
@(int num_solutions1,
board_record_list_vt (tk_color, num_solutions1)) =
if num_queens = 0 then
loop (solutions, num_solutions, queens, num_queens)
else
let
val [coords : int] coords = queens[pred num_queens]
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {0 <= coords} ()
prval _ = $UN.prop_assert {coords < BOARD_SIZE} ()
#else
val _ = assertloc (g1i2i 0 <= coords)
val _ = assertloc (coords < g1i2i BOARD_SIZE)
#endif
 
val [i : int] i = row_index coords
val [j : int] j = column_index coords
 
prval _ = prop_verify {0 <= i} ()
prval _ = prop_verify {i < SIDE_MAX} ()
 
prval _ = prop_verify {0 <= j} ()
prval _ = prop_verify {j < SIDE_MAX} ()
 
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {i < n} ()
prval _ = $UN.prop_assert {j < n} ()
#else
val _ = $effmask_exn assertloc (i < n)
val _ = $effmask_exn assertloc (j < n)
#endif
in
if j = pred n then
begin
if i = pred n then
(* Backtrack. *)
move_a_queen (solutions, num_solutions,
queens, pred num_queens)
else
let
val coords = storage_index (succ i, j)
in
queens[pred num_queens] := coords;
loop (solutions, num_solutions,
queens, num_queens)
end
end
else
let
#if NDEBUG <> 0 #then
prval _ = $UN.prop_assert {j < n - 1} ()
#else
val _ = $effmask_exn assertloc (j < pred n)
#endif
in
if i = pred n then
let
val coords = storage_index (g1i2i 0, succ j)
in
queens[pred num_queens] := coords;
loop (solutions, num_solutions,
queens, num_queens)
end
else
let
val coords = storage_index (succ i, j)
in
queens[pred num_queens] := coords;
loop (solutions, num_solutions,
queens, num_queens)
end
end
end
 
var queens = @[g1int tk_index][M2_MAX] (g1i2i 0)
in
queens[0] := storage_index (g1i2i 0, g1i2i 0);
loop (NIL, 0, queens, 1)
end
 
(********************************************************************)
 
%{^
#include <stdlib.h>
#include <limits.h>
%}
 
implement
main0 (argc, argv) =
let
stadef tk_index = int_kind
stadef tk_color = int_kind
 
macdef usage_error (status) =
begin
println! ("Usage: ", argv[0],
" M N IGNORE_EQUIVALENTS [MAX_SOLUTIONS]");
exit (,(status))
end
 
val max_max_solutions =
$extval ([i : int | 0 <= i] int i, "INT_MAX")
in
if 4 <= argc then
let
val m = $extfcall (int, "atoi", argv[1])
val m = g1ofg0 m
val _ = if m < 0 then usage_error (2)
val _ = assertloc (0 <= m)
val _ =
if M2_MAX < 2 * m then
begin
println! (argv[0], ": M cannot be larger than ",
M2_MAX / 2);
usage_error (2)
end
val _ = assertloc (2 * m <= M2_MAX)
 
val n = $extfcall (int, "atoi", argv[2])
val n = g1ofg0 n
val _ = if n < 0 then usage_error (2)
val _ = assertloc (0 <= n)
val _ =
if SIDE_MAX < n then
begin
println! (argv[0], ": N cannot be larger than ",
SIDE_MAX);
usage_error (2)
end
val _ = assertloc (n <= SIDE_MAX)
 
val ignore_equivalents =
if argv[3] = "T" || argv[3] = "t" || argv[3] = "1" then
true
else if argv[3] = "F" || argv[3] = "f" || argv[3] = "0" then
false
else
begin
println! (argv[0],
": select T=t=1 or F=f=0 ",
"for IGNORE_EQUIVALENTS");
usage_error (2);
false
end
in
if argc = 5 then
let
val max_solutions = $extfcall (int, "atoi", argv[4])
val max_solutions = g1ofg0 max_solutions
val max_solutions = max (0, max_solutions)
 
val @(num_solutions, solutions) =
find_solutions<tk_index, tk_color>
(stdout_ref, m, n, ignore_equivalents,
max_solutions)
in
board_record_list_vt_free solutions
end
else
let
val @(num_solutions, solutions) =
find_solutions<tk_index, tk_color>
(stdout_ref, m, n, ignore_equivalents,
max_max_solutions)
in
board_record_list_vt_free solutions
end
end
else
usage_error (1)
end
 
(********************************************************************)</syntaxhighlight>
 
{{out}}
$ patscc -DATS NDEBUG=1 -O3 -fno-stack-protector -march=native -DATS_MEMALLOC_LIBC -o peaceful_queens peaceful_queens.dats && ./peaceful_queens 4 5 T
<pre>Solution 1
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
Solution 2
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
Solution 3
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
</pre>
 
=={{header|C}}==
{{trans|C#}}
<langsyntaxhighlight lang="c">#include <math.h>
#include <stdbool.h>
#include <stdio.h>
Line 329 ⟶ 1,578:
 
return EXIT_SUCCESS;
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 496 ⟶ 1,745:
=={{header|C sharp|C#}}==
{{trans|D}}
<langsyntaxhighlight lang="csharp">using System;
using System.Collections.Generic;
 
Line 609 ⟶ 1,858:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 776 ⟶ 2,025:
=={{header|C++}}==
{{trans|D}}
<langsyntaxhighlight lang="cpp">#include <iostream>
#include <vector>
 
Line 890 ⟶ 2,139:
 
return 0;
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 1,057 ⟶ 2,306:
=={{header|D}}==
{{trans|Go}}
<langsyntaxhighlight lang="d">import std.array;
import std.math;
import std.stdio;
Line 1,168 ⟶ 2,417:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 1,332 ⟶ 2,581:
◦ • ◦ W ◦ • ◦
W ◦ W W • ◦ • </pre>
 
=={{header|Fortran}}==
{{works with|gfortran|11.2.1}}
 
The example demonstrates modern Fortran’s capabilities for integer bit manipulation, by using large machine integers (and their entire bitrange) as bitmaps to represent queen armies. Complicated (but nevertheless single-statement) expressions of such integers represent such operations as rotating a chessboard and checking for any attacks.
 
There are two Fortran programs and a driver script. One program generates a Fortran module for basic operations; the other program (which must be linked with the generated module) does the actual work. The driver script is for Unix shell.
 
For speed, armies are represented by 64-bit or 128-bit integers, depending on the value of n. A 1-bit represets a queen. Rotations and reflections of the board are elemental integer operations on an army. Checking for any attacks is an elemental integer-to-boolean operation on the two armies (though the program detects rook-like attacks by a different mechanism). Equivalence under interchange of the colors can be tested by reversing which army gets which integer value.
 
Here is the first program, '''peaceful_queens_elements_generator.f90''', which generates code (specialized for given m and n) to deal with the representations of the armies as integers:
<syntaxhighlight lang="fortran">program peaceful_queens_elements_generator
use, intrinsic :: iso_fortran_env, only: int64
use, intrinsic :: iso_fortran_env, only: error_unit
 
implicit none
 
! 64-bit integers, for boards up to 8-by-8.
integer, parameter :: kind8x8 = int64
 
! 128-bit integers, for boards up to 11-by-11.
! This value is correct for gfortran.
integer, parameter :: kind11x11 = 16
 
integer(kind = kind11x11), parameter :: one = 1
integer(kind = kind11x11), parameter :: two = 2
 
integer, parameter :: n_max = 11
 
integer(kind = kind11x11) :: rook1_masks(0 : n_max - 1)
integer(kind = kind11x11) :: rook2_masks(0 : n_max - 1)
integer(kind = kind11x11) :: bishop1_masks(0 : (2 * n_max) - 4)
integer(kind = kind11x11) :: bishop2_masks(0 : (2 * n_max) - 4)
 
! Combines rook1_masks and rook2_masks.
integer(kind = kind11x11) :: rook_masks(0 : (2 * n_max) - 1)
 
! Combines bishop1_masks and bishop2_masks.
integer(kind = kind11x11) :: bishop_masks(0 : (4 * n_max) - 7)
 
! Combines rook and bishop masks.
integer(kind = kind11x11) :: queen_masks(0 : (6 * n_max) - 7)
 
character(len = 16), parameter :: s_kind8x8 = "kind8x8 "
character(len = 16), parameter :: s_kind11x11 = "kind11x11 "
 
character(200) :: arg
integer :: arg_count
 
integer :: m, n, max_solutions
integer :: board_kind
 
arg_count = command_argument_count ()
if (arg_count /= 3) then
call get_command_argument (0, arg)
write (error_unit, '("Usage: ", A, " M N MAX_SOLUTIONS")') trim (arg)
stop 1
end if
 
call get_command_argument (1, arg)
read (arg, *) m
if (m < 1) then
write (error_unit, '("M must be between 1 or greater.")')
stop 2
end if
 
call get_command_argument (2, arg)
read (arg, *) n
if (n < 3 .or. 11 < n) then
write (error_unit, '("N must be between 3 and ", I0, ", inclusive.")') n_max
stop 2
end if
 
call get_command_argument (3, arg)
read (arg, *) max_solutions
 
write (*, '("module peaceful_queens_elements")')
write (*, '()')
write (*, '(" use, intrinsic :: iso_fortran_env, only: int64")')
write (*, '()')
write (*, '(" implicit none")')
write (*, '(" private")')
write (*, '()')
write (*, '(" integer, parameter, public :: m = ", I0)') m
write (*, '(" integer, parameter, public :: n = ", I0)') n
write (*, '(" integer, parameter, public :: max_solutions = ", I0)') max_solutions
write (*, '()')
if (n <= 8) then
write (*, '(" ! 64-bit integers, for boards up to 8-by-8.")')
write (*, '(" integer, parameter, private :: kind8x8 = int64")')
else
write (*, '(" ! 128-bit integers, for boards up to 11-by-11.")')
write (*, '(" integer, parameter, private :: kind11x11 = ", I0)') kind11x11
end if
write (*, '(" integer, parameter, public :: board_kind = ", A)') trim (s_kindnxn (n))
write (*, '()')
write (*, '()')
write (*, '(" public :: rooks1_attack_check")')
write (*, '(" public :: rooks2_attack_check")')
write (*, '(" public :: rooks_attack_check")')
write (*, '(" public :: bishops1_attack_check")')
write (*, '(" public :: bishops2_attack_check")')
write (*, '(" public :: bishops_attack_check")')
write (*, '(" public :: queens_attack_check")')
write (*, '()')
write (*, '(" public :: board_rotate90")')
write (*, '(" public :: board_rotate180")')
write (*, '(" public :: board_rotate270")')
write (*, '(" public :: board_reflect1")')
write (*, '(" public :: board_reflect2")')
write (*, '(" public :: board_reflect3")')
write (*, '(" public :: board_reflect4")')
write (*, '()')
 
call write_rook1_masks
call write_rook2_masks
call write_bishop1_masks
call write_bishop2_masks
call write_rook_masks
call write_bishop_masks
call write_queen_masks
 
write (*, '("contains")')
write (*, '()')
 
call write_rooks1_attack_check
call write_rooks2_attack_check
call write_bishops1_attack_check
call write_bishops2_attack_check
call write_rooks_attack_check
call write_bishops_attack_check
call write_queens_attack_check
 
call write_board_rotate90
call write_board_rotate180
call write_board_rotate270
call write_board_reflect1
call write_board_reflect2
call write_board_reflect3
call write_board_reflect4
 
call write_insert_zeros
call write_reverse_insert_zeros
 
write (*, '("end module peaceful_queens_elements")')
 
contains
 
subroutine write_rook1_masks
integer :: i
 
call fill_masks (n)
do i = 0, n - 1
write (*, '(" integer(kind = ", A, "), parameter :: rook1_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& rook1_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_rook1_masks
 
subroutine write_rook2_masks
integer :: i
 
call fill_masks (n)
do i = 0, n - 1
write (*, '(" integer(kind = ", A, "), parameter :: rook2_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& rook2_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_rook2_masks
 
subroutine write_bishop1_masks
integer :: i
 
call fill_masks (n)
do i = 0, (2 * n) - 4
write (*, '(" integer(kind = ", A, "), parameter :: bishop1_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& bishop1_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_bishop1_masks
 
subroutine write_bishop2_masks
integer :: i
 
call fill_masks (n)
do i = 0, (2 * n) - 4
write (*, '(" integer(kind = ", A, "), parameter :: bishop2_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& bishop2_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_bishop2_masks
 
subroutine write_rook_masks
integer :: i
 
call fill_masks (n)
do i = 0, (2 * n) - 1
write (*, '(" integer(kind = ", A, "), parameter :: rook_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& rook_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_rook_masks
 
subroutine write_bishop_masks
integer :: i
 
call fill_masks (n)
do i = 0, (4 * n) - 7
write (*, '(" integer(kind = ", A, "), parameter :: bishop_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& bishop_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_bishop_masks
 
subroutine write_queen_masks
integer :: i
 
call fill_masks (n)
do i = 0, (6 * n) - 7
write (*, '(" integer(kind = ", A, "), parameter :: queen_mask_",&
& I0, "x", I0, "_", I0, " = int (z''", Z0.32, "'', kind &
&= ", A, ")")') trim (s_kindnxn (n)), n, n, i,&
& queen_masks(i), trim (s_kindnxn (n))
end do
write (*, '()')
end subroutine write_queen_masks
 
subroutine write_rooks1_attack_check
integer :: i
 
write (*, '(" elemental function rooks1_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, rook1_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, rook1_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, n - 1
write (*, '(" & ((iand (army1, rook1_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, rook1_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= n - 1) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function rooks1_attack_check")')
write (*, '()')
end subroutine write_rooks1_attack_check
 
subroutine write_rooks2_attack_check
integer :: i
 
write (*, '(" elemental function rooks2_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, rook2_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, rook2_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, n - 1
write (*, '(" & ((iand (army1, rook2_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, rook2_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= n - 1) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function rooks2_attack_check")')
write (*, '()')
end subroutine write_rooks2_attack_check
 
subroutine write_bishops1_attack_check
integer :: i
 
write (*, '(" elemental function bishops1_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, bishop1_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, bishop1_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, (2 * n) - 4
write (*, '(" & ((iand (army1, bishop1_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, bishop1_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= (2 * n) - 4) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function bishops1_attack_check")')
write (*, '()')
end subroutine write_bishops1_attack_check
 
subroutine write_bishops2_attack_check
integer :: i
 
write (*, '(" elemental function bishops2_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, bishop2_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, bishop2_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, (2 * n) - 4
write (*, '(" & ((iand (army1, bishop2_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, bishop2_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= (2 * n) - 4) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function bishops2_attack_check")')
write (*, '()')
end subroutine write_bishops2_attack_check
 
subroutine write_rooks_attack_check
integer :: i
 
write (*, '(" elemental function rooks_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, rook_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, rook_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, (2 * n) - 1
write (*, '(" & ((iand (army1, rook_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, rook_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= (2 * n) - 1) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function rooks_attack_check")')
write (*, '()')
end subroutine write_rooks_attack_check
 
subroutine write_bishops_attack_check
integer :: i
 
write (*, '(" elemental function bishops_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, bishop_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, bishop_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, (4 * n) - 7
write (*, '(" & ((iand (army1, bishop_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, bishop_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= (4 * n) - 7) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function bishops_attack_check")')
write (*, '()')
end subroutine write_bishops_attack_check
 
subroutine write_queens_attack_check
integer :: i
 
write (*, '(" elemental function queens_attack_check (army1, army2) result (attacking)")')
write (*, '(" integer(kind = ", A, "), value :: army1, army2")') trim (s_kindnxn (n))
write (*, '(" logical :: attacking")')
write (*, '()')
write (*, '(" attacking = ((iand (army1, queen_mask_", I0, "x", I0,&
& "_0) /= 0) .and. (iand (army2, queen_mask_", I0, "x", I0, "_0) /=&
& 0)) .or. &")') n, n, n, n
do i = 1, (6 * n) - 7
write (*, '(" & ((iand (army1, queen_mask_", I0, "x",&
& I0, "_", I0, ") /= 0) .and. (iand (army2, queen_mask_", I0,&
& "x", I0, "_", I0, ") /= 0))")', advance = 'no') n, n, i, n, n, i
if (i /= (6 * n) - 7) then
write (*, '(" .or. &")')
else
write (*, '()')
end if
end do
write (*, '(" end function queens_attack_check")')
write (*, '()')
end subroutine write_queens_attack_check
 
subroutine write_board_rotate90
integer :: i, j
 
write (*, '(" elemental function board_rotate90 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Rotation 90 degrees in one of the orientations.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (reverse_insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, "), &")') n, n, n, i, -i * n, i
else
write (*, '(" ishft (reverse_insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, ")")', advance = 'no') n, n, n, i, -i * n, i
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_rotate90")')
write (*, '()')
end subroutine write_board_rotate90
 
subroutine write_board_rotate180
write (*, '(" elemental function board_rotate180 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Rotation 180 degrees.")')
write (*, '()')
write (*, '(" b = board_reflect1 (board_reflect2 (a))")')
write (*, '(" end function board_rotate180")')
write (*, '()')
end subroutine write_board_rotate180
 
subroutine write_board_rotate270
integer :: i, j
 
write (*, '(" elemental function board_rotate270 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Rotation 270 degrees in one of the orientations.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, "), &")') n, n, n, i, -i * n, n - 1 - i
else
write (*, '(" ishft (insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, ")")', advance = 'no') n, n, n, i, -i * n, n - 1 - i
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_rotate270")')
write (*, '()')
end subroutine write_board_rotate270
 
subroutine write_board_reflect1
integer :: i, j
 
write (*, '(" elemental function board_reflect1 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Reflection of rows or columns.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (iand (rook2_mask_", I0, "x", I0, "_", I0, ", a), ", I0, "), &")') &
& n, n, i, (n - 1) - (2 * i)
else
write (*, '("ishft (iand (rook2_mask_", I0, "x", I0, "_", I0, ", a), ", I0, ")")', advance = 'no') &
& n, n, i, (n - 1) - (2 * i)
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_reflect1")')
write (*, '()')
end subroutine write_board_reflect1
 
subroutine write_board_reflect2
integer :: i, j
 
write (*, '(" elemental function board_reflect2 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Reflection of rows or columns.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ", I0, "), &")') &
& n, n, i, n * ((n - 1) - (2 * i))
else
write (*, '("ishft (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ", I0, ")")', advance = 'no') &
& n, n, i, n * ((n - 1) - (2 * i))
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_reflect2")')
write (*, '()')
end subroutine write_board_reflect2
 
subroutine write_board_reflect3
integer :: i, j
 
write (*, '(" elemental function board_reflect3 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Reflection around one of the two main diagonals.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, "), &")') n, n, n, i, -i * n, i
else
write (*, '(" ishft (insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, ")")', advance = 'no') n, n, n, i, -i * n, i
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_reflect3")')
write (*, '()')
end subroutine write_board_reflect3
 
subroutine write_board_reflect4
integer :: i, j
 
write (*, '(" elemental function board_reflect4 (a) result (b)")')
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
write (*, '(" ! Reflection around one of the two main diagonals.")')
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (reverse_insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, "), &")') n, n, n, i, -i * n, n - 1 - i
else
write (*, '(" ishft (reverse_insert_zeros_", I0, " (ishft&
& (iand (rook1_mask_", I0, "x", I0, "_", I0, ", a), ",&
& I0, ")), ", I0, ")")', advance = 'no') n, n, n, i, -i * n, n - 1 - i
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function board_reflect4")')
write (*, '()')
end subroutine write_board_reflect4
 
subroutine write_insert_zeros
integer :: i, j
 
write (*, '(" elemental function insert_zeros_", I0, " (a) result (b)")') n
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (ibits (a, ", I0, ", 1), ", I0, "), &")') i, i * n
else
write (*, '("ishft (ibits (a, ", I0, ", 1), ", I0, ")")', advance = 'no') i, i * n
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function insert_zeros_", I0)') n
write (*, '()')
end subroutine write_insert_zeros
 
subroutine write_reverse_insert_zeros
integer :: i, j
 
write (*, '(" elemental function reverse_insert_zeros_", I0, " (a) result (b)")') n
write (*, '(" integer(kind = ", A, "), value :: a")') trim (s_kindnxn (n))
write (*, '(" integer(kind = ", A, ") :: b")') trim (s_kindnxn (n))
write (*, '()')
do i = 0, n - 1
if (i == 0) then
write (*, '(" b = ")', advance = 'no')
else
write (*, '(" & ")', advance = 'no')
do j = 1, i
write (*, '(" ")', advance = 'no')
end do
end if
if (i /= n - 1) then
write (*, '("ior (ishft (ibits (a, ", I0, ", 1), ", I0, "), &")') n - 1 - i, i * n
else
write (*, '("ishft (ibits (a, ", I0, ", 1), ", I0, ")")', advance = 'no') n - 1 - i, i * n
do j = 1, n - 1
write (*, '(")")', advance = 'no')
end do
write (*, '()')
end if
end do
write (*, '(" end function reverse_insert_zeros_", I0)') n
write (*, '()')
end subroutine write_reverse_insert_zeros
 
function s_kindnxn (n) result (s)
integer, intent(in) :: n
character(len = 16) :: s
 
if (n <= 8) then
s = s_kind8x8
else
s = s_kind11x11
end if
end function s_kindnxn
 
subroutine fill_masks (n)
integer, intent(in) :: n
 
call fill_rook1_masks (n)
call fill_rook2_masks (n)
call fill_bishop1_masks (n)
call fill_bishop2_masks (n)
call fill_rook_masks (n)
call fill_bishop_masks (n)
call fill_queen_masks (n)
end subroutine fill_masks
 
subroutine fill_rook1_masks (n)
integer, intent(in) :: n
 
integer :: i
integer(kind = kind11x11) :: mask
 
mask = (two ** n) - 1
do i = 0, n - 1
rook1_masks(i) = mask
mask = ishft (mask, n)
end do
end subroutine fill_rook1_masks
 
subroutine fill_rook2_masks (n)
integer, intent(in) :: n
 
integer :: i
integer(kind = kind11x11) :: mask
 
mask = 0
do i = 0, n - 1
mask = ior (ishft (mask, n), one)
end do
do i = 0, n - 1
rook2_masks(i) = mask
mask = ishft (mask, 1)
end do
end subroutine fill_rook2_masks
subroutine fill_bishop1_masks (n)
integer, intent(in) :: n
 
integer :: i, j, k
integer(kind = kind11x11) :: mask0, mask1
 
! Masks for diagonals. Put them in order from most densely
! populated to least densely populated.
 
do k = 0, n - 2
mask0 = 0
mask1 = 0
do i = k, n - 1
j = i - k
mask0 = ior (mask0, ishft (one, i + (j * n)))
mask1 = ior (mask1, ishft (one, j + (i * n)))
end do
if (k == 0) then
bishop1_masks(0) = mask0
else
bishop1_masks((2 * k) - 1) = mask0
bishop1_masks(2 * k) = mask1
end if
end do
end subroutine fill_bishop1_masks
 
subroutine fill_bishop2_masks (n)
integer, intent(in) :: n
 
integer :: i, j, k
integer :: i1, j1
integer(kind = kind11x11) :: mask0, mask1
 
! Masks for skew diagonals. Put them in order from most densely
! populated to least densely populated.
 
do k = 0, n - 2
mask0 = 0
mask1 = 0
do i = k, n - 1
j = i - k
i1 = n - 1 - i
j1 = n - 1 - j
mask0 = ior (mask0, ishft (one, j + (i1 * n)))
mask1 = ior (mask1, ishft (one, i + (j1 * n)))
end do
if (k == 0) then
bishop2_masks(0) = mask0
else
bishop2_masks((2 * k) - 1) = mask0
bishop2_masks(2 * k) = mask1
end if
end do
end subroutine fill_bishop2_masks
 
subroutine fill_rook_masks (n)
integer, intent(in) :: n
 
rook_masks(0 : n - 1) = rook1_masks
rook_masks(n : (2 * n) - 1) = rook2_masks
end subroutine fill_rook_masks
 
subroutine fill_bishop_masks (n)
integer, intent(in) :: n
 
integer :: i
 
! Put the masks in order from most densely populated to least
! densely populated.
 
do i = 0, (2 * n) - 4
bishop_masks(2 * i) = bishop1_masks(i)
bishop_masks((2 * i) + 1) = bishop2_masks(i)
end do
end subroutine fill_bishop_masks
 
subroutine fill_queen_masks (n)
integer, intent(in) :: n
 
queen_masks(0 : (2 * n) - 1) = rook_masks
queen_masks(2 * n : (6 * n) - 7) = bishop_masks
end subroutine fill_queen_masks
 
end program peaceful_queens_elements_generator</syntaxhighlight>
 
Here is the second program, '''peaceful_queens.f90''':
<syntaxhighlight lang="fortran">module peaceful_queens_support
use, non_intrinsic :: peaceful_queens_elements
 
implicit none
private
 
public :: write_board
public :: write_board_without_spaces
public :: write_board_with_spaces
 
public :: save_a_solution
 
interface write_board
module procedure write_board_without_spaces
module procedure write_board_with_spaces
end interface write_board
 
contains
 
subroutine write_board_without_spaces (unit, army_b, army_w)
integer, intent(in) :: unit
integer(kind = board_kind), intent(in) :: army_b, army_w
 
call write_board_with_spaces (unit, army_b, army_w, 0)
end subroutine write_board_without_spaces
 
subroutine write_board_with_spaces (unit, army_b, army_w, num_spaces)
integer, intent(in) :: unit
integer(kind = board_kind), intent(in) :: army_b, army_w
integer, intent(in) :: num_spaces
 
integer(kind = board_kind), parameter :: zero = 0
integer(kind = board_kind), parameter :: one = 1
 
integer :: i, j
integer(kind = board_kind) :: rank_b, rank_w
integer(kind = board_kind) :: mask
 
character(1), allocatable :: queens(:)
character(4), allocatable :: rules(:)
character(1), allocatable :: spaces(:)
 
allocate (queens(0 : n - 1))
allocate (rules(0 : n - 1))
allocate (spaces(1 : num_spaces))
 
rules = "----"
if (0 < num_spaces) then
spaces = " " ! For putting spaces after newlines.
end if
 
mask = not (ishft (not (zero), n))
write (unit, '("+", 100(A4, "+"))') rules
do i = 0, n - 1
rank_b = iand (mask, ishft (army_b, -i * n))
rank_w = iand (mask, ishft (army_w, -i * n))
do j = 0, n - 1
if (iand (rank_b, ishft (one, j)) /= 0) then
queens(j) = "B"
else if (iand (rank_w, ishft (one, j)) /= 0) then
queens(j) = "W"
else
queens(j) = " "
end if
end do
write (unit, '(100A1)', advance = 'no') spaces
write (unit, '("|", 100(A3, " |"))') queens
write (unit, '(100A1)', advance = 'no') spaces
if (i /= n - 1) then
write (unit, '("+", 100(A4, "+"))') rules
else
write (unit, '("+", 100(A4, "+"))', advance = 'no') rules
end if
end do
end subroutine write_board_with_spaces
 
subroutine save_a_solution (army1, army2, num_solutions, armies1, armies2)
integer(kind = board_kind), intent(in) :: army1, army2
integer, intent(inout) :: num_solutions
integer(kind = board_kind), intent(inout) :: armies1(1:8, 1:max_solutions)
integer(kind = board_kind), intent(inout) :: armies2(1:8, 1:max_solutions)
 
! A sanity check.
if (queens_attack_check (army1, army2)) then
error stop
end if
 
num_solutions = num_solutions + 1
 
armies1(1, num_solutions) = army1
armies1(2, num_solutions) = board_rotate90 (army1)
armies1(3, num_solutions) = board_rotate180 (army1)
armies1(4, num_solutions) = board_rotate270 (army1)
armies1(5, num_solutions) = board_reflect1 (army1)
armies1(6, num_solutions) = board_reflect2 (army1)
armies1(7, num_solutions) = board_reflect3 (army1)
armies1(8, num_solutions) = board_reflect4 (army1)
 
armies2(1, num_solutions) = army2
armies2(2, num_solutions) = board_rotate90 (army2)
armies2(3, num_solutions) = board_rotate180 (army2)
armies2(4, num_solutions) = board_rotate270 (army2)
armies2(5, num_solutions) = board_reflect1 (army2)
armies2(6, num_solutions) = board_reflect2 (army2)
armies2(7, num_solutions) = board_reflect3 (army2)
armies2(8, num_solutions) = board_reflect4 (army2)
end subroutine save_a_solution
 
end module peaceful_queens_support
 
module peaceful_queens_solver
use, non_intrinsic :: peaceful_queens_elements
use, non_intrinsic :: peaceful_queens_support
 
implicit none
private
 
public :: solve_peaceful_queens
 
integer(kind = board_kind), parameter :: zero = 0_board_kind
integer(kind = board_kind), parameter :: one = 1_board_kind
integer(kind = board_kind), parameter :: two = 2_board_kind
 
contains
 
subroutine solve_peaceful_queens (unit, show_equivalents, &
& num_solutions, armies1, armies2)
integer, intent(in) :: unit
logical, intent(in) :: show_equivalents
integer, intent(out) :: num_solutions
integer(kind = board_kind), intent(out) :: armies1(1:8, 1:max_solutions)
integer(kind = board_kind), intent(out) :: armies2(1:8, 1:max_solutions)
 
call solve (zero, 0, 0, zero, 0, 0, 0)
 
contains
 
recursive subroutine solve (army1, rooklike11, rooklike12, &
& army2, rooklike21, rooklike22, index)
integer(kind = board_kind), value :: army1
integer, value :: rooklike11, rooklike12
integer(kind = board_kind), value :: army2
integer, value :: rooklike21, rooklike22
integer, value :: index
 
integer :: num_queens1
integer :: num_queens2
integer(kind = board_kind) :: new_army
integer(kind = board_kind) :: new_army_reversed
integer :: bit1, bit2
logical :: skip
 
num_queens1 = popcnt (army1)
num_queens2 = popcnt (army2)
 
if (num_queens1 + num_queens2 == 2 * m) then
if (.not. is_a_duplicate (army1, army2, num_solutions, armies1, armies2)) then
call save_a_solution (army1, army2, num_solutions, armies1, armies2)
write (unit, '("Solution ", I0)') num_solutions
call write_board (unit, army1, army2)
write (unit, '()')
write (unit, '()')
call optionally_write_equivalents
end if
else if (num_queens1 - num_queens2 == 0) then
! It is time to add a queen to army1.
do while (num_solutions < max_solutions .and. index /= n**2)
skip = .false.
new_army = ior (army1, ishft (one, index))
if (new_army == army1) then
skip = .true.
else if (index < n) then
new_army_reversed = board_reflect1 (new_army)
if (new_army_reversed < new_army) then
! Skip a bunch of board_reflect1 equivalents.
skip = .true.
end if
end if
if (skip) then
index = index + 1
else
bit1 = ishft (1, index / n)
bit2 = ishft (1, mod (index, n))
if (iand (rooklike21, bit1) /= 0) then
index = round_up_to_multiple (index + 1, n)
else if (iand (rooklike22, bit2) /= 0) then
index = index + 1
else if (bishops_attack_check (new_army, army2)) then
index = index + 1
else
call solve (new_army, &
& ior (rooklike11, bit1), &
& ior (rooklike12, bit2), &
& army2, rooklike21, rooklike22, &
& n)
index = index + 1
end if
end if
end do
else
! It is time to add a queen to army2.
do while (num_solutions < max_solutions .and. index /= n**2)
new_army = ior (army2, ishft (one, index))
skip = (new_army == army2)
if (skip) then
index = index + 1
else
bit1 = ishft (1, index / n)
bit2 = ishft (1, mod (index, n))
if (iand (rooklike11, bit1) /= 0) then
index = round_up_to_multiple (index + 1, n)
else if (iand (rooklike12, bit2) /= 0) then
index = index + 1
else if (bishops_attack_check (army1, new_army)) then
index = index + 1
else
call solve (army1, rooklike11, rooklike12, &
& new_army, &
& ior (rooklike21, bit1), &
& ior (rooklike22, bit2), &
& 0)
index = index + 1
end if
end if
end do
end if
end subroutine solve
 
subroutine optionally_write_equivalents
integer :: i
 
if (show_equivalents) then
write (unit, '(5X)', advance = 'no')
write (unit, '("Equivalents")')
 
write (unit, '(5X)', advance = 'no')
call write_board (unit, armies2(1, num_solutions), armies1(1, num_solutions), 5)
write (unit, '()')
write (unit, '()')
 
do i = 2, 5
if (all ((armies1(i, num_solutions) /= armies1(1 : i - 1, num_solutions) .or. &
& armies2(i, num_solutions) /= armies2(1 : i - 1, num_solutions)) .and. &
& (armies2(i, num_solutions) /= armies1(1 : i - 1, num_solutions) .or. &
& armies1(i, num_solutions) /= armies2(1 : i - 1, num_solutions)))) then
write (unit, '(5X)', advance = 'no')
call write_board (unit, armies1(i, num_solutions), armies2(i, num_solutions), 5)
write (unit, '()')
write (unit, '()')
write (unit, '(5X)', advance = 'no')
call write_board (unit, armies2(i, num_solutions), armies1(i, num_solutions), 5)
write (unit, '()')
write (unit, '()')
end if
end do
end if
end subroutine optionally_write_equivalents
 
end subroutine solve_peaceful_queens
 
elemental function round_up_to_multiple (x, n) result (y)
integer, value :: x, n
integer :: y
 
y = x + mod (n - mod (x, n), n)
end function round_up_to_multiple
 
pure function is_a_duplicate (army1, army2, num_solutions, armies1, armies2) result (is_dup)
integer(kind = board_kind), intent(in) :: army1, army2
integer, intent(in) :: num_solutions
integer(kind = board_kind), intent(in) :: armies1(1:8, 1:max_solutions)
integer(kind = board_kind), intent(in) :: armies2(1:8, 1:max_solutions)
logical :: is_dup
 
is_dup = any ((army1 == armies1(:, 1:num_solutions) .and. &
& army2 == armies2(:, 1:num_solutions)) .or. &
& (army2 == armies1(:, 1:num_solutions) .and. &
& army1 == armies2(:, 1:num_solutions)))
end function is_a_duplicate
 
end module peaceful_queens_solver
 
program peaceful_queens
use, intrinsic :: iso_fortran_env, only: output_unit
use, non_intrinsic :: peaceful_queens_elements
use, non_intrinsic :: peaceful_queens_support
use, non_intrinsic :: peaceful_queens_solver
 
implicit none
 
integer :: num_solutions
logical :: show_equivalents
integer(kind = board_kind) :: armies1(1:8, 1:max_solutions)
integer(kind = board_kind) :: armies2(1:8, 1:max_solutions)
 
integer :: arg_count
character(len = 200) :: arg
 
show_equivalents = .false.
 
arg_count = command_argument_count ()
if (1 <= arg_count) then
call get_command_argument (1, arg)
select case (trim (arg))
case ('1', 't', 'T', 'true', 'y', 'Y', 'yes')
show_equivalents = .true.
end select
end if
 
call solve_peaceful_queens (output_unit, show_equivalents, &
& num_solutions, armies1, armies2)
 
end program peaceful_queens</syntaxhighlight>
 
Here is the driver script:
<syntaxhighlight lang="sh">#!/bin/sh
#
# Driver script for peaceful_queens in Fortran.
#
 
if test ${ZSH_VERSION+y} && (emulate sh) >/dev/null 2>&1; then
emulate sh
fi
 
if test $# -ne 3 && test $# -ne 4; then
echo "Usage: $0 M N MAX_SOLUTIONS [SHOW_EQUIVALENTS]"
exit 1
fi
 
M=${1}
N=${2}
MAX_SOLUTIONS=${3}
SHOW_EQUIVALENTS=${4}
 
RM_GENERATED_SRC=yes
CHECK=no
 
case ${CHECK} in
0 | f | F | false | N | n | no) FCCHECK="" ;;
1 | t | T | true | Y | y | yes) FCCHECK="-fcheck=all" ;;
*) echo 'CHECK is set incorrectly';
exit 1 ;;
esac
 
FC="gfortran"
FCFLAGS="-std=f2018 -g -O3 -march=native -fno-stack-protector -Wall -Wextra ${FCCHECK}"
 
# If you have the graphite optimizer, here are some marginally helpful
# flags. They barely make a difference, for me.
FCFLAGS="${FCFLAGS} -funroll-loops -floop-nest-optimize"
 
RUN_IT="yes"
 
${FC} -o peaceful_queens_elements_generator peaceful_queens_elements_generator.f90 &&
./peaceful_queens_elements_generator ${M} ${N} ${MAX_SOLUTIONS} > peaceful_queens_elements.f90 &&
${FC} ${FCFLAGS} -c peaceful_queens_elements.f90 &&
if test x"${RM_GENERATED_SRC}" != xno; then rm -f peaceful_queens_elements.f90; fi &&
${FC} ${FCFLAGS} -c peaceful_queens.f90 &&
${FC} ${FCFLAGS} -o peaceful_queens peaceful_queens_elements.o peaceful_queens.o &&
if test x"${RUN_IT}" = xyes; then time ./peaceful_queens ${SHOW_EQUIVALENTS}; else :; fi</syntaxhighlight>
 
{{out}}
$ ./peaceful_queens-fortran-driver.sh 4 5 1000 T
<pre>Solution 1
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
Equivalents
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
 
Solution 2
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
 
Equivalents
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
 
Solution 3
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
 
Equivalents
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
 
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
</pre>
 
On my computer, the program can find all the solutions of m=5, n=6, and eliminate any other possibilities, in under 5 seconds. The m=7, n=7 case took about 4.25 hours, mostly eliminating other possibilities. The next thing to try would be m=9, n=8, but probably a faster program is called for, there.
 
It would be instructive to save and examine the generated '''peaceful_queens_elements.f90''' files. I leave that as an exercise for the reader. :)
 
=={{header|FreeBASIC}}==
<syntaxhighlight lang="vbnet">Type posicion
x As Integer
y As Integer
End Type
 
Type pieza
empty As Integer
black As Integer
white As Integer
End Type
 
Function isAttacking(q As posicion, posic As posicion) As Integer
Return (q.x = posic.x Or q.y = posic.y Or Abs(q.x - posic.x) = Abs(q.y - posic.y))
End Function
 
Sub place(m As Integer, n As Integer, blackQueens() As posicion, whiteQueens() As posicion, Byref result As Integer)
If m = 0 Then
result = -1
Exit Sub
End If
Dim As Integer placingBlack = -1
Dim As Integer i, j, k, equalposicion
Dim As Boolean inner
For i = 0 To n-1
For j = 0 To n-1
Dim As posicion posic = Type<posicion>(i, j)
inner = False
For k = Lbound(blackQueens) To Ubound(blackQueens)
equalposicion = (blackQueens(k).x = posic.x And blackQueens(k).y = posic.y)
If equalposicion Or (Not placingBlack And isAttacking(blackQueens(k), posic)) Then
inner = True
Exit For
End If
Next
If Not inner Then
For k = Lbound(whiteQueens) To Ubound(whiteQueens)
equalposicion = (whiteQueens(k).x = posic.x And whiteQueens(k).y = posic.y)
If equalposicion Or (placingBlack And isAttacking(whiteQueens(k), posic)) Then
inner = True
Exit For
End If
Next
If Not inner Then
If placingBlack Then
Redim Preserve blackQueens(Ubound(blackQueens) + 1)
blackQueens(Ubound(blackQueens)) = posic
placingBlack = 0
Else
Redim Preserve whiteQueens(Ubound(whiteQueens) + 1)
whiteQueens(Ubound(whiteQueens)) = posic
place(m-1, n, blackQueens(), whiteQueens(), result)
If result Then Exit Sub
Redim Preserve blackQueens(Ubound(blackQueens) - 1)
Redim Preserve whiteQueens(Ubound(whiteQueens) - 1)
placingBlack = -1
End If
End If
End If
Next
Next
If Not placingBlack Then Redim Preserve blackQueens(Ubound(blackQueens) - 1)
result = 0
End Sub
 
Sub printBoard(n As Integer, blackQueens() As posicion, whiteQueens() As posicion)
Dim As Integer board(n * n)
Dim As Integer i, j, k
For i = Lbound(blackQueens) To Ubound(blackQueens)
board(blackQueens(i).x * n + blackQueens(i).y) = 1
Next
For i = Lbound(whiteQueens) To Ubound(whiteQueens)
board(whiteQueens(i).x * n + whiteQueens(i).y) = 2
Next
For i = 0 To n*n-1
If i Mod n = 0 And i <> 0 Then Print
Select Case board(i)
Case 1
Print "B ";
Case 2
Print "W ";
Case Else
j = i \ n
k = i - j * n
If j Mod 2 = k Mod 2 Then
Print Chr(253); " ";
Else
Print Chr(252); " ";
End If
End Select
Next i
Print
End Sub
 
Dim As posicion nms(23) = { _
Type<posicion>(2, 1), Type<posicion>(3, 1), Type<posicion>(3, 2), Type<posicion>(4, 1), Type<posicion>(4, 2), Type<posicion>(4, 3), _
Type<posicion>(5, 1), Type<posicion>(5, 2), Type<posicion>(5, 3), Type<posicion>(5, 4), Type<posicion>(5, 5), _
Type<posicion>(6, 1), Type<posicion>(6, 2), Type<posicion>(6, 3), Type<posicion>(6, 4), Type<posicion>(6, 5), Type<posicion>(6, 6), _
Type<posicion>(7, 1), Type<posicion>(7, 2), Type<posicion>(7, 3), Type<posicion>(7, 4), Type<posicion>(7, 5), Type<posicion>(7, 6), Type<posicion>(7, 7) }
 
For i As Integer = Lbound(nms) To Ubound(nms)
Print Chr(10); nms(i).y; " black and "; nms(i).y; " white queens on a "; nms(i).x; " x "; nms(i).x; " board:"
Dim As posicion blackQueens(0)
Dim As posicion whiteQueens(0)
Dim As Integer result
place(nms(i).y, nms(i).x, blackQueens(), whiteQueens(), result)
If result Then
printBoard(nms(i).x, blackQueens(), whiteQueens())
Else
Print "No solution exists."
End If
Next i
 
Sleep</syntaxhighlight>
{{out}}
<pre>
1 black and 1 white queens on a 2 x 2 board:
No solution exists.
 
1 black and 1 white queens on a 3 x 3 board:
² ³ ²
³ ² B
W ³ ²
 
2 black and 2 white queens on a 3 x 3 board:
² B ²
³ ² ³
² ³ W
 
1 black and 1 white queens on a 4 x 4 board:
² ³ ² ³
³ ² B ²
W ³ ² ³
³ ² ³ ²
 
2 black and 2 white queens on a 4 x 4 board:
² B ² ³
³ ² ³ W
² ³ ² ³
³ ² ³ ²
 
3 black and 3 white queens on a 4 x 4 board:
B ³ ² ³
³ ² W ²
² ³ ² ³
³ ² ³ ²
 
1 black and 1 white queens on a 5 x 5 board:
² ³ ² ³ ²
³ ² B ² ³
W ³ ² ³ ²
³ ² ³ ² ³
² ³ ² ³ ²
 
2 black and 2 white queens on a 5 x 5 board:
² B ² ³ ²
³ ² ³ W ³
² ³ ² ³ ²
³ ² ³ ² ³
² ³ ² ³ ²
 
3 black and 3 white queens on a 5 x 5 board:
B ³ ² ³ ²
³ ² W ² ³
² ³ ² ³ ²
³ ² ³ ² ³
² ³ ² ³ ²
 
4 black and 4 white queens on a 5 x 5 board:
² ³ ² ³ B
W ² ³ ² ³
² ³ ² ³ ²
³ ² ³ ² ³
² ³ ² ³ ²
 
5 black and 5 white queens on a 5 x 5 board:
² ³ B ³ ²
³ ² ³ ² W
² ³ ² ³ ²
³ ² ³ ² ³
² ³ ² ³ ²
 
1 black and 1 white queens on a 6 x 6 board:
² ³ ² ³ ² ³
³ ² B ² ³ ²
W ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
2 black and 2 white queens on a 6 x 6 board:
² B ² ³ ² ³
³ ² ³ W ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
3 black and 3 white queens on a 6 x 6 board:
B ³ ² ³ ² ³
³ ² W ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
4 black and 4 white queens on a 6 x 6 board:
² ³ ² ³ B ³
W ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
5 black and 5 white queens on a 6 x 6 board:
² ³ B ³ ² ³
³ ² ³ ² W ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
6 black and 6 white queens on a 6 x 6 board:
B ³ ² ³ ² ³
³ ² W ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
² ³ ² ³ ² ³
³ ² ³ ² ³ ²
 
1 black and 1 white queens on a 7 x 7 board:
² ³ ² ³ ² ³ ²
³ ² B ² ³ ² ³
W ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
2 black and 2 white queens on a 7 x 7 board:
² B ² ³ ² ³ ²
³ ² ³ W ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
3 black and 3 white queens on a 7 x 7 board:
B ³ ² ³ ² ³ ²
³ ² W ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
4 black and 4 white queens on a 7 x 7 board:
² ³ ² ³ B ³ ²
W ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
5 black and 5 white queens on a 7 x 7 board:
² ³ B ³ ² ³ ²
³ ² ³ ² W ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
6 black and 6 white queens on a 7 x 7 board:
B ³ ² ³ ² ³ ²
³ ² W ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
 
7 black and 7 white queens on a 7 x 7 board:
² ³ ² ³ B ³ ²
W ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²
³ ² ³ ² ³ ² ³
² ³ ² ³ ² ³ ²</pre>
 
=={{header|Go}}==
Line 1,337 ⟶ 4,299:
 
Textual rather than HTML output. Whilst the unicode symbols for the black and white queens are recognized by the Ubuntu 16.04 terminal, I found it hard to visually distinguish between them so I've used 'B' and 'W' instead.
<langsyntaxhighlight lang="go">package main
 
import "fmt"
Line 1,461 ⟶ 4,423:
}
}
}</langsyntaxhighlight>
 
{{out}}
Line 1,633 ⟶ 4,595:
=={{header|Java}}==
{{trans|Kotlin}}
<langsyntaxhighlight lang="java">import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
Line 1,780 ⟶ 4,742:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 1,944 ⟶ 4,906:
B • B • ◦ • ◦
• ◦ • ◦ W ◦ • </pre>
 
=={{header|jq}}==
'''Adapted from [[#Wren|Wren]]'''
 
'''Works with jq, the C implementation of jq'''
 
'''Works with gojq, the Go implementation of jq'''
 
In the following, positions on the chessboard are represented by {x,y} objects.
<syntaxhighlight lang="jq">
# Is the queen at position . attacking the position $pos ?
def isAttacking($pos):
.x == $pos.x or
.y == $pos.y or
(((.x - $pos.x)|length) == ((.y - $pos.y)|length)); # i.e. abs
 
# Place $q black and $q white queens on an $n*$n board,
# where .blackQueens holds the positions of existing black Queens,
# and similarly for .whiteQueens.
# input: {blackQueens, whiteQueens}
# output: updated input on success, otherwise null.
def place($queens; $n):
def place($q):
if $q == 0 then .ok = true
else .placingBlack = true
| first(
foreach range(0; $n) as $i (.;
foreach range(0; $n) as $j (.;
{x:$i, y:$j} as $pos
| .placingBlack as $placingBlack
| if any( .blackQueens[], .whiteQueens[];
((.x == $pos.x) and (.y == $pos.y)))
then . # failure
elif .placingBlack
then if any( .whiteQueens[]; isAttacking($pos) )
then .
else .blackQueens += [$pos]
| .placingBlack = false
end
elif any( .blackQueens[]; isAttacking($pos) )
then .
else .whiteQueens += [$pos]
| place($q-1) as $place
| if $place then $place # success
else .blackQueens |= .[:-1]
| .whiteQueens |= .[:-1]
| .placingBlack = true
end
end
| if $i == $n-1 and $j == $n-1 then .ok = false end );
select(.ok) )
) // null
end;
{blackQueens: [], whiteQueens: [] } | place($queens);
 
# Input {blackQueens, whiteQueens}
def printBoard($n):
[range(0; $n) | 0] as $row
| .board = [range(0; $n) | $row]
| reduce .blackQueens[] as $queen (.; .board[$queen.x][$queen.y] = "B ")
| reduce .whiteQueens[] as $queen (.; .board[$queen.x][$queen.y] = "W ")
| foreach range(0; $n) as $i (.;
reduce range(0; $n) as $j (.row="";
.board[$i][$j] as $b
| .row +=
(if $b != 0 then $b
elif $i%2 == $j%2
then "• "
else "◦ "
end) ) )
| .row;
 
# Use an object {squares, queens} to record the task:
# $squares is the number of squares on each side of the board,
# and $queens is the number of queens of each color.
def Task($squares; $queens): {$squares, $queens};
 
def tasks: [
Task(2; 1), Task(3; 1), Task(3; 2), Task(4; 1), Task(4; 2), Task(4; 3),
Task(5; 1), Task(5; 2), Task(5; 3), Task(5; 4), Task(5; 5),
Task(6; 1), Task(6; 2), Task(6; 3), Task(6; 4), Task(6; 5), Task(6; 6),
Task(7; 1), Task(7; 2), Task(7; 3), Task(7; 4), Task(7; 5), Task(7; 6), Task(7; 7)
];
 
tasks[] as $t
| "\($t.queens) black and \($t.queens) white queens on a \($t.squares) x \($t.squares) board:",
((place($t.queens; $t.squares)
| select(.)
| printBoard($t.squares))
// "No solution exists."),
""
</syntaxhighlight>
{{output}}
See [[#Wren|Wren]].
 
=={{header|Julia}}==
GUI version, uses the Gtk library. The place! function is condensed from the C# example.
<langsyntaxhighlight lang="julia">using Gtk
 
struct Position
Line 2,052 ⟶ 5,108:
 
peacefulqueenapp()
</syntaxhighlight>
</lang>
 
=={{header|Kotlin}}==
{{trans|D}}
<langsyntaxhighlight lang="scala">import kotlin.math.abs
 
enum class Piece {
Line 2,158 ⟶ 5,214:
}
}
}</langsyntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
Line 2,322 ⟶ 5,378:
◦ • ◦ W ◦ • ◦
W ◦ W W • ◦ • </pre>
 
=={{header|Mathematica}}/{{header|Wolfram Language}}==
<syntaxhighlight lang="mathematica">ClearAll[ValidSpots, VisibleByQueen, SolveQueen, GetSolution]
VisualizeState[state_] := Module[{q, cells},
q = MapIndexed[If[#["q"] == -1, {}, Text[Style[#["q"], 24], #2]] &, state, {2}];
cells = MapIndexed[{If[OddQ[Total[#2]], FaceForm[],
FaceForm[GrayLevel[0.8]]], EdgeForm[Black],
Rectangle[#2 - 0.5, #2 + 0.5]} &, state, {2}];
Graphics[{cells, q}]
]
ValidSpots[state_, tp_Integer] := Module[{vals},
vals = Catenate@MapIndexed[If[#1["q"] == -1 \[And] DeleteCases[#1["v"], tp] == {}, #2, Missing[]] &, state, {2}];
DeleteMissing[vals]
]
VisibleByQueen[{i_, j_}, {a_, b_}] := i == a \[Or] j == b \[Or] i + j == a + b \[Or] i - j == a - b
PlaceQueen[state_, pos : {i_Integer, j_Integer}, tp_Integer] := Module[{vals, out},
out = state;
out[[i, j]] = Association[out[[i, j]], "q" -> tp];
out = MapIndexed[If[VisibleByQueen[{i, j}, #2], <|#1, "v" -> Append[#1["v"], tp]|>, #1] &, out, {2}];
out
]
SolveQueen[state_, toplace_List] :=
Module[{len = Length[toplace], next, valid, newstate},
If[len == 0,
Print[VisualizeState@state];
Print[StringRiffle[StringJoin /@ Map[ToString, state[[All, All, "q"]] /. -1 -> ".", {2}], "\n"]];
Abort[];
,
next = First[toplace];
valid = ValidSpots[state, next];
Do[
newstate = PlaceQueen[state, v, next];
SolveQueen[newstate, Rest[toplace]]
,
{v, valid}
]
]
]
GetSolution[n_Integer?Positive, m_Integer?Positive, numcol_ : 2] :=
Module[{state, tp},
state = ConstantArray[<|"q" -> -1, "v" -> {}|>, {n, n}];
tp = Flatten[Transpose[ConstantArray[#, m] & /@ Range[numcol]]];
SolveQueen[state, tp]
]
GetSolution[8, 4, 3](* Solves placing 3 armies of each 4 queens on an 8*8 board*)
GetSolution[5, 4, 2](* Solves placing 2 armies of each 4 queens on an 5*5 board*)</syntaxhighlight>
{{out}}
<pre>[Graphical object]
1....1..
..2....2
....3...
.3....3.
...1....
1.......
..2....2
....3...
 
[Graphical object]
1...1
..2..
.2.2.
..2..
1...1</pre>
 
=={{header|Nim}}==
Line 2,327 ⟶ 5,446:
Almost a direct translation except for "printBoard" where we have chosen to use a sequence of sequences to simplify the code.
 
<langsyntaxhighlight Nimlang="nim">import sequtils, strformat
 
type
Line 2,400 ⟶ 5,519:
printBoard(n, blackQueens, whiteQueens)
else:
echo "No solution exists.\n"</langsyntaxhighlight>
 
{{out}}
Line 2,569 ⟶ 5,688:
=={{header|Perl}}==
===Terse===
<langsyntaxhighlight lang="perl">use strict;
use warnings;
 
Line 2,587 ⟶ 5,706:
(my $have = tr/WB//) < $m * 2 or exit !print "Solution to $m $n\n\n$_";
place( s/-\G/ qw(W B)[$have % 2] /er ) while /-/g; # place next queen
}</langsyntaxhighlight>
{{out}}
<pre>Solution to 4 5
Line 2,598 ⟶ 5,717:
===Verbose===
A refactored version of the same code, with fancier output.
<langsyntaxhighlight lang="perl">use strict;
use warnings;
use feature 'say';
Line 2,649 ⟶ 5,768:
say $solution
? sprintf "Solution to $m $n\n\n%s", map { s/(.)/$1 /gm; s/B /♛/gm; s/W /♕/gmr } $solution
: "No solution to $m $n";</langsyntaxhighlight>
{{out}}
<pre>Solution to 4 5
Line 2,662 ⟶ 5,781:
{{trans|Go}}
{{trans|Python}}
You can run this online [http://phix.x10.mx/p2js/QueenArmies.htm here].
<lang Phix>-- demo\rosetta\Queen_Armies.exw
<!--<syntaxhighlight lang="phix">(phixonline)-->
string html = ""
<span style="color: #000080;font-style:italic;">--
constant as_html = true
-- demo\rosetta\Queen_Armies.exw
constant queens = {``,
-- =============================
`&#x265b;`,
--</span>
`<font color="green">&#x2655;</font>`,
<span style="color: #008080;">with</span> `<span style="color:red #008080;">?javascript_semantics</span>`}
<span style="color: #7060A8;">requires</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"1.0.2"</span><span style="color: #0000FF;">)</span> <span style="color: #000080;font-style:italic;">-- (puts(fn,x,false) for p2js.js)</span>
 
<span style="color: #004080;">string</span> <span style="color: #000000;">html</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
procedure showboard(integer n, sequence blackqueens, whitequeens)
<span style="color: #008080;">constant</span> <span style="color: #000000;">as_html</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
sequence board = repeat(repeat('-',n),n)
<span style="color: #008080;">constant</span> <span style="color: #000000;">queens</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{</span><span style="color: #008000;">``</span><span style="color: #0000FF;">,</span>
for i=1 to length(blackqueens) do
<span style="color: #008000;">`&#x265b;`</span><span style="color: #0000FF;">,</span>
integer {qi,qj} = blackqueens[i]
<span style="color: #008000;">`&lt;font color="green"&gt;&#x2655;&lt;/font&gt;`</span><span style="color: #0000FF;">,</span>
board[qi,qj] = 'B'
<span style="color: #008000;">`&lt;span style="color:red"&gt;?&lt;/span&gt;`</span><span style="color: #0000FF;">}</span>
{qi,qj} = whitequeens[i]
board[qi,qj] = 'W'
<span style="color: #008080;">procedure</span> <span style="color: #000000;">showboard</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)</span>
end for
<span style="color: #004080;">sequence</span> <span style="color: #000000;">board</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">repeat</span><span style="color: #0000FF;">(</span><span style="color: #008000;">'-'</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">),</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span>
if as_html then
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
string out = sprintf("<br><b>## %d black and %d white queens on a %d-by-%d board</b><br>\n",
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
{length(blackqueens),length(whitequeens),n,n}),
<span style="color: #000000;">board</span><span style="color: #0000FF;">[</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'B'</span>
tbl = ""
<span style="color: #0000FF;">{</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">i</span><span style="color: #0000FF;">]</span>
out &= "<table style=\"font-weight:bold\">\n "
<span style="color: #000000;">board</span><span style="color: #0000FF;">[</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">]</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">'W'</span>
for x=1 to n do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
for y=1 to n do
<span style="color: #008080;">if</span> <span style="color: #000000;">as_html</span> <span style="color: #008080;">then</span>
if y=1 then tbl &= " </tr>\n <tr valign=\"middle\" align=\"center\">\n" end if
<span style="color: #004080;">string</span> <span style="color: #000000;">out</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"&lt;br&gt;&lt;b&gt;## %d black and %d white queens on a %d-by-%d board&lt;/b&gt;&lt;br&gt;\n"</span><span style="color: #0000FF;">,</span>
integer xw = find({x,y},blackqueens)!=0,
<span style="color: #0000FF;">{</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">),</span><span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">),</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">}),</span>
xb = find({x,y},whitequeens)!=0,
<span style="color: #000000;">tbl</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">""</span>
dx = xw+xb*2+1
<span style="color: #000000;">out</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">"&lt;table style=\"font-weight:bold\"&gt;\n "</span>
string ch = queens[dx],
<span style="color: #008080;">for</span> <span style="color: #000000;">x</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
bg = iff(mod(x+y,2)?"":` bgcolor="silver"`)
<span style="color: #008080;">for</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
tbl &= sprintf(" <td style=\"width:14pt; height:14pt;\"%s>%s</td>\n",{bg,ch})
<span style="color: #008080;">if</span> <span style="color: #000000;">y</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">then</span> <span style="color: #000000;">tbl</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" &lt;/tr&gt;\n &lt;tr valign=\"middle\" align=\"center\"&gt;\n"</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #004080;">integer</span> <span style="color: #000000;">xw</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">({</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">},</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span>
end for
<span style="color: #000000;">xb</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">find</span><span style="color: #0000FF;">({</span><span style="color: #000000;">x</span><span style="color: #0000FF;">,</span><span style="color: #000000;">y</span><span style="color: #0000FF;">},</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)!=</span><span style="color: #000000;">0</span><span style="color: #0000FF;">,</span>
out &= tbl[11..$]
<span style="color: #000000;">dx</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">xw</span><span style="color: #0000FF;">+</span><span style="color: #000000;">xb</span><span style="color: #0000FF;">*</span><span style="color: #000000;">2</span><span style="color: #0000FF;">+</span><span style="color: #000000;">1</span>
out &= " </tr>\n</table>\n<br>\n"
<span style="color: #004080;">string</span> <span style="color: #000000;">ch</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">queens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">dx</span><span style="color: #0000FF;">],</span>
html &= out
<span style="color: #000000;">bg</span> <span style="color: #0000FF;">=</span> <span style="color: #008080;">iff</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">mod</span><span style="color: #0000FF;">(</span><span style="color: #000000;">x</span><span style="color: #0000FF;">+</span><span style="color: #000000;">y</span><span style="color: #0000FF;">,</span><span style="color: #000000;">2</span><span style="color: #0000FF;">)?</span><span style="color: #008000;">""</span><span style="color: #0000FF;">:</span><span style="color: #008000;">` bgcolor="silver"`</span><span style="color: #0000FF;">)</span>
else
<span style="color: #000000;">tbl</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">" &lt;td style=\"width:14pt; height:14pt;\"%s&gt;%s&lt;/td&gt;\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">bg</span><span style="color: #0000FF;">,</span><span style="color: #000000;">ch</span><span style="color: #0000FF;">})</span>
integer b = length(blackqueens),
<span style="color: #008080;">end</span> w<span style="color: length(whitequeens)#008080;">for</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
printf(1,"%d black and %d white queens on a %d x %d board:\n", {b, w, n, n})
<span style="color: #000000;">out</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">tbl</span><span style="color: #0000FF;">[</span><span style="color: #000000;">11</span><span style="color: #0000FF;">..$]</span>
puts(1,join(board,"\n")&"\n")
<span style="color: #000000;">out</span> <span style="color: #0000FF;">&=</span> <span style="color: #008000;">" &lt;/tr&gt;\n&lt;/table&gt;\n&lt;br&gt;\n"</span>
-- ?{n,blackqueens, whitequeens}
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #000000;">out</span>
end if
<span style="color: #008080;">else</span>
end procedure
<span style="color: #004080;">integer</span> <span style="color: #000000;">b</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">),</span>
 
<span style="color: #000000;">w</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)</span>
function isAttacking(sequence queen, pos)
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%d black and %d white queens on a %d x %d board:\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">b</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">w</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">})</span>
integer {qi,qj} = queen, {pi,pj} = pos
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #7060A8;">join</span><span style="color: #0000FF;">(</span><span style="color: #000000;">board</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)&</span><span style="color: #008000;">"\n"</span><span style="color: #0000FF;">)</span>
return qi=pi or qj=pj or abs(qi-pi)=abs(qj-pj)
<span style="color: #000080;font-style:italic;">-- ?{n,blackqueens, whitequeens}</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">procedure</span>
function place(integer m, n, sequence blackqueens = {}, whitequeens = {})
if m == 0 then showboard(n,blackqueens,whitequeens) return true end if
<span style="color: #008080;">function</span> <span style="color: #000000;">isAttacking</span><span style="color: #0000FF;">(</span><span style="color: #004080;">sequence</span> <span style="color: #000000;">queen</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">)</span>
bool placingBlack := true
<span style="color: #004080;">integer</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">queen</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">pi</span><span style="color: #0000FF;">,</span><span style="color: #000000;">pj</span><span style="color: #0000FF;">}</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">pos</span>
for i=1 to n do
<span style="color: #008080;">return</span> <span style="color: #000000;">qi</span><span style="color: #0000FF;">=</span><span style="color: #000000;">pi</span> <span style="color: #008080;">or</span> <span style="color: #000000;">qj</span><span style="color: #0000FF;">=</span><span style="color: #000000;">pj</span> <span style="color: #008080;">or</span> <span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qi</span><span style="color: #0000FF;">-</span><span style="color: #000000;">pi</span><span style="color: #0000FF;">)=</span><span style="color: #7060A8;">abs</span><span style="color: #0000FF;">(</span><span style="color: #000000;">qj</span><span style="color: #0000FF;">-</span><span style="color: #000000;">pj</span><span style="color: #0000FF;">)</span>
for j=1 to n do
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
sequence pos := {i, j}
for q=1 to length(blackqueens) do
<span style="color: #008080;">function</span> <span style="color: #000000;">place</span><span style="color: #0000FF;">(</span><span style="color: #004080;">integer</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #004080;">sequence</span> <span style="color: #000000;">blackqueens</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{},</span> <span style="color: #000000;">whitequeens</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{})</span>
sequence queen := blackqueens[q]
<span style="color: #008080;">if</span> <span style="color: #000000;">m</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">0</span> <span style="color: #008080;">then</span> <span style="color: #000000;">showboard</span><span style="color: #0000FF;">(</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">,</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
if queen == pos or ((not placingBlack) and isAttacking(queen, pos)) then
<span style="color: #004080;">bool</span> <span style="color: #000000;">placingBlack</span> <span style="color: #0000FF;">:=</span> <span style="color: #004600;">true</span>
pos = {}
<span style="color: #008080;">for</span> <span style="color: #000000;">i</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
exit
<span style="color: #008080;">for</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span> <span style="color: #008080;">do</span>
end if
<span style="color: #004080;">sequence</span> <span style="color: #000000;">pos</span> <span style="color: #0000FF;">:=</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">i</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">j</span><span style="color: #0000FF;">}</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if pos!={} then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">queen</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">q</span><span style="color: #0000FF;">]</span>
for q=1 to length(whitequeens) do
<span style="color: #008080;">if</span> <span style="color: #000000;">queen</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">pos</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">((</span><span style="color: #008080;">not</span> <span style="color: #000000;">placingBlack</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">and</span> <span style="color: #000000;">isAttacking</span><span style="color: #0000FF;">(</span><span style="color: #000000;">queen</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">then</span>
sequence queen := whitequeens[q]
if queen<span style=="color: #000000;">pos</span> or<span (placingBlackstyle="color: and#0000FF;">=</span> isAttacking(queen,<span pos))style="color: then#0000FF;">{}</span>
<span pos style="color: {}#008080;">exit</span>
<span style="color: #008080;">end</span> <span style="color: exit#008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">!={}</span> <span style="color: #008080;">then</span>
end for
<span style="color: #008080;">for</span> <span style="color: #000000;">q</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #7060A8;">length</span><span style="color: #0000FF;">(</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
if pos!={} then
<span style="color: #004080;">sequence</span> <span style="color: #000000;">queen</span> <span style="color: #0000FF;">:=</span> <span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">q</span><span style="color: #0000FF;">]</span>
if placingBlack then
<span style="color: #008080;">if</span> <span style="color: #000000;">queen</span> <span style="color: #0000FF;">==</span> <span style="color: #000000;">pos</span> <span style="color: #008080;">or</span> <span style="color: #0000FF;">(</span><span style="color: #000000;">placingBlack</span> <span style="color: #008080;">and</span> <span style="color: #000000;">isAttacking</span><span style="color: #0000FF;">(</span><span style="color: #000000;">queen</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">))</span> <span style="color: #008080;">then</span>
blackqueens = append(blackqueens, pos)
<span style="color: #000000;">pos</span> <span style="color: #0000FF;">=</span> <span style="color: #0000FF;">{}</span>
placingBlack = false
else <span style="color: #008080;">exit</span>
<span style="color: #008080;">end</span> whitequeens<span style="color: append(whitequeens, pos)#008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
if place(m-1, n, blackqueens, whitequeens) then return true end if
<span style="color: #008080;">if</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">!={}</span> <span style="color: #008080;">then</span>
blackqueens = blackqueens[1..$-1]
<span style="color: #008080;">if</span> <span style="color: #000000;">placingBlack</span> <span style="color: #008080;">then</span>
whitequeens = whitequeens[1..$-1]
<span style="color: #000000;">blackqueens</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">)</span>
placingBlack = true
<span style="color: #000000;">placingBlack</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">false</span>
end if
end if <span style="color: #008080;">else</span>
<span style="color: #000000;">whitequeens</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">append</span><span style="color: #0000FF;">(</span><span style="color: #7060A8;">deep_copy</span><span style="color: #0000FF;">(</span><span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">),</span> <span style="color: #000000;">pos</span><span style="color: #0000FF;">)</span>
end if
<span style="color: #008080;">if</span> <span style="color: #000000;">place</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">,</span> <span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span> <span style="color: #008080;">return</span> <span style="color: #004600;">true</span> <span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
end for
<span style="color: #000000;">blackqueens</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">blackqueens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
end for
<span style="color: #000000;">whitequeens</span> <span style="color: #0000FF;">=</span> <span style="color: #000000;">whitequeens</span><span style="color: #0000FF;">[</span><span style="color: #000000;">1</span><span style="color: #0000FF;">..$-</span><span style="color: #000000;">1</span><span style="color: #0000FF;">]</span>
return false
<span style="color: #000000;">placingBlack</span> <span style="color: #0000FF;">=</span> <span style="color: #004600;">true</span>
end function
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
 
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for n=2 to 7 do
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
for m=1 to n-(n<5) do
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
if not place(m,n) then
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
string no = sprintf("Cannot place %d+ queen armies on a %d-by-%d board",{m,n,n})
<span style="color: #008080;">return</span> <span style="color: #004600;">false</span>
if as_html then
<span style="color: #008080;">end</span> <span style="color: #008080;">function</span>
html &= sprintf("<b># %s</b><br><br>\n\n",{no})
else
<span style="color: #008080;">for</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">=</span><span style="color: #000000;">2</span> <span style="color: #008080;">to</span> <span style="color: #000000;">7</span> <span style="color: #008080;">do</span>
printf(1,"%s.\n", {no})
<span style="color: #008080;">for</span> <span style="color: #000000;">m</span><span style="color: #0000FF;">=</span><span style="color: #000000;">1</span> <span style="color: #008080;">to</span> <span style="color: #000000;">n</span><span style="color: #0000FF;">-(</span><span style="color: #000000;">n</span><span style="color: #0000FF;"><</span><span style="color: #000000;">5</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">do</span>
end if
<span style="color: #008080;">if</span> <span style="color: #008080;">not</span> <span style="color: #000000;">place</span><span style="color: #0000FF;">(</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">)</span> <span style="color: #008080;">then</span>
end if
<span style="color: #004080;">string</span> <span style="color: #000000;">no</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"Cannot place %d+ queen armies on a %d-by-%d board"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">m</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">,</span><span style="color: #000000;">n</span><span style="color: #0000FF;">})</span>
end for
<span style="color: #008080;">if</span> <span style="color: #000000;">as_html</span> <span style="color: #008080;">then</span>
end for
<span style="color: #000000;">html</span> <span style="color: #0000FF;">&=</span> <span style="color: #7060A8;">sprintf</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"&lt;b&gt;# %s&lt;/b&gt;&lt;br&gt;&lt;br&gt;\n\n"</span><span style="color: #0000FF;">,{</span><span style="color: #000000;">no</span><span style="color: #0000FF;">})</span>
 
<span style="color: #008080;">else</span>
constant html_header = """
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"%s.\n"</span><span style="color: #0000FF;">,</span> <span style="color: #0000FF;">{</span><span style="color: #000000;">no</span><span style="color: #0000FF;">})</span>
<!DOCTYPE html>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<html lang="en">
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<head>
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<meta charset="utf-8" />
<span style="color: #008080;">end</span> <span style="color: #008080;">for</span>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Rosettacode Rank Languages by popularity</title>
<span style="color: #008080;">constant</span> <span style="color: #000000;">html_header</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
</head>
&lt;!DOCTYPE html&gt;
<body>
&lt;html lang="en"&gt;
<h2>queen armies</h2>
&lt;head&gt;
""", -- or <div style="overflow:scroll; height:250px;">
&lt;meta charset="utf-8" /&gt;
html_footer = """
&lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /&gt;
</body>
&lt;title&gt;Queen Armies&lt;/title&gt;
</html>
&lt;/head&gt;
""" -- or </div>
&lt;body&gt;
 
&lt;h2&gt;queen armies&lt;/h2&gt;
if as_html then
"""</span><span style="color: #0000FF;">,</span> <span style="color: #000080;font-style:italic;">-- or &lt;div style="overflow:scroll; height:250px;"&gt;</span>
integer fn = open("queen_armies.html","w")
<span style="color: #000000;">html_footer</span> <span style="color: #0000FF;">=</span> <span style="color: #008000;">"""
puts(fn,html_header)
&lt;/body&gt;
puts(fn,html)
&lt;/html&gt;
puts(fn,html_footer)
"""</span> <span style="color: #000080;font-style:italic;">-- or &lt;/div&gt;</span>
close(fn)
printf(1,"See queen_armies.html\n")
<span style="color: #008080;">if</span> <span style="color: #000000;">as_html</span> <span style="color: #008080;">then</span>
end if
<span style="color: #008080;">if</span> <span style="color: #7060A8;">platform</span><span style="color: #0000FF;">()=</span><span style="color: #004600;">JS</span> <span style="color: #008080;">then</span>
 
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html</span><span style="color: #0000FF;">,</span><span style="color: #004600;">false</span><span style="color: #0000FF;">)</span>
?"done"
<span style="color: #008080;">else</span>
{} = wait_key()</lang>
<span style="color: #004080;">integer</span> <span style="color: #000000;">fn</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">open</span><span style="color: #0000FF;">(</span><span style="color: #008000;">"queen_armies.html"</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"w"</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_header</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">puts</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">,</span><span style="color: #000000;">html_footer</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">close</span><span style="color: #0000FF;">(</span><span style="color: #000000;">fn</span><span style="color: #0000FF;">)</span>
<span style="color: #7060A8;">printf</span><span style="color: #0000FF;">(</span><span style="color: #000000;">1</span><span style="color: #0000FF;">,</span><span style="color: #008000;">"See queen_armies.html\n"</span><span style="color: #0000FF;">)</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #008080;">end</span> <span style="color: #008080;">if</span>
<span style="color: #0000FF;">?</span><span style="color: #008000;">"done"</span>
<span style="color: #0000FF;">{}</span> <span style="color: #0000FF;">=</span> <span style="color: #7060A8;">wait_key</span><span style="color: #0000FF;">()</span>
<!--</syntaxhighlight>-->
{{out}}
with as_html = false
Line 2,907 ⟶ 6,038:
=={{header|Python}}==
===Python: Textual output===
<langsyntaxhighlight lang="python">from itertools import combinations, product, count
from functools import lru_cache, reduce
 
Line 2,980 ⟶ 6,111:
m, n = 5, 7
ans = place(m, n)
pboard(ans, n)</langsyntaxhighlight>
 
{{out}}
Line 3,080 ⟶ 6,211:
===Python: HTML output===
Uses the solver function <code>place</code> from the above textual output case.
<langsyntaxhighlight lang="python">from peaceful_queen_armies_simpler import place
from itertools import product, count
 
Line 3,128 ⟶ 6,259:
html += hboard(ans, n)
with open('peaceful_queen_armies.htm', 'w') as f:
f.write(html)</langsyntaxhighlight>
 
{{out}}
Line 3,722 ⟶ 6,853:
(formerly Perl 6)
{{trans|Perl}}
<syntaxhighlight lang="raku" perl6line># recursively place the next queen
sub place ($board, $n, $m, $empty-square) {
my $cnt;
Line 3,769 ⟶ 6,900:
say $solution
?? "Solution to $m $n\n\n{S:g/(\N)/$0 / with $solution}"
!! "No solution to $m $n";</langsyntaxhighlight>
{{out}}
<pre>W • ◦ • W
Line 3,776 ⟶ 6,907:
• ◦ B ◦ •
W • ◦ • W</pre>
 
=={{header|Ruby}}==
{{trans|Java}}
<syntaxhighlight lang="ruby">class Position
attr_reader :x, :y
 
def initialize(x, y)
@x = x
@y = y
end
 
def ==(other)
self.x == other.x &&
self.y == other.y
end
 
def to_s
'(%d, %d)' % [@x, @y]
end
 
def to_str
to_s
end
end
 
def isAttacking(queen, pos)
return queen.x == pos.x ||
queen.y == pos.y ||
(queen.x - pos.x).abs() == (queen.y - pos.y).abs()
end
 
def place(m, n, blackQueens, whiteQueens)
if m == 0 then
return true
end
placingBlack = true
for i in 0 .. n-1
for j in 0 .. n-1
catch :inner do
pos = Position.new(i, j)
for queen in blackQueens
if pos == queen || !placingBlack && isAttacking(queen, pos) then
throw :inner
end
end
for queen in whiteQueens
if pos == queen || placingBlack && isAttacking(queen, pos) then
throw :inner
end
end
if placingBlack then
blackQueens << pos
placingBlack = false
else
whiteQueens << pos
if place(m - 1, n, blackQueens, whiteQueens) then
return true
end
blackQueens.pop
whiteQueens.pop
placingBlack = true
end
end
end
end
if !placingBlack then
blackQueens.pop
end
return false
end
 
def printBoard(n, blackQueens, whiteQueens)
# initialize the board
board = Array.new(n) { Array.new(n) { ' ' } }
for i in 0 .. n-1
for j in 0 .. n-1
if i % 2 == j % 2 then
board[i][j] = '•'
else
board[i][j] = '◦'
end
end
end
 
# insert the queens
for queen in blackQueens
board[queen.y][queen.x] = 'B'
end
for queen in whiteQueens
board[queen.y][queen.x] = 'W'
end
 
# print the board
for row in board
for cell in row
print cell, ' '
end
print "\n"
end
print "\n"
end
 
nms = [
[2, 1],
[3, 1], [3, 2],
[4, 1], [4, 2], [4, 3],
[5, 1], [5, 2], [5, 3], [5, 4], [5, 5],
[6, 1], [6, 2], [6, 3], [6, 4], [6, 5], [6, 6],
[7, 1], [7, 2], [7, 3], [7, 4], [7, 5], [7, 6], [7, 7]
]
for nm in nms
m = nm[1]
n = nm[0]
print "%d black and %d white queens on a %d x %d board:\n" % [m, m, n, n]
 
blackQueens = []
whiteQueens = []
if place(m, n, blackQueens, whiteQueens) then
printBoard(n, blackQueens, whiteQueens)
else
print "No solution exists.\n\n"
end
end</syntaxhighlight>
{{out}}
<pre>1 black and 1 white queens on a 2 x 2 board:
No solution exists.
 
1 black and 1 white queens on a 3 x 3 board:
B ◦ •
◦ • ◦
• W •
 
2 black and 2 white queens on a 3 x 3 board:
No solution exists.
 
1 black and 1 white queens on a 4 x 4 board:
B ◦ • ◦
◦ • ◦ •
• W • ◦
◦ • ◦ •
 
2 black and 2 white queens on a 4 x 4 board:
B ◦ B ◦
◦ • ◦ •
• W • W
◦ • ◦ •
 
3 black and 3 white queens on a 4 x 4 board:
No solution exists.
 
1 black and 1 white queens on a 5 x 5 board:
B ◦ • ◦ •
◦ • ◦ • ◦
• W • ◦ •
◦ • ◦ • ◦
• ◦ • ◦ •
 
2 black and 2 white queens on a 5 x 5 board:
B ◦ • ◦ •
◦ • W • ◦
• W • ◦ •
◦ • ◦ • ◦
B ◦ • ◦ •
 
3 black and 3 white queens on a 5 x 5 board:
B ◦ • ◦ •
◦ • W • W
• W • ◦ •
◦ • ◦ B ◦
B ◦ • ◦ •
 
4 black and 4 white queens on a 5 x 5 board:
• ◦ W ◦ W
B • ◦ • ◦
• ◦ W ◦ W
B • ◦ • ◦
• B • B •
 
5 black and 5 white queens on a 5 x 5 board:
No solution exists.
 
1 black and 1 white queens on a 6 x 6 board:
B ◦ • ◦ • ◦
◦ • ◦ • ◦ •
• W • ◦ • ◦
◦ • ◦ • ◦ •
• ◦ • ◦ • ◦
◦ • ◦ • ◦ •
 
2 black and 2 white queens on a 6 x 6 board:
B ◦ • ◦ • ◦
◦ • W • ◦ •
• W • ◦ • ◦
◦ • ◦ • ◦ •
B ◦ • ◦ • ◦
◦ • ◦ • ◦ •
 
3 black and 3 white queens on a 6 x 6 board:
B ◦ • ◦ • ◦
◦ • W • ◦ •
• W • ◦ W ◦
◦ • ◦ • ◦ •
B ◦ • ◦ • ◦
B • ◦ • ◦ •
 
4 black and 4 white queens on a 6 x 6 board:
B ◦ • ◦ • ◦
◦ • W • ◦ •
• W • ◦ W ◦
◦ • ◦ • W •
B ◦ • ◦ • ◦
B • ◦ B ◦ •
 
5 black and 5 white queens on a 6 x 6 board:
• ◦ W W • W
B • ◦ • ◦ •
• ◦ • W • W
◦ B ◦ • ◦ •
B ◦ • ◦ • ◦
◦ B ◦ • B •
 
6 black and 6 white queens on a 6 x 6 board:
No solution exists.
 
1 black and 1 white queens on a 7 x 7 board:
B ◦ • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• ◦ • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• ◦ • ◦ • ◦ •
 
2 black and 2 white queens on a 7 x 7 board:
B ◦ • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
B ◦ • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • ◦ • ◦ •
 
3 black and 3 white queens on a 7 x 7 board:
B ◦ B ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • W • ◦ •
◦ • ◦ • ◦ • ◦
B ◦ • ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • ◦ • ◦ •
 
4 black and 4 white queens on a 7 x 7 board:
B ◦ B ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • W • ◦ •
◦ • ◦ • ◦ • ◦
B ◦ B ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • W • ◦ •
 
5 black and 5 white queens on a 7 x 7 board:
B ◦ B ◦ B ◦ •
◦ • ◦ • ◦ • ◦
• W • W • W •
◦ • ◦ • ◦ • ◦
B ◦ B ◦ • ◦ •
◦ • ◦ • ◦ • ◦
• W • W • ◦ •
 
6 black and 6 white queens on a 7 x 7 board:
B ◦ B ◦ B ◦ •
◦ • ◦ • ◦ • ◦
• W • W • W •
◦ • ◦ • ◦ • ◦
B ◦ B ◦ B ◦ •
◦ • ◦ • ◦ • ◦
• W • W • W •
 
7 black and 7 white queens on a 7 x 7 board:
• ◦ • ◦ W ◦ W
B B B • ◦ • ◦
• ◦ • ◦ W ◦ W
◦ • ◦ • ◦ W W
• B • B • ◦ •
B • B • ◦ • ◦
• ◦ • ◦ W ◦ •</pre>
 
=={{header|Scheme}}==
===All solutions===
{{works with|CHICKEN|5.3.0}}
{{libheader|srfi-132}}
 
<syntaxhighlight lang="scheme">;;;
;;; Solutions to the Peaceful Chess Queen Armies puzzle, in R7RS
;;; Scheme (using also SRFI-132).
;;;
;;; https://rosettacode.org/wiki/Peaceful_chess_queen_armies
;;;
 
(cond-expand
(r7rs)
(chicken (import (r7rs))))
 
(import (scheme process-context))
(import (only (srfi 132) list-sort))
 
(define-record-type <&fail>
(make-the-one-unique-&fail-that-you-must-not-make-twice)
do-not-use-this:&fail?)
 
(define &fail
(make-the-one-unique-&fail-that-you-must-not-make-twice))
 
(define (failure? f)
(eq? f &fail))
 
(define (success? f)
(not (failure? f)))
 
(define *suspend*
(make-parameter (lambda (x) x)))
 
(define (suspend v)
((*suspend*) v))
 
(define (fail-forever)
(let loop ()
(suspend &fail)
(loop)))
 
(define (make-generator-procedure thunk)
;;
;; Make a suspendable procedure that takes no arguments. It is a
;; simple generator of values. (One can elaborate on this to have
;; the procedure accept an argument upon resumption, like an Icon
;; co-expression.)
;;
(define (next-run return)
(define (my-suspend v)
(set! return
(call/cc
(lambda (resumption-point)
(set! next-run resumption-point)
(return v)))))
(parameterize ((*suspend* my-suspend))
(suspend (thunk))
(fail-forever)))
(lambda ()
(call/cc next-run)))
 
(define BLACK 'B)
(define WHITE 'W)
 
(define (flip-color c)
(if (eq? c BLACK) WHITE BLACK))
 
(define-record-type <queen>
(make-queen color rank file)
queen?
(color queen-color)
(rank queen-rank)
(file queen-file))
 
(define (serialize-queen queen)
(string-append (if (eq? (queen-color queen) BLACK) "B" "W")
"(" (number->string (queen-rank queen))
"," (number->string (queen-file queen)) ")"))
 
(define (serialize-queens queens)
(apply string-append
(list-sort string<? (map serialize-queen queens))))
 
(define (queens->string n queens)
 
(define board
(let ((board (make-vector (* n n) #f)))
(do ((q queens (cdr q)))
((null? q))
(let* ((color (queen-color (car q)))
(i (queen-rank (car q)))
(j (queen-file (car q))))
(vector-set! board (ij->index n i j) color)))
board))
 
(define rule
(let ((str "+"))
(do ((j 1 (+ j 1)))
((= j (+ n 1)))
(set! str (string-append str "----+")))
str))
 
(define str "")
 
(when (< 0 n)
(set! str rule)
(do ((i n (- i 1)))
((= i 0))
(set! str (string-append str "\n"))
(do ((j 1 (+ j 1)))
((= j (+ n 1)))
(let* ((color (vector-ref board (ij->index n i j)))
(representation
(cond ((eq? color #f) " ")
((eq? color BLACK) " B ")
((eq? color WHITE) " W ")
(else " ?? "))))
(set! str (string-append str "|" representation))))
(set! str (string-append str "|\n" rule))))
str)
 
(define (queen-fits-in? queen other-queens)
(or (null? other-queens)
(let ((other (car other-queens)))
(let ((colorq (queen-color queen))
(rankq (queen-rank queen))
(fileq (queen-file queen))
(coloro (queen-color other))
(ranko (queen-rank other))
(fileo (queen-file other)))
(if (eq? colorq coloro)
(and (or (not (= rankq ranko))
(not (= fileq fileo)))
(queen-fits-in? queen (cdr other-queens)))
(and (not (= rankq ranko))
(not (= fileq fileo))
(not (= (+ rankq fileq) (+ ranko fileo)))
(not (= (- rankq fileq) (- ranko fileo)))
(queen-fits-in? queen (cdr other-queens))))))))
 
(define (latest-queen-fits-in? queens)
(or (null? (cdr queens))
(queen-fits-in? (car queens) (cdr queens))))
 
(define (make-peaceful-queens-generator m n)
(make-generator-procedure
(lambda ()
(define solutions '())
 
(let loop ((queens (list (make-queen BLACK 1 1)))
(num-queens 1))
 
(define (add-another-queen)
(let ((color (flip-color (queen-color (car queens)))))
(loop (cons (make-queen color 1 1) queens)
(+ num-queens 1))))
 
(define (move-a-queen)
(let drop-one ((queens queens)
(num-queens num-queens))
(if (zero? num-queens)
(loop '() 0)
(let* ((latest (car queens))
(color (queen-color latest))
(rank (queen-rank latest))
(file (queen-file latest)))
(if (and (= rank n) (= file n))
(drop-one (cdr queens) (- num-queens 1))
(let-values (((rank^ file^)
(advance-ij n rank file)))
(loop (cons (make-queen color rank^ file^)
(cdr queens))
num-queens)))))))
 
(cond ((zero? num-queens)
;; There are no more solutions.
&fail)
 
((latest-queen-fits-in? queens)
(if (= num-queens (* 2 m))
(let ((str (serialize-queens queens)))
;; The current "queens" is a solution.
(unless (member str solutions)
;; The current "queens" is a *new* solution.
(set! solutions (cons str solutions))
(suspend queens))
(move-a-queen))
(add-another-queen)))
 
(else
(move-a-queen)))))))
 
(define (ij->index n i j)
(let ((i1 (- i 1))
(j1 (- j 1)))
(+ i1 (* n j1))))
 
(define (index->ij n index)
(let-values (((q r) (floor/ index n)))
(values (+ r 1) (+ q 1))))
 
(define (advance-ij n i j)
(index->ij n (+ (ij->index n i j) 1)))
 
(define args (command-line))
(unless (or (= (length args) 3)
(= (length args) 4))
(display "Usage: ")
(display (list-ref args 0))
(display " M N [MAX_SOLUTIONS]")
(newline)
(exit 1))
(define m (string->number (list-ref args 1)))
(define n (string->number (list-ref args 2)))
(define max-solutions
(if (= (length args) 4)
(string->number (list-ref args 3))
+inf.0))
 
(define generate-peaceful-queens
(make-peaceful-queens-generator m n))
 
(let loop ((next-solution-number 1))
(when (<= next-solution-number max-solutions)
(let ((solution (generate-peaceful-queens)))
(when (success? solution)
(display "Solution ")
(display next-solution-number)
(newline)
(display (queens->string n solution))
(newline)
(newline)
(loop (+ next-solution-number 1))))))</syntaxhighlight>
 
{{out}}
$ csc -O3 peaceful_queens.scm && ./peaceful_queens 4 5
<pre style="height: 25em; overflow: scroll">Solution 1
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
Solution 2
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
Solution 3
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
Solution 4
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
Solution 5
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
 
Solution 6
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
 
Solution 7
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | | W | | W |
+----+----+----+----+----+
| B | | | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
 
Solution 8
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
 
Solution 9
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
 
Solution 10
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
 
Solution 11
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
 
Solution 12
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
 
Solution 13
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
 
Solution 14
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
| | | B | | |
+----+----+----+----+----+
| W | | | | W |
+----+----+----+----+----+
 
Solution 15
+----+----+----+----+----+
| | B | | B | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
| | | | | B |
+----+----+----+----+----+
| W | | W | | |
+----+----+----+----+----+
 
Solution 16
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
 
Solution 17
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
 
Solution 18
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | | B | | B |
+----+----+----+----+----+
| W | | | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
</pre>
 
===All non-equivalent solutions===
{{works with|CHICKEN|5.3.0}}
<syntaxhighlight lang="scheme">;;;
;;; Solutions to the Peaceful Chess Queen Armies puzzle, in R7RS
;;; Scheme. This implementation returns only one of each equivalent
;;; solution. See https://oeis.org/A260680
;;;
;;; I weed out equivalent solutions by comparing them tediously
;;; against solutions already found.
;;;
;;; (At least when compiled with CHICKEN 5.3.0, this program gets kind
;;; of slow for m=5, n=6, once you get past having found the 35
;;; non-equivalent solutions. There are still other, equivalent
;;; solutions to eliminate.)
;;;
;;; https://rosettacode.org/wiki/Peaceful_chess_queen_armies
;;;
 
(cond-expand
(r7rs)
(chicken (import (r7rs))))
 
(import (scheme process-context))
 
(define-record-type <&fail>
(make-the-one-unique-&fail-that-you-must-not-make-twice)
do-not-use-this:&fail?)
 
(define &fail
(make-the-one-unique-&fail-that-you-must-not-make-twice))
 
(define (failure? f)
(eq? f &fail))
 
(define (success? f)
(not (failure? f)))
 
(define *suspend*
(make-parameter (lambda (x) x)))
 
(define (suspend v)
((*suspend*) v))
 
(define (fail-forever)
(let loop ()
(suspend &fail)
(loop)))
 
(define (make-generator-procedure thunk)
;;
;; Make a suspendable procedure that takes no arguments. It is a
;; simple generator of values. (One can elaborate on this to have
;; the procedure accept an argument upon resumption, like an Icon
;; co-expression.)
;;
(define (next-run return)
(define (my-suspend v)
(set! return
(call/cc
(lambda (resumption-point)
(set! next-run resumption-point)
(return v)))))
(parameterize ((*suspend* my-suspend))
(suspend (thunk))
(fail-forever)))
(lambda ()
(call/cc next-run)))
 
(define (isqrt m)
;; Integer Newton’s method. See
;; https://en.wikipedia.org/w/index.php?title=Integer_square_root&oldid=1074473475#Using_only_integer_division
(let ((k (truncate-quotient m 2)))
(if (zero? k)
m
(let loop ((k k)
(k^ (truncate-quotient
(+ k (truncate-quotient m k)) 2)))
(if (< k^ k)
(loop k^ (truncate-quotient
(+ k^ (truncate-quotient m k^)) 2))
k)))))
 
(define (ij->index n i j)
(let ((i1 (- i 1))
(j1 (- j 1)))
(+ i1 (* n j1))))
 
(define (index->ij n index)
(let-values (((q r) (floor/ index n)))
(values (+ r 1) (+ q 1))))
 
(define (advance-ij n i j)
(index->ij n (+ (ij->index n i j) 1)))
 
(define (index-rotate90 n index)
(let-values (((i j) (index->ij n index)))
(ij->index n (- n j -1) i)))
 
(define (index-rotate180 n index)
(let-values (((i j) (index->ij n index)))
(ij->index n (- n i -1) (- n j -1))))
 
(define (index-rotate270 n index)
(let-values (((i j) (index->ij n index)))
(ij->index n j (- n i -1))))
 
(define (index-reflecti n index)
(let-values (((i j) (index->ij n index)))
(ij->index n (- n i -1) j)))
 
(define (index-reflectj n index)
(let-values (((i j) (index->ij n index)))
(ij->index n i (- n j -1))))
 
(define (index-reflect-diag-down n index)
(let-values (((i j) (index->ij n index)))
(ij->index n j i)))
 
(define (index-reflect-diag-up n index)
(let-values (((i j) (index->ij n index)))
(ij->index n (- n j -1) (- n i -1))))
 
(define BLACK 'B)
(define WHITE 'W)
 
(define (reverse-color c)
(cond ((eq? c WHITE) BLACK)
((eq? c BLACK) WHITE)
(else c)))
 
(define (pick-color-adjuster c)
(if (eq? c WHITE)
reverse-color
(lambda (x) x)))
 
(define-record-type <queen>
(make-queen color rank file)
queen?
(color queen-color)
(rank queen-rank)
(file queen-file))
 
(define (queens->board queens)
(let ((board (make-vector (* n n) #f)))
(do ((q queens (cdr q)))
((null? q))
(let* ((color (queen-color (car q)))
(i (queen-rank (car q)))
(j (queen-file (car q))))
(vector-set! board (ij->index n i j) color)))
board))
 
(define-syntax board-partial-equiv?
(syntax-rules ()
((_ board1 board2 n*n n reindex recolor)
(let loop ((i 0))
(or (= i n*n)
(let ((color1 (vector-ref board1 i))
(color2 (recolor (vector-ref board2 (reindex n i)))))
(and (eq? color1 color2)
(loop (+ i 1)))))))))
 
(define (board-equiv? board1 board2)
(define (identity x) x)
(define (2nd-argument n i) i)
(let ((n*n (vector-length board1)))
(or (board-partial-equiv? board1 board2 n*n #f
2nd-argument identity)
(board-partial-equiv? board1 board2 n*n #f
2nd-argument reverse-color)
(let ((n (isqrt n*n)))
(or (board-partial-equiv? board1 board2 n*n n
index-rotate90
identity)
(board-partial-equiv? board1 board2 n*n n
index-rotate90
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-rotate180
identity)
(board-partial-equiv? board1 board2 n*n n
index-rotate180
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-rotate270
identity)
(board-partial-equiv? board1 board2 n*n n
index-rotate270
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-reflecti
identity)
(board-partial-equiv? board1 board2 n*n n
index-reflecti
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-reflectj
identity)
(board-partial-equiv? board1 board2 n*n n
index-reflectj
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-reflect-diag-down
identity)
(board-partial-equiv? board1 board2 n*n n
index-reflect-diag-down
reverse-color)
(board-partial-equiv? board1 board2 n*n n
index-reflect-diag-up
identity)
(board-partial-equiv? board1 board2 n*n n
index-reflect-diag-up
reverse-color) )))))
 
(define (queens->string n queens)
 
(define board (queens->board queens))
 
(define rule
(let ((str "+"))
(do ((j 1 (+ j 1)))
((= j (+ n 1)))
(set! str (string-append str "----+")))
str))
 
(define str "")
 
(when (< 0 n)
(set! str rule)
(do ((i n (- i 1)))
((= i 0))
(set! str (string-append str "\n"))
(do ((j 1 (+ j 1)))
((= j (+ n 1)))
(let* ((color (vector-ref board (ij->index n i j)))
(representation
(cond ((eq? color #f) " ")
((eq? color BLACK) " B ")
((eq? color WHITE) " W ")
(else " ?? "))))
(set! str (string-append str "|" representation))))
(set! str (string-append str "|\n" rule))))
str)
 
(define (queen-fits-in? queen other-queens)
(or (null? other-queens)
(let ((other (car other-queens)))
(let ((colorq (queen-color queen))
(rankq (queen-rank queen))
(fileq (queen-file queen))
(coloro (queen-color other))
(ranko (queen-rank other))
(fileo (queen-file other)))
(if (eq? colorq coloro)
(and (or (not (= rankq ranko))
(not (= fileq fileo)))
(queen-fits-in? queen (cdr other-queens)))
(and (not (= rankq ranko))
(not (= fileq fileo))
(not (= (+ rankq fileq) (+ ranko fileo)))
(not (= (- rankq fileq) (- ranko fileo)))
(queen-fits-in? queen (cdr other-queens))))))))
 
(define (latest-queen-fits-in? queens)
(or (null? (cdr queens))
(queen-fits-in? (car queens) (cdr queens))))
 
(define (make-peaceful-queens-generator m n)
(make-generator-procedure
(lambda ()
(define solutions '())
 
(let loop ((queens (list (make-queen BLACK 1 1)))
(num-queens 1))
 
(define (add-another-queen)
(let ((color (reverse-color (queen-color (car queens)))))
(loop (cons (make-queen color 1 1) queens)
(+ num-queens 1))))
 
(define (move-a-queen)
(let drop-one ((queens queens)
(num-queens num-queens))
(if (zero? num-queens)
(loop '() 0)
(let* ((latest (car queens))
(color (queen-color latest))
(rank (queen-rank latest))
(file (queen-file latest)))
(if (and (= rank n) (= file n))
(drop-one (cdr queens) (- num-queens 1))
(let-values (((rank^ file^)
(advance-ij n rank file)))
(loop (cons (make-queen color rank^ file^)
(cdr queens))
num-queens)))))))
 
(cond ((zero? num-queens)
;; There are no more solutions.
&fail)
 
((latest-queen-fits-in? queens)
(if (= num-queens (* 2 m))
(let ((board (queens->board queens)))
;; The current "queens" is a solution.
(unless (member board solutions board-equiv?)
;; The current "queens" is a *new* solution.
(set! solutions (cons board solutions))
(suspend queens))
(move-a-queen))
(add-another-queen)))
 
(else
(move-a-queen)))))))
 
(define args (command-line))
(unless (or (= (length args) 3)
(= (length args) 4))
(display "Usage: ")
(display (list-ref args 0))
(display " M N [MAX_SOLUTIONS]")
(newline)
(exit 1))
(define m (string->number (list-ref args 1)))
(define n (string->number (list-ref args 2)))
(define max-solutions
(if (= (length args) 4)
(string->number (list-ref args 3))
+inf.0))
 
(define generate-peaceful-queens
(make-peaceful-queens-generator m n))
 
(let loop ((next-solution-number 1))
(when (<= next-solution-number max-solutions)
(let ((solution (generate-peaceful-queens)))
(when (success? solution)
(display "Solution ")
(display next-solution-number)
(newline)
(display (queens->string n solution))
(newline)
(newline)
(loop (+ next-solution-number 1))))))</syntaxhighlight>
 
{{out}}
$ csc -O5 peaceful_queens2.scm && ./peaceful_queens2 4 5
<pre>Solution 1
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | W | | |
+----+----+----+----+----+
| B | | | | B |
+----+----+----+----+----+
 
Solution 2
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
 
Solution 3
+----+----+----+----+----+
| | W | | W | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
| | | | | W |
+----+----+----+----+----+
| B | | B | | |
+----+----+----+----+----+
</pre>
 
=={{header|Swift}}==
Line 3,781 ⟶ 8,058:
{{trans|Kotlin}}
 
<langsyntaxhighlight lang="swift">enum Piece {
case empty, black, white
}
Line 3,889 ⟶ 8,166:
print("No solution")
}
}</langsyntaxhighlight>
 
{{out}}
Line 4,054 ⟶ 8,331:
{{trans|Kotlin}}
{{libheader|Wren-dynamic}}
<langsyntaxhighlight ecmascriptlang="wren">import "./dynamic" for Enum, Tuple
 
var Piece = Enum.create("Piece", ["empty", "black", "white"])
Line 4,146 ⟶ 8,423:
System.print("No solution exists.\n")
}
}</langsyntaxhighlight>
 
{{out}}
Line 4,154 ⟶ 8,431:
 
=={{header|zkl}}==
<langsyntaxhighlight lang="zkl">fcn isAttacked(q, x,y) // ( (r,c), x,y ) : is queen at r,c attacked by q@(x,y)?
{ r,c:=q; (r==x or c==y or r+c==x+y or r-c==x-y) }
fcn isSafe(r,c,qs) // queen safe at (r,c)?, qs=( (r,c),(r,c)..)
Line 4,186 ⟶ 8,463:
z.text.pump(Void,T(Void.Read,N-1),"println");
}
}</langsyntaxhighlight>
<langsyntaxhighlight lang="zkl">peacefulQueens();
foreach n in ([4..10]){ peacefulQueens(n,n) }</langsyntaxhighlight>
{{out}}
<pre>
2,442

edits