6 (define (positions size)
7 (for*/list ([x (in-range 1 (+ size 1))]
8 [y (in-range 1 (+ size 1))])
11 ;; board is represented as list of lists
14 (define (sudoku board)
15 (let ([size (length board)])
16 (let ([new-board (amb-board board)])
18 (assert (distinct? r)))
19 (for ([c (apply map list new-board)])
20 (assert (distinct? c)))
21 (let ([ss (segments size)])
23 (assert (distinct? s)))
27 (define (amb-board board)
28 (cond [(empty? board) empty]
30 (let ([row (first board)])
31 (cons (for/list ([r row])
33 (amb-list (set->list (set-subtract (set 1 2 3 4 5 6 7 8 9) (list->set row))))
35 (amb-board (rest board))))]))
37 (define (segments board)
38 (let ([size (length board)])
39 (let ([s (sqrt size)])
40 (for*/list ([i (in-range 0 size s)]
41 [j (in-range 0 size s)])
42 (for*/list ([x (in-range i (+ i s))]
43 [y (in-range j (+ j s))])
44 (list-ref (list-ref board x) y))))))