; vietnam snake
(define (filter pred? xs)
(let loop ((xs xs) (ys '()))
(cond ((null? xs) (reverse ys))
((pred? (car xs))
(loop (cdr xs) (cons (car xs) ys)))
(else (loop (cdr xs) ys)))))
(define (perm s) ; from Rosetta Code
(cond ((null? s) '())
((null? (cdr s)) (list s))
(else ;; extract each item in list in turn and perm the rest
(let splice ((l '()) (m (car s)) (r (cdr s)))
(append
(map (lambda (x) (cons m x)) (perm (append l r)))
(if (null? r) '()
(splice (cons m l) (car r) (cdr r))))))))
(define (vietnam? xs)
(= (+ (list-ref xs 0)
(/ (* 13 (list-ref xs 1))
(list-ref xs 2))
(list-ref xs 3)
(* 12 (list-ref xs 4))
(- (list-ref xs 5))
-11
(/ (* (list-ref xs 6)
(list-ref xs 7))
(list-ref xs 8))
-10)
66))
(define (lt? xs ys)
(let loop ((xs xs) (ys ys))
(cond ((null? xs) #f)
((null? ys) #t)
((< (car xs) (car ys)) #t)
((< (car ys) (car xs)) #f)
(else (loop (cdr xs) (cdr ys))))))
(for-each
(lambda (v) (display v) (newline))
(sort lt? (filter vietnam? (perm '(1 2 3 4 5 6 7 8 9)))))