; perfect shuffle
(define (deck n)
(let loop ((n n) (ds (list)))
(if (zero? n) ds
(loop (- n 1) (cons n ds)))))
(define (faro xs)
(let loop1 ((ts xs) (hs xs) (ys (list)))
(if (and (pair? hs) (pair? (cdr hs)))
(loop1 (cdr ts) (cddr hs) (cons (car ts) ys))
(let loop2 ((xs (reverse ts)) (ys ys) (zs (list)))
(if (null? xs) zs
(loop2 ys (cdr xs) (cons (car xs) zs)))))))
(define (perf n)
(let ((ds (deck n)))
(do ((xs (faro ds) (faro xs)) (k 1 (+ k 1)))
((equal? xs ds) k))))
(display (deck 8)) (newline)
(display (faro (deck 8))) (newline)
(display (faro (faro (faro (deck 8))))) (newline)
(display (perf 8)) (newline)
(display (perf 52)) (newline)
OyBwZXJmZWN0IHNodWZmbGUKCihkZWZpbmUgKGRlY2sgbikKICAobGV0IGxvb3AgKChuIG4pIChkcyAobGlzdCkpKQogICAgKGlmICh6ZXJvPyBuKSBkcwogICAgICAobG9vcCAoLSBuIDEpIChjb25zIG4gZHMpKSkpKQoKKGRlZmluZSAoZmFybyB4cykKICAobGV0IGxvb3AxICgodHMgeHMpIChocyB4cykgKHlzIChsaXN0KSkpCiAgICAoaWYgKGFuZCAocGFpcj8gaHMpIChwYWlyPyAoY2RyIGhzKSkpCiAgICAgICAgKGxvb3AxIChjZHIgdHMpIChjZGRyIGhzKSAoY29ucyAoY2FyIHRzKSB5cykpCiAgICAgICAgKGxldCBsb29wMiAoKHhzIChyZXZlcnNlIHRzKSkgKHlzIHlzKSAoenMgKGxpc3QpKSkKICAgICAgICAgIChpZiAobnVsbD8geHMpIHpzCiAgICAgICAgICAgIChsb29wMiB5cyAoY2RyIHhzKSAoY29ucyAoY2FyIHhzKSB6cykpKSkpKSkKCihkZWZpbmUgKHBlcmYgbikKICAobGV0ICgoZHMgKGRlY2sgbikpKQogICAgKGRvICgoeHMgKGZhcm8gZHMpIChmYXJvIHhzKSkgKGsgMSAoKyBrIDEpKSkKICAgICAgICAoKGVxdWFsPyB4cyBkcykgaykpKSkKCihkaXNwbGF5IChkZWNrIDgpKSAobmV3bGluZSkKKGRpc3BsYXkgKGZhcm8gKGRlY2sgOCkpKSAobmV3bGluZSkKKGRpc3BsYXkgKGZhcm8gKGZhcm8gKGZhcm8gKGRlY2sgOCkpKSkpIChuZXdsaW5lKQooZGlzcGxheSAocGVyZiA4KSkgKG5ld2xpbmUpCihkaXNwbGF5IChwZXJmIDUyKSkgKG5ld2xpbmUp