Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save SergiuB/c4a74e999c58185c4257 to your computer and use it in GitHub Desktop.
Save SergiuB/c4a74e999c58185c4257 to your computer and use it in GitHub Desktop.
Functional backtracking: eight queens
let allQueensSet = state => state.length == 8
let not = fn => (x) => !fn(x)
let lastNotUniq = R.converge(R.contains, [R.last, R.init])
let findIndexed = R.addIndex(R.findIndex)
let areDiagonal = (x1, y1, x2, y2) => Math.abs(x1-x2) === Math.abs(y1-y2)
let diagonalConflict = (x, arr) => -1 !== findIndexed(areDiagonal.bind(null, x, arr.length), arr)
let lastHasDiagonalConflict = R.converge(diagonalConflict,[R.last, R.init])
let queensConflict = R.anyPass([lastNotUniq, lastHasDiagonalConflict])
let queenOnNextLineEachColumn = state => R.map(col => ([...state, col]), R.times(R.identity, 8))
let eightQueensProblemSolver = backtracking({
isSolution: allQueensSet,
notValid: queensConflict,
nextStates: queenOnNextLineEachColumn,
initialState: [],
})
for (let solution of eightQueensProblemSolver()) {
console.log(solution)
}
<script src="https://cdnjs.cloudflare.com/ajax/libs/babel-polyfill/6.6.1/polyfill.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.19.1/ramda.js"></script>
<script src="http://codepen.io/sergiub/pen/wGKXpj"></script>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment