Initial revision
[bpt/guile.git] / test / queens.scm
CommitLineData
a98cef7e
KN
1(define (filter predicate sequence)
2 (cond ((null? sequence) '())
3 ((predicate (car sequence))
4 (cons (car sequence)
5 (filter predicate (cdr sequence))))
6 (else (filter predicate (cdr sequence)))))
7
8(define (accumulate op initial sequence)
9 (if (null? sequence)
10 initial
11 (op (car sequence)
12 (accumulate op initial (cdr sequence)))))
13
14(define (flatmap proc seq)
15 (accumulate append '() (map proc seq)))
16
17(define (enumerate-interval low high)
18 (if (> low high)
19 '()
20 (cons low (enumerate-interval (+ low 1) high))))
21
22(define empty-board '())
23
24(define (rest bs k rest-of-queens)
25 (map (lambda (new-row)
26 (adjoin-position new-row k rest-of-queens))
27 (enumerate-interval 1 bs)))
28
29(define (queen-cols board-size k)
30 (if (= k 0)
31 (list empty-board)
32 (filter (lambda (positions) (safe? k positions))
33 (flatmap (lambda (r) (rest board-size k r))
34 (queen-cols board-size (- k 1))))))
35
36(define (queens board-size)
37 (queen-cols board-size board-size))
38
39(define (adjoin-position new-row k rest-of-queens)
40 (append rest-of-queens (list new-row)))
41
42(define (safe? k positions)
43 (let ((new (car (last-pair positions)))
44 (bottom (car positions)))
45 (cond ((= k 1) #t)
46 ((= new bottom) #f)
47 ((or (= new (- bottom (- k 1))) (= new (+ bottom (- k 1)))) #f)
48 (else (safe? (- k 1) (cdr positions))))))
49
50(test (queens 4) '((2 4 1 3) (3 1 4 2)))