RosettaCodeData/Task/N-queens-problem/Sparkling/n-queens-problem.sparkling
2016-12-05 23:44:36 +01:00

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));