54 lines
1.1 KiB
Text
54 lines
1.1 KiB
Text
let print_table = function (pos) {
|
|
pos.foreach(function (_, i) {
|
|
stdout.printf(" %c", 'a' + i);
|
|
});
|
|
|
|
stdout.write("\n");
|
|
|
|
pos.foreach(function (col, row) {
|
|
stdout.printf("%d", row + 1);
|
|
stdout.printf("%s #\n", range(col).reduce("", function (s, t) {
|
|
return s .. " ";
|
|
}));
|
|
});
|
|
|
|
stdout.write("\n\n");
|
|
};
|
|
|
|
let threatens = function (row_a, col_a, row_b, col_b) {
|
|
return row_a == row_b
|
|
or col_a == col_b
|
|
or abs(row_a - row_b) == abs(col_a - col_b);
|
|
};
|
|
|
|
let good = function(pos, end_idx) {
|
|
return pos.all(function (col_a, row_a) {
|
|
return range(row_a + 1, end_idx).all(function (row_b) {
|
|
let col_b = pos[row_b];
|
|
return not threatens(row_a, col_a, row_b, col_b);
|
|
});
|
|
});
|
|
};
|
|
|
|
// Returns number of solutions
|
|
let n_queens = function (pos, index) {
|
|
if index >= pos.length {
|
|
if good(pos, index) {
|
|
print_table(pos);
|
|
return 1;
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
if not good(pos, index) {
|
|
return 0;
|
|
}
|
|
|
|
return pos.map(function (_, col) {
|
|
pos[index] = col;
|
|
return n_queens(pos, index + 1);
|
|
}).reduce(0, function (a, b) { return a + b; });
|
|
};
|
|
|
|
stdout.printf("%d solutions\n", n_queens(range(8), 0));
|