31 lines
901 B
Common Lisp
31 lines
901 B
Common Lisp
;; Iterate over all permutations of a list, and
|
|
;; call a function on each.
|
|
(define (permute permute.seq permute.func (permute.built '()))
|
|
(if (null? permute.seq)
|
|
(permute.func permute.built)
|
|
(let (seq (copy permute.seq))
|
|
(dotimes (i (length seq))
|
|
(unless (zero? i) (rotate seq -1))
|
|
(permute
|
|
(rest seq)
|
|
permute.func
|
|
(cons (first seq) permute.built))))))
|
|
|
|
(define (adjacent a b lst)
|
|
(= 1 (abs (- (find a lst)
|
|
(find b lst)))))
|
|
|
|
(define (check lst)
|
|
(if
|
|
(and
|
|
(< (find 'baker lst) 4)
|
|
(> (find 'cooper lst) 0)
|
|
(not (member (find 'fletcher lst) '(0 4)))
|
|
(> (find 'miller lst) (find 'cooper lst))
|
|
(not (adjacent 'smith 'fletcher lst))
|
|
(not (adjacent 'cooper 'fletcher lst)))
|
|
(println lst)))
|
|
|
|
(permute '(baker cooper fletcher miller smith) check)
|
|
|
|
(smith cooper baker fletcher miller)
|