; multiplicative persistance
(define (digits n . args)
(let ((b (if (null? args) 10 (car args))))
(let loop ((n n) (d '()))
(if (zero? n) d
(loop (quotient n b)
(cons (modulo n b) d))))))
(define (uniq-c eql? xs)
(if (null? xs) xs
(let loop ((xs (cdr xs)) (prev (car xs)) (k 1) (result '()))
(cond ((null? xs) (reverse (cons (cons prev k) result)))
((eql? (car xs) prev) (loop (cdr xs) prev (+ k 1) result))
(else (loop (cdr xs) (car xs) 1 (cons (cons prev k) result)))))))
(define (per n)
(let loop ((n n) (xs (list)))
(if (< n 10)
(cons n xs)
(loop (apply * (digits n))
(cons n xs)))))
(display (per 327)) (newline)
OyBtdWx0aXBsaWNhdGl2ZSBwZXJzaXN0YW5jZQoKKGRlZmluZSAoZGlnaXRzIG4gLiBhcmdzKQogIChsZXQgKChiIChpZiAobnVsbD8gYXJncykgMTAgKGNhciBhcmdzKSkpKQogICAgKGxldCBsb29wICgobiBuKSAoZCAnKCkpKQogICAgICAoaWYgKHplcm8/IG4pIGQKICAgICAgICAgIChsb29wIChxdW90aWVudCBuIGIpCiAgICAgICAgICAgICAgICAoY29ucyAobW9kdWxvIG4gYikgZCkpKSkpKQoKKGRlZmluZSAodW5pcS1jIGVxbD8geHMpCiAgKGlmIChudWxsPyB4cykgeHMKICAgIChsZXQgbG9vcCAoKHhzIChjZHIgeHMpKSAocHJldiAoY2FyIHhzKSkgKGsgMSkgKHJlc3VsdCAnKCkpKQogICAgICAoY29uZCAoKG51bGw/IHhzKSAocmV2ZXJzZSAoY29ucyAoY29ucyBwcmV2IGspIHJlc3VsdCkpKQogICAgICAgICAgICAoKGVxbD8gKGNhciB4cykgcHJldikgKGxvb3AgKGNkciB4cykgcHJldiAoKyBrIDEpIHJlc3VsdCkpCiAgICAgICAgICAgIChlbHNlIChsb29wIChjZHIgeHMpIChjYXIgeHMpIDEgKGNvbnMgKGNvbnMgcHJldiBrKSByZXN1bHQpKSkpKSkpCgooZGVmaW5lIChwZXIgbikKICAobGV0IGxvb3AgKChuIG4pICh4cyAobGlzdCkpKQogICAgKGlmICg8IG4gMTApCiAgICAgICAgKGNvbnMgbiB4cykKICAgICAgICAobG9vcCAoYXBwbHkgKiAoZGlnaXRzIG4pKQogICAgICAgICAgICAgIChjb25zIG4geHMpKSkpKQoKKGRpc3BsYXkgKHBlciAzMjcpKSAobmV3bGluZSk=