Published
Edited
Nov 16, 2020
9 stars
Insert cell
Insert cell
Insert cell

function place_queen(queens = [], depth = 0) {

// #---------------------------------------------------------------------------
// # If there are 8 queens placed, then this must be a solution.
// #---------------------------------------------------------------------------
// if (length(queens) == 8) {
// return(list(queens))
// }
if (queens.length == 8) {
// had to return this as an object, so that it didn't get flattened by .flat() later
// had to return a length property so that filter(_=>_.length) does not exclude these:
let result = { solution: queens, length: queens.length };
return result;
}

// #---------------------------------------------------------------------------
// # Figure out where a queen can be placed in the next row.
// # Drop all columns that have already been taken - since we
// # can't place a queen below an existing queen
// #---------------------------------------------------------------------------
// possible_placements <- setdiff(1:8, queens)
let possible_placements = setdiff(d3.range(1, 8+1), queens);

// #---------------------------------------------------------------------------
// # For each queen already on the board, find the diagonal
// # positions that it can see in this row.
// #---------------------------------------------------------------------------
// diag_offsets <- seq.int(length(queens), 1)
// diags <- c(queens + diag_offsets, queens - diag_offsets)
// diags <- diags[diags > 0 & diags < 9]
let diag_offsets = d3.range(queens.length, 0, -1); //.reverse() //queens.length, 1)
let diags = [].concat(addel(queens, diag_offsets)).concat(addel(queens, diag_offsets, -1));
diags = diags.filter(diag => diag > 0 && diag < 9)

// #---------------------------------------------------------------------------
// # Drop these diagonal columns from possible placements
// #---------------------------------------------------------------------------
// possible_placements <- setdiff(possible_placements, diags)
possible_placements = possible_placements.filter(x => !diags.includes(x))

// #---------------------------------------------------------------------------
// # For each possible placement, try and place a queen
// #---------------------------------------------------------------------------
// possible_placements %>%
// map(~place_queen(c(queens, .x))) %>%
// keep(~length(.x) > 0) %>%
// flatten()
return possible_placements
.map(placement => place_queen([].concat(queens).concat([placement]), depth + 1))
.filter(_ => _.length)
.flat();

}
Insert cell
Insert cell
{
// library(tidyverse)
// v=1:8
// f=function(q){L=length(q)
// if(L==8){q}else{flatten(map(setdiff(v,c(q,q+L:1,q-L:1)),~f(c(q,.))))}}
let at=8,
f = (q)=>{let L=q.length, v=d3.range(1,at+1), d=d3.range(L, 0, -1);
return L==at ? (q):(setdiff(v, [].concat(q, addel(q, d), addel(q,d.map(_=>-_)))).map(_=>f([].concat(q, _))).flat())
}
// s=data.frame(c=unlist(f(c())),r=v,x=rep(1:92,e=8),z=3)
// b=mutate(crossing(c=v,r=v),z=(c+r)%%2)
// g=geom_tile
// ggplot(s,aes(r,c,fill=z))+g(d=b)+g()+facet_wrap(~x)
let fs=f([]);
return Promise.all(d3.range(1, fs.length+1, at).map(st=>chibi({l:8, wpx:60, bpx: -1, qsol: fs.slice(st-1, st-1+at), txtclr: 'transparent'})))
.then(cbs=> html`
${ cbs.map((cb,cb_index)=>`<div style="float:left;margin:4px 10px">${cb.outerHTML}<label style="text-align:center;display:block;">${cb_index+1}</label></div>`)}
<div style="clear:both"></div>
`)
}
Insert cell
Insert cell
Insert cell
Insert cell
Insert cell
d3 = require('d3')
Insert cell
import { chessboard } from '@harrislapiroff/chessboard'
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more