;; scramble ; (1 1 1 3 4 2 1 1 9 2) -> (1 1 1 1 1 4 1 1 1 9) ; (1 2 3 4 5 6 7 8 9) -> (1 1 1 1 1 1 1 1 1) ; (1 2 3 1 2 3 4 1 8 2 10) -> (1 1 1 1 1 1 1 1 2 8 2) (define one? (lambda (n) (= n 1))) (define sub1 (lambda (n) (- n 1))) (define pick (lambda (n lat) (if (one? n) (car lat) (pick (sub1 n)(cdr lat))))) (define pick (lambda (n lat) (list-ref lat (sub1 n)))) (pick 3 '(a b c d e f g)) ; -> c (define scramble-b (lambda (tup rev-pre) (if (null? tup) '() (cons (pick (car tup) (cons (car tup) rev-pre)) (scramble-b (cdr tup) (cons (car tup) rev-pre)))))) (define scramble (lambda (tup) (scramble-b tup '()))) (define scramble-b (lambda (tup rev-pre) (if (null? tup) '() (let* ((n (car tup)) (rev (cons n rev-pre))) (display (format "n = ~a, ret = ~a, tup = ~a, rev-pre = ~a\n" n (pick n rev) tup rev-pre)) (cons (pick n rev) (scramble-b (cdr tup) rev)))))) ; (1 1 1 3 4 2 1 1 9 2) -> (1 1 1 1 1 4 1 1 1 9) (scramble '(1 1 1 3 4 2 1 1 9 2)) ;; n = 1, ret = 1, tup = (1 1 1 3 4 2 1 1 9 2), rev-pre = () ;; n = 1, ret = 1, tup = (1 1 3 4 2 1 1 9 2), rev-pre = (1) ;; n = 1, ret = 1, tup = (1 3 4 2 1 1 9 2), rev-pre = (1 1) ;; n = 3, ret = 1, tup = (3 4 2 1 1 9 2), rev-pre = (1 1 1) ;; n = 4, ret = 1, tup = (4 2 1 1 9 2), rev-pre = (3 1 1 1) ;; n = 2, ret = 4, tup = (2 1 1 9 2), rev-pre = (4 3 1 1 1) ;; n = 1, ret = 1, tup = (1 1 9 2), rev-pre = (2 4 3 1 1 1) ;; n = 1, ret = 1, tup = (1 9 2), rev-pre = (1 2 4 3 1 1 1) ;; n = 9, ret = 1, tup = (9 2), rev-pre = (1 1 2 4 3 1 1 1) ;; n = 2, ret = 9, tup = (2), rev-pre = (9 1 1 2 4 3 1 1 1) ;; (1 1 1 1 1 4 1 1 1 9) ; (1 2 3 4 5 6 7 8 9) -> (1 1 1 1 1 1 1 1 1) (scramble '(1 2 3 4 5 6 7 8 9)) ;; n = 1, ret = 1, tup = (1 2 3 4 5 6 7 8 9), rev-pre = () ;; n = 2, ret = 1, tup = (2 3 4 5 6 7 8 9), rev-pre = (1) ;; n = 3, ret = 1, tup = (3 4 5 6 7 8 9), rev-pre = (2 1) ;; n = 4, ret = 1, tup = (4 5 6 7 8 9), rev-pre = (3 2 1) ;; n = 5, ret = 1, tup = (5 6 7 8 9), rev-pre = (4 3 2 1) ;; n = 6, ret = 1, tup = (6 7 8 9), rev-pre = (5 4 3 2 1) ;; n = 7, ret = 1, tup = (7 8 9), rev-pre = (6 5 4 3 2 1) ;; n = 8, ret = 1, tup = (8 9), rev-pre = (7 6 5 4 3 2 1) ;; n = 9, ret = 1, tup = (9), rev-pre = (8 7 6 5 4 3 2 1) ;; (1 1 1 1 1 1 1 1 1) ; (1 2 3 1 2 3 4 1 8 2 10) -> (1 1 1 1 1 1 1 1 2 8 2) (scramble '(1 2 3 1 2 3 4 1 8 2 10)) ;; n = 1, ret = 1, tup = (1 2 3 1 2 3 4 1 8 2 10), rev-pre = () ;; n = 2, ret = 1, tup = (2 3 1 2 3 4 1 8 2 10), rev-pre = (1) ;; n = 3, ret = 1, tup = (3 1 2 3 4 1 8 2 10), rev-pre = (2 1) ;; n = 1, ret = 1, tup = (1 2 3 4 1 8 2 10), rev-pre = (3 2 1) ;; n = 2, ret = 1, tup = (2 3 4 1 8 2 10), rev-pre = (1 3 2 1) ;; n = 3, ret = 1, tup = (3 4 1 8 2 10), rev-pre = (2 1 3 2 1) ;; n = 4, ret = 1, tup = (4 1 8 2 10), rev-pre = (3 2 1 3 2 1) ;; n = 1, ret = 1, tup = (1 8 2 10), rev-pre = (4 3 2 1 3 2 1) ;; n = 8, ret = 2, tup = (8 2 10), rev-pre = (1 4 3 2 1 3 2 1) ;; n = 2, ret = 8, tup = (2 10), rev-pre = (8 1 4 3 2 1 3 2 1) ;; n = 10, ret = 2, tup = (10), rev-pre = (2 8 1 4 3 2 1 3 2 1) ;; (1 1 1 1 1 1 1 1 2 8 2) (define scramble (lambda (tup) (letrec ((iter (lambda (t rev-pre) (if (null? t) '() (let* ((n (car t)) (rev (cons n rev-pre))) (cons (pick n rev) (iter (cdr t) rev))))))) (iter tup '()))))