(1 2 3 4 5)が与えられたとき( (1 2) (2 3) (3 4) (4 5) )を返すような関数の定義

リスト処理の問題。

1. (1 2 3 4 5) が与えられたとき ( (1 2)(2 3)(3 4)(4 5) ) を返すような関数を定義せよ
2. 1 の関数を拡張して、(0 1 2 3 4 5 6 7 8 9) と 2 が与えられたとき ( (0 1)(1 2)(2 3)(3 4)(4 5)(5 6)(6 7)(7 8)(8 9) ) を、(0 1 2 3 4 5 6 7 8 9) と 3 が与えられたとき ( (0 1 2) (2 3 4) (4 5 6) (6 7 8) (8 9) ) を、(0 1 2 3 4 5 6 7 8 9) と 4 が与えられたとき ( (0 1 2 3) (3 4 5 6) (6 7 8 9) ) を返すような関数を定義せよ

vallog: [1,2,3,4,5] が与えられたとき [[1,2][2,3][3,4][4,5]] を返すような関数を定義せよ

おもしろそうなので、回答見ないでやってみた。
1.はやってみたけど、保存するの忘れたので2.だけ。

(use util.list)
(define (overlap-slices ls n)
  (define overlapped-list
    (let loop ((i 0)
               (new '())
               (rest ls))
      (define (overlapped? cur)
        (and (not (= cur 0)) (= (remainder (+ cur 1) n) 0)))
      (let ((cur (car rest)))
        (cond ((null? (cdr rest)) (append new (list cur)))
              ((overlapped? i)
               (loop 1 (append new (list cur) (list cur)) (cdr rest)))
              (else 
               (loop (+ i 1) (append new (list cur)) (cdr rest)))))))
  (slices overlapped-list n))

実行

(overlap-slices '(a b c d e f g) 3)
;; ((a b c) (c d e) (e f g))
(overlap-slices '(a b c d e f g) 4)
;; ((a b c d) (d e f g))

OK。
ということで回答見てみる。
うん。全然違うw
すっきりしてますな。