21 lines
568 B
Common Lisp
21 lines
568 B
Common Lisp
(defun perfect-shuffle (deck)
|
|
(let* ((half (floor (length deck) 2))
|
|
(left (subseq deck 0 half))
|
|
(right (nthcdr half deck)))
|
|
(mapcan #'list left right)))
|
|
|
|
(defun solve (deck-size)
|
|
(loop with original = (loop for n from 1 to deck-size collect n)
|
|
for trials from 1
|
|
for deck = original then shuffled
|
|
for shuffled = (perfect-shuffle deck)
|
|
until (equal shuffled original)
|
|
finally (format t "~5D: ~4D~%" deck-size trials)))
|
|
|
|
(solve 8)
|
|
(solve 24)
|
|
(solve 52)
|
|
(solve 100)
|
|
(solve 1020)
|
|
(solve 1024)
|
|
(solve 10000)
|