; partial products of an array
(define (take n xs)
(let loop ((n n) (xs xs) (ys '()))
(if (or (zero? n) (null? xs))
(reverse ys)
(loop (- n 1) (cdr xs)
(cons (car xs) ys)))))
(define (scanl op base xs)
(let loop ((xs xs) (base base) (zs (list base)))
(if (null? xs) (reverse zs)
(let ((z (op (car xs) base)))
(loop (cdr xs) z (cons z zs))))))
(define (f xs)
(let* ((len (length xs))
(left (take len (scanl * 1 xs)))
(right (reverse (take len (scanl * 1 (reverse xs))))))
(map * left right)))
(display (f '(1 2 3 4 5))) (newline)
(display (f '(5 3 4 2 6 8))) (newline)
OyBwYXJ0aWFsIHByb2R1Y3RzIG9mIGFuIGFycmF5CgooZGVmaW5lICh0YWtlIG4geHMpCiAgKGxldCBsb29wICgobiBuKSAoeHMgeHMpICh5cyAnKCkpKQogICAgKGlmIChvciAoemVybz8gbikgKG51bGw/IHhzKSkKICAgICAgICAocmV2ZXJzZSB5cykKICAgICAgICAobG9vcCAoLSBuIDEpIChjZHIgeHMpCiAgICAgICAgICAgICAgKGNvbnMgKGNhciB4cykgeXMpKSkpKQoKKGRlZmluZSAoc2Nhbmwgb3AgYmFzZSB4cykKICAobGV0IGxvb3AgKCh4cyB4cykgKGJhc2UgYmFzZSkgKHpzIChsaXN0IGJhc2UpKSkKICAgIChpZiAobnVsbD8geHMpIChyZXZlcnNlIHpzKQogICAgICAobGV0ICgoeiAob3AgKGNhciB4cykgYmFzZSkpKQogICAgICAgIChsb29wIChjZHIgeHMpIHogKGNvbnMgeiB6cykpKSkpKQoKKGRlZmluZSAoZiB4cykKICAobGV0KiAoKGxlbiAobGVuZ3RoIHhzKSkKICAgICAgICAgKGxlZnQgKHRha2UgbGVuIChzY2FubCAqIDEgeHMpKSkKICAgICAgICAgKHJpZ2h0IChyZXZlcnNlICh0YWtlIGxlbiAoc2NhbmwgKiAxIChyZXZlcnNlIHhzKSkpKSkpCiAgICAobWFwICogbGVmdCByaWdodCkpKQoKKGRpc3BsYXkgKGYgJygxIDIgMyA0IDUpKSkgKG5ld2xpbmUpCihkaXNwbGF5IChmICcoNSAzIDQgMiA2IDgpKSkgKG5ld2xpbmUp