; three list manipulation exercises

(define (split n xs)
  (let loop ((n n) (xs xs) (zs '()))
    (if (or (zero? n) (null? xs))
        (values (reverse zs) xs)
        (loop (- n 1) (cdr xs) (cons (car xs) zs)))))

(define xs '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20))

(define (task1 xs) (filter even? xs))

(display (task1 xs)) (newline)

(define (task2 n xs)
  (let loop ((xs xs) (k 1) (zs (list)))
    (if (null? xs) (reverse zs)
      (if (= k n) (loop (cdr xs) 1 zs)
        (loop (cdr xs) (+ k 1) (cons (car xs) zs))))))

(display (task2 3 xs)) (newline)

(define (task3 xs)
  (call-with-values
    (lambda () (split (quotient (length xs) 2) xs))
    (lambda (front back) (append back front))))

(display (task3 xs)) (newline)