AI generated chess picture

AI generated chess picture

updated on March 3: added some explanations on how the code works.

Last week, or was it the week before that, I read on LinkedIn about a well-known problem: the 8-queens. You have to place 8 queens on a chess board, in positions where no queen can capture another one.

After a quick thinking, I determined that the simplest method was likely through a recursion, and I started coding it in Go.

Some obvious considerations:

  • there can only be one queen per row, and one per column
  • there can only be one queen per diagonal

So the recursion works this way:

  • start from row 0 column 0 (considering a 0-based 8x8 array)
  • if position is empty (value 0), mark the position with a 1 and mark all positions that can’t be used anymore with -1,
  • if position is either 1 or 0, go back to previous row, next column, if possible
  • then iterate to next row, column 0 (recursion)
  • if we reached last row (7), then we’re done, show result, go back to next column of previous row
  • iterate with next column

With this method, if no position in a row works, we won’t go down the other rows, whih saves time and effort. Also, the method must clean the table and redraw current state, each time we do another attempt, so we need to store the current position to do the redraws (queens and unavailable positions)

After a few bugs and some troubleshooting (mostly related to the cleaning/redraw process) , I eventually got some code running that gave me the 92 possible positions for the queens, in 3.9 ms, without any optimization and no representation of the results, just the count of results.

A very slightly modified version showed the results in a simple graphical way.

The code:

package main

import "fmt"

var (
	board   [8][8]int
	queens  [8]int
	counter int
)

func main() {
	for c := range 8 {
		clean(0)
		choose(0, c)
	}
	fmt.Println(counter)
}

func choose(r int, c int) {
	if board[r][c] == 0 {
		setQueen(r, c)
	} else {
		return
	}
	if r < 7 {
		for i := range 8 {
			clean(r + 1)
			choose(r+1, i)
		}
	} else {
		counter++
		//display()
		return
	}
}

func clean(q int) {
	for r := range 8 {
		for c := range 8 {
			board[r][c] = 0
		}
	}
	for r := range q {
		setQueen(r, queens[r])
	}
}

func setQueen(r int, c int) {
	board[r][c] = 1
	for i := range 8 {
		if i != c {
			board[r][i] = -1
		}
		if i != r {
			board[i][c] = -1
		}
		if r-i >= 0 && c-i >= 0 && board[r-i][c-i] == 0 {
			board[r-i][c-i] = -1
		}
		if r+i < 8 && c+i < 8 && board[r+i][c+i] == 0 {
			board[r+i][c+i] = -1
		}
		if r-i >= 0 && c+i < 8 && board[r-i][c+i] == 0 {
			board[r-i][c+i] = -1
		}
		if r+i < 8 && c-i >= 0 && board[r+i][c-i] == 0 {
			board[r+i][c-i] = -1
		}
	}
	queens[r] = c
}

func display() {
	var x rune
	fmt.Printf("  ")
	for ic := range 8 {
		fmt.Printf("%d ", ic+1)
	}
	fmt.Println()
	for ir, r := range board {
		fmt.Printf("%d ", ir+1)
		for _, c := range r {
			if c == 1 {
				x = 'o'
			} else if c == 0 {
				x = ' '
			} else {
				x = '·'
			}
			fmt.Printf("%c ", x)
		}
		fmt.Println()
	}
	fmt.Println()
}

The result:

% go build
% ./main
92
% hyperfine ./main
Benchmark 1: ./main
  Time (mean ± σ):       3.9 ms ±   0.4 ms    [User: 3.4 ms, System: 0.4 ms]
  Range (min … max):     3.5 ms …   8.9 ms    262 runs
 
  Warning: Command took less than 5 ms to complete. Note that the results might be inaccurate because hyperfine can not calibrate the shell startup time much more precise than this limit. You can try to use the `-N`/`--shell=none` option to disable the shell completely.
  Warning: The first benchmarking run for this command was significantly slower than the rest (8.9 ms). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run.

Uncommenting the //display() section, we can see the 92 results:

% ./main
  1 2 3 4 5 6 7 8 
1 o · · · · · · · 
2 · · · · o · · · 
3 · · · · · · · o 
4 · · · · · o · · 
5 · · o · · · · · 
6 · · · · · · o · 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 o · · · · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 · · o · · · · · 
5 · · · · · · o · 
6 · · · o · · · · 
7 · o · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 o · · · · · · · 
2 · · · · · · o · 
3 · · · o · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · · o · · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 o · · · · · · · 
2 · · · · · · o · 
3 · · · · o · · · 
4 · · · · · · · o 
5 · o · · · · · · 
6 · · · o · · · · 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · o · · · · 
3 · · · · · o · · 
4 · · · · · · · o 
5 · · o · · · · · 
6 o · · · · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · o · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · o · · · 
3 · · · · · · o · 
4 · · · o · · · · 
5 o · · · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · · o · · 
3 o · · · · · · · 
4 · · · · · · o · 
5 · · · o · · · · 
6 · · · · · · · o 
7 · · o · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · o · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · · · o · 
3 · · o · · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 o · · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · · · o · 
3 · · · · o · · · 
4 · · · · · · · o 
5 o · · · · · · · 
6 · · · o · · · · 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · o · · · · · · 
2 · · · · · · · o 
3 · · · · · o · · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · o · · · 
7 · · · · · · o · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 o · · · · · · · 
3 · · · · · · o · 
4 · · · · o · · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · o · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · o · · · 
3 · o · · · · · · 
4 · · · · · · · o 
5 o · · · · · · · 
6 · · · · · · o · 
7 · · · o · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · o · · · 
3 · o · · · · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 · · · o · · · · 
7 · · · · · · o · 
8 o · · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · o · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · · o · · · · 
6 · o · · · · · · 
7 · · · · · · · o 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · o · · · 
3 · · · · · · · o 
4 · · · o · · · · 
5 o · · · · · · · 
6 · · · · · · o · 
7 · o · · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · o · · · · · · 
4 · · · · o · · · 
5 · · · · · · · o 
6 o · · · · · · · 
7 · · · · · · o · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · o · · · · · · 
4 · · · · · · o · 
5 o · · · · · · · 
6 · · · o · · · · 
7 · · · · · · · o 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · o · · · · · · 
4 · · · · · · o · 
5 · · · · o · · · 
6 o · · · · · · · 
7 · · · · · · · o 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 · · · · · · o · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · · · o · · · · 
4 · o · · · · · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 · · · · · · o · 
8 o · · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 o · · · · · · · 
5 · · · o · · · · 
6 · · · · · · o · 
7 · · · · o · · · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 o · · · · · · · 
5 · · · · o · · · 
6 · · · · · · o · 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 · o · · · · · · 
5 · · · o · · · · 
6 o · · · · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · · o · 
3 · o · · · · · · 
4 · · · · · · · o 
5 · · · · o · · · 
6 o · · · · · · · 
7 · · · o · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · · o · 
3 · o · · · · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 · · · o · · · · 
7 o · · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · o · · · · · 
2 · · · · · · · o 
3 · · · o · · · · 
4 · · · · · · o · 
5 o · · · · · · · 
6 · · · · · o · · 
7 · o · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 o · · · · · · · 
3 · · · · o · · · 
4 · · · · · · · o 
5 · o · · · · · · 
6 · · · · · · o · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 o · · · · · · · 
3 · · · · o · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 · · o · · · · · 
7 · · · · · · o · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · o · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · · · o · 
4 · · o · · · · · 
5 · · · · · o · · 
6 · · · · · · · o 
7 o · · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · · · o · 
4 · · o · · · · · 
5 · · · · · o · · 
6 · · · · · · · o 
7 · · · · o · · · 
8 o · · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · · · o · 
4 · · · · o · · · 
5 o · · · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · · · · o 
4 · · · · o · · · 
5 · · · · · · o · 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · o · · · · · · 
3 · · · · · · · o 
4 · · · · · o · · 
5 o · · · · · · · 
6 · · o · · · · · 
7 · · · · o · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · o · · 
3 o · · · · · · · 
4 · · · · o · · · 
5 · o · · · · · · 
6 · · · · · · · o 
7 · · o · · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 · o · · · · · · 
5 · · · · · · o · 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · o · · 
3 · · · · · · · o 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · · · · o · 
7 · · · · o · · · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · o · 
3 o · · · · · · · 
4 · · · · · · · o 
5 · · · · o · · · 
6 · o · · · · · · 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · o · 
3 · · o · · · · · 
4 · · · · · · · o 
5 · o · · · · · · 
6 · · · · o · · · 
7 o · · · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · o · 
3 · · · · o · · · 
4 · o · · · · · · 
5 · · · · · o · · 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · · · · o 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · o · 
3 · · · · o · · · 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · · · o · · 
7 · · · · · · · o 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · · o 
3 o · · · · · · · 
4 · · o · · · · · 
5 · · · · · o · · 
6 · o · · · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · · o 
3 o · · · · · · · 
4 · · · · o · · · 
5 · · · · · · o · 
6 · o · · · · · · 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · o · · · · 
2 · · · · · · · o 
3 · · · · o · · · 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · · · · o · 
7 · o · · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 o · · · · · · · 
3 · · · o · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · · · · o · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 o · · · · · · · 
3 · · · · · · · o 
4 · · · o · · · · 
5 · o · · · · · · 
6 · · · · · · o · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 o · · · · · · · 
3 · · · · · · · o 
4 · · · · · o · · 
5 · · o · · · · · 
6 · · · · · · o · 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · o · · · · · · 
3 · · · o · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · · o · · · · · 
7 o · · · · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · o · · · · · · 
3 · · · o · · · · 
4 · · · · · · o · 
5 · · o · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 o · · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · o · · · · · · 
3 · · · · · o · · 
4 o · · · · · · · 
5 · · · · · · o · 
6 · · · o · · · · 
7 · · · · · · · o 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · o · · · · · · 
3 · · · · · · · o 
4 o · · · · · · · 
5 · · · o · · · · 
6 · · · · · · o · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · o · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · · o · 
5 · o · · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · o · · · · · 
3 · · · · · · · o 
4 · · · o · · · · 
5 · · · · · · o · 
6 o · · · · · · · 
7 · · · · · o · · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 o · · · · · · · 
4 · · o · · · · · 
5 · · · · · · · o 
6 · · · · · o · · 
7 · · · o · · · · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 o · · · · · · · 
4 · · · o · · · · 
5 · o · · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 · o · · · · · · 
4 · · · o · · · · 
5 · · · · · · · o 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 · o · · · · · · 
4 · · · · · o · · 
5 · · o · · · · · 
6 o · · · · · · · 
7 · · · o · · · · 
8 · · · · · · · o 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 · o · · · · · · 
4 · · · · · o · · 
5 · · o · · · · · 
6 o · · · · · · · 
7 · · · · · · · o 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · o · 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · · · · o 
7 · · · · · o · · 
8 · o · · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · · o 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · · o · · 
7 · o · · · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · · o · · · 
2 · · · · · · · o 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · · · · · o · 
6 · o · · · · · · 
7 · · · · · o · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 o · · · · · · · 
3 · · · · o · · · 
4 · o · · · · · · 
5 · · · · · · · o 
6 · · o · · · · · 
7 · · · · · · o · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · o · · · · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · o · · · 
7 · · · · · · · o 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · o · · · · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · · o · · · · 
6 · · · · · · · o 
7 · · · · o · · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · · o · 
5 · · · · o · · · 
6 · · · · · · · o 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · · · o 
5 · · · o · · · · 
6 · o · · · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · · · o 
5 · · · · o · · · 
6 · o · · · · · · 
7 · · · o · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 · · · · o · · · 
4 · · · · · · o · 
5 o · · · · · · · 
6 · · · o · · · · 
7 · o · · · · · · 
8 · · · · · · · o 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 · · · · o · · · 
4 · · · · · · · o 
5 o · · · · · · · 
6 · · · o · · · · 
7 · o · · · · · · 
8 · · · · · · o · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 · · · · · · o · 
4 · o · · · · · · 
5 · · · o · · · · 
6 · · · · · · · o 
7 o · · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 · · · · · · o · 
4 · o · · · · · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 o · · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · o · · · · · 
3 · · · · · · o · 
4 · · · o · · · · 
5 o · · · · · · · 
6 · · · · · · · o 
7 · o · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · · o · · · · 
3 o · · · · · · · 
4 · · · · o · · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · · · · o · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · · o · · · · 
3 · o · · · · · · 
4 · · · · · · · o 
5 · · · · o · · · 
6 · · · · · · o · 
7 o · · · · · · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · · o · · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · o · · · · · 
6 · · · · o · · · 
7 · o · · · · · · 
8 · · · · · · · o 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · · o · · · · 
3 · · · · · · o · 
4 o · · · · · · · 
5 · · · · · · · o 
6 · o · · · · · · 
7 · · · · o · · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · o · · 
2 · · · · · · · o 
3 · o · · · · · · 
4 · · · o · · · · 
5 o · · · · · · · 
6 · · · · · · o · 
7 · · · · o · · · 
8 · · o · · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 o · · · · · · · 
3 · · o · · · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 · · · o · · · · 
7 · o · · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · o · · · · · · 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · o · · · · · · 
3 · · · · · o · · 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · o · · · · 
7 · · · · · · · o 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · o · · 
5 · · · · · · · o 
6 · · · · o · · · 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · · o · · · · · 
3 · · · · · · · o 
4 · o · · · · · · 
5 · · · · o · · · 
6 o · · · · · · · 
7 · · · · · o · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · · · o · · · · 
3 · o · · · · · · 
4 · · · · o · · · 
5 · · · · · · · o 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · · · o · · · · 
3 · o · · · · · · 
4 · · · · · · · o 
5 · · · · · o · · 
6 o · · · · · · · 
7 · · o · · · · · 
8 · · · · o · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · o · 
2 · · · · o · · · 
3 · · o · · · · · 
4 o · · · · · · · 
5 · · · · · o · · 
6 · · · · · · · o 
7 · o · · · · · · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · · o 
2 · o · · · · · · 
3 · · · o · · · · 
4 o · · · · · · · 
5 · · · · · · o · 
6 · · · · o · · · 
7 · · o · · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · · o 
2 · o · · · · · · 
3 · · · · o · · · 
4 · · o · · · · · 
5 o · · · · · · · 
6 · · · · · · o · 
7 · · · o · · · · 
8 · · · · · o · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · · o 
2 · · o · · · · · 
3 o · · · · · · · 
4 · · · · · o · · 
5 · o · · · · · · 
6 · · · · o · · · 
7 · · · · · · o · 
8 · · · o · · · · 

  1 2 3 4 5 6 7 8 
1 · · · · · · · o 
2 · · · o · · · · 
3 o · · · · · · · 
4 · · o · · · · · 
5 · · · · · o · · 
6 · o · · · · · · 
7 · · · · · · o · 
8 · · · · o · · · 

92
% hyperfine ./main
Benchmark 1: ./main
  Time (mean ± σ):       7.3 ms ±   0.4 ms    [User: 4.8 ms, System: 2.5 ms]
  Range (min … max):     7.0 ms …  12.3 ms    202 runs
 
  Warning: The first benchmarking run for this command was significantly slower than the rest (12.3 ms). This could be caused by (filesystem) caches that were not filled until after the first run. You should consider using the '--warmup' option to fill those caches before the actual benchmark. Alternatively, use the '--prepare' option to clear the caches before each timing run.

Some optimization of this code are possible, since many solutions are symmetries, horizontal or vertical, or rotations of others. Also the cleaning/redrawing process could be optimized a way we don’t always redraw the whole thing, but rather just remove the last added queen/unavailable positions.

I’ll leave these optimizations for later or someone else. Many other projects to tackle first…

AI generated chess picture

AI generated chess picture