Alas, not executed with human skill, but in a computer's memory:
[zork(~)] python -i cards.py
>>> d = Deck(); print d
[Ace of Spades, 2 of Spades, 3 of Spades, 4 of Spades, 5 of Spades, 6 of
Spades, 7 of Spades, 8 of Spades, 9 of Spades, 10 of Spades, Jack of Spades,
Queen of Spades, King of Spades, Ace of Hearts, 2 of Hearts, 3 of Hearts,
4 of Hearts, 5 of Hearts, 6 of Hearts, 7 of Hearts, 8 of Hearts, 9 of Hearts,
10 of Hearts, Jack of Hearts, Queen of Hearts, King of Hearts, Ace of Clubs,
2 of Clubs, 3 of Clubs, 4 of Clubs, 5 of Clubs, 6 of Clubs, 7 of Clubs, 8 of
Clubs, 9 of Clubs, 10 of Clubs, Jack of Clubs, Queen of Clubs, King of Clubs,
Ace of Diamonds, 2 of Diamonds, 3 of Diamonds, 4 of Diamonds, 5 of Diamonds,
6 of Diamonds, 7 of Diamonds, 8 of Diamonds, 9 of Diamonds, 10 of Diamonds,
Jack of Diamonds, Queen of Diamonds, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, Ace of Clubs, 2 of Spades, 2 of Clubs, 3 of Spades, 3
of Clubs, 4 of Spades, 4 of Clubs, 5 of Spades, 5 of Clubs, 6 of Spades,
6 of Clubs, 7 of Spades, 7 of Clubs, 8 of Spades, 8 of Clubs, 9 of Spades,
9 of Clubs, 10 of Spades, 10 of Clubs, Jack of Spades, Jack of Clubs, Queen
of Spades, Queen of Clubs, King of Spades, King of Clubs, Ace of Hearts,
Ace of Diamonds, 2 of Hearts, 2 of Diamonds, 3 of Hearts, 3 of Diamonds,
4 of Hearts, 4 of Diamonds, 5 of Hearts, 5 of Diamonds, 6 of Hearts, 6 of
Diamonds, 7 of Hearts, 7 of Diamonds, 8 of Hearts, 8 of Diamonds, 9 of Hearts,
9 of Diamonds, 10 of Hearts, 10 of Diamonds, Jack of Hearts, Jack of Diamonds,
Queen of Hearts, Queen of Diamonds, King of Hearts, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, Ace of Hearts, Ace of Clubs, Ace of Diamonds, 2 of Spades,
2 of Hearts, 2 of Clubs, 2 of Diamonds, 3 of Spades, 3 of Hearts, 3 of
Clubs, 3 of Diamonds, 4 of Spades, 4 of Hearts, 4 of Clubs, 4 of Diamonds,
5 of Spades, 5 of Hearts, 5 of Clubs, 5 of Diamonds, 6 of Spades, 6 of
Hearts, 6 of Clubs, 6 of Diamonds, 7 of Spades, 7 of Hearts, 7 of Clubs,
7 of Diamonds, 8 of Spades, 8 of Hearts, 8 of Clubs, 8 of Diamonds, 9 of
Spades, 9 of Hearts, 9 of Clubs, 9 of Diamonds, 10 of Spades, 10 of Hearts,
10 of Clubs, 10 of Diamonds, Jack of Spades, Jack of Hearts, Jack of Clubs,
Jack of Diamonds, Queen of Spades, Queen of Hearts, Queen of Clubs, Queen
of Diamonds, King of Spades, King of Hearts, King of Clubs, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 7 of Clubs, Ace of Hearts, 7 of Diamonds, Ace of Clubs, 8 of
Spades, Ace of Diamonds, 8 of Hearts, 2 of Spades, 8 of Clubs, 2 of Hearts,
8 of Diamonds, 2 of Clubs, 9 of Spades, 2 of Diamonds, 9 of Hearts, 3 of
Spades, 9 of Clubs, 3 of Hearts, 9 of Diamonds, 3 of Clubs, 10 of Spades,
3 of Diamonds, 10 of Hearts, 4 of Spades, 10 of Clubs, 4 of Hearts, 10 of
Diamonds, 4 of Clubs, Jack of Spades, 4 of Diamonds, Jack of Hearts, 5 of
Spades, Jack of Clubs, 5 of Hearts, Jack of Diamonds, 5 of Clubs, Queen
of Spades, 5 of Diamonds, Queen of Hearts, 6 of Spades, Queen of Clubs,
6 of Hearts, Queen of Diamonds, 6 of Clubs, King of Spades, 6 of Diamonds,
King of Hearts, 7 of Spades, King of Clubs, 7 of Hearts, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 4 of Hearts, 7 of Clubs, 10 of Diamonds, Ace of Hearts, 4
of Clubs, 7 of Diamonds, Jack of Spades, Ace of Clubs, 4 of Diamonds, 8 of
Spades, Jack of Hearts, Ace of Diamonds, 5 of Spades, 8 of Hearts, Jack of
Clubs, 2 of Spades, 5 of Hearts, 8 of Clubs, Jack of Diamonds, 2 of Hearts,
5 of Clubs, 8 of Diamonds, Queen of Spades, 2 of Clubs, 5 of Diamonds,
9 of Spades, Queen of Hearts, 2 of Diamonds, 6 of Spades, 9 of Hearts,
Queen of Clubs, 3 of Spades, 6 of Hearts, 9 of Clubs, Queen of Diamonds,
3 of Hearts, 6 of Clubs, 9 of Diamonds, King of Spades, 3 of Clubs, 6 of
Diamonds, 10 of Spades, King of Hearts, 3 of Diamonds, 7 of Spades, 10 of
Hearts, King of Clubs, 4 of Spades, 7 of Hearts, 10 of Clubs, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 9 of Spades, 4 of Hearts, Queen of Hearts, 7 of Clubs, 2 of
Diamonds, 10 of Diamonds, 6 of Spades, Ace of Hearts, 9 of Hearts, 4 of Clubs,
Queen of Clubs, 7 of Diamonds, 3 of Spades, Jack of Spades, 6 of Hearts,
Ace of Clubs, 9 of Clubs, 4 of Diamonds, Queen of Diamonds, 8 of Spades,
3 of Hearts, Jack of Hearts, 6 of Clubs, Ace of Diamonds, 9 of Diamonds,
5 of Spades, King of Spades, 8 of Hearts, 3 of Clubs, Jack of Clubs, 6 of
Diamonds, 2 of Spades, 10 of Spades, 5 of Hearts, King of Hearts, 8 of Clubs,
3 of Diamonds, Jack of Diamonds, 7 of Spades, 2 of Hearts, 10 of Hearts,
5 of Clubs, King of Clubs, 8 of Diamonds, 4 of Spades, Queen of Spades,
7 of Hearts, 2 of Clubs, 10 of Clubs, 5 of Diamonds, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 5 of Spades, 9 of Spades, King of Spades, 4 of Hearts, 8 of
Hearts, Queen of Hearts, 3 of Clubs, 7 of Clubs, Jack of Clubs, 2 of Diamonds,
6 of Diamonds, 10 of Diamonds, 2 of Spades, 6 of Spades, 10 of Spades, Ace
of Hearts, 5 of Hearts, 9 of Hearts, King of Hearts, 4 of Clubs, 8 of Clubs,
Queen of Clubs, 3 of Diamonds, 7 of Diamonds, Jack of Diamonds, 3 of Spades,
7 of Spades, Jack of Spades, 2 of Hearts, 6 of Hearts, 10 of Hearts, Ace of
Clubs, 5 of Clubs, 9 of Clubs, King of Clubs, 4 of Diamonds, 8 of Diamonds,
Queen of Diamonds, 4 of Spades, 8 of Spades, Queen of Spades, 3 of Hearts,
7 of Hearts, Jack of Hearts, 2 of Clubs, 6 of Clubs, 10 of Clubs, Ace of
Diamonds, 5 of Diamonds, 9 of Diamonds, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 3 of Spades, 5 of Spades, 7 of Spades, 9 of Spades, Jack of
Spades, King of Spades, 2 of Hearts, 4 of Hearts, 6 of Hearts, 8 of Hearts,
10 of Hearts, Queen of Hearts, Ace of Clubs, 3 of Clubs, 5 of Clubs, 7 of
Clubs, 9 of Clubs, Jack of Clubs, King of Clubs, 2 of Diamonds, 4 of Diamonds,
6 of Diamonds, 8 of Diamonds, 10 of Diamonds, Queen of Diamonds, 2 of Spades,
4 of Spades, 6 of Spades, 8 of Spades, 10 of Spades, Queen of Spades, Ace of
Hearts, 3 of Hearts, 5 of Hearts, 7 of Hearts, 9 of Hearts, Jack of Hearts,
King of Hearts, 2 of Clubs, 4 of Clubs, 6 of Clubs, 8 of Clubs, 10 of Clubs,
Queen of Clubs, Ace of Diamonds, 3 of Diamonds, 5 of Diamonds, 7 of Diamonds,
9 of Diamonds, Jack of Diamonds, King of Diamonds]
>>> d.out_shuffle(); print d
[Ace of Spades, 2 of Spades, 3 of Spades, 4 of Spades, 5 of Spades, 6 of
Spades, 7 of Spades, 8 of Spades, 9 of Spades, 10 of Spades, Jack of Spades,
Queen of Spades, King of Spades, Ace of Hearts, 2 of Hearts, 3 of Hearts,
4 of Hearts, 5 of Hearts, 6 of Hearts, 7 of Hearts, 8 of Hearts, 9 of Hearts,
10 of Hearts, Jack of Hearts, Queen of Hearts, King of Hearts, Ace of Clubs,
2 of Clubs, 3 of Clubs, 4 of Clubs, 5 of Clubs, 6 of Clubs, 7 of Clubs, 8 of
Clubs, 9 of Clubs, 10 of Clubs, Jack of Clubs, Queen of Clubs, King of Clubs,
Ace of Diamonds, 2 of Diamonds, 3 of Diamonds, 4 of Diamonds, 5 of Diamonds,
6 of Diamonds, 7 of Diamonds, 8 of Diamonds, 9 of Diamonds, 10 of Diamonds,
Jack of Diamonds, Queen of Diamonds, King of Diamonds]
>>>
I'll spare you the 52 in-shuffles, but you can watch them if you want. I
can give a quick confirmation that 52 in-shuffles are equivalent to a null
(identity) shuffle:
[zork(~)] python -i cards.py
>>> d = Deck(); print d
[Ace of Spades, 2 of Spades, 3 of Spades, 4 of Spades, 5 of Spades, 6 of
Spades, 7 of Spades, 8 of Spades, 9 of Spades, 10 of Spades, Jack of Spades,
Queen of Spades, King of Spades, Ace of Hearts, 2 of Hearts, 3 of Hearts,
4 of Hearts, 5 of Hearts, 6 of Hearts, 7 of Hearts, 8 of Hearts, 9 of Hearts,
10 of Hearts, Jack of Hearts, Queen of Hearts, King of Hearts, Ace of Clubs,
2 of Clubs, 3 of Clubs, 4 of Clubs, 5 of Clubs, 6 of Clubs, 7 of Clubs, 8 of
Clubs, 9 of Clubs, 10 of Clubs, Jack of Clubs, Queen of Clubs, King of Clubs,
Ace of Diamonds, 2 of Diamonds, 3 of Diamonds, 4 of Diamonds, 5 of Diamonds,
6 of Diamonds, 7 of Diamonds, 8 of Diamonds, 9 of Diamonds, 10 of Diamonds,
Jack of Diamonds, Queen of Diamonds, King of Diamonds]
>>> for i in range(52):
... d.in_shuffle()
...
>>> print d
[Ace of Spades, 2 of Spades, 3 of Spades, 4 of Spades, 5 of Spades, 6 of
Spades, 7 of Spades, 8 of Spades, 9 of Spades, 10 of Spades, Jack of Spades,
Queen of Spades, King of Spades, Ace of Hearts, 2 of Hearts, 3 of Hearts,
4 of Hearts, 5 of Hearts, 6 of Hearts, 7 of Hearts, 8 of Hearts, 9 of Hearts,
10 of Hearts, Jack of Hearts, Queen of Hearts, King of Hearts, Ace of Clubs,
2 of Clubs, 3 of Clubs, 4 of Clubs, 5 of Clubs, 6 of Clubs, 7 of Clubs, 8 of
Clubs, 9 of Clubs, 10 of Clubs, Jack of Clubs, Queen of Clubs, King of Clubs,
Ace of Diamonds, 2 of Diamonds, 3 of Diamonds, 4 of Diamonds, 5 of Diamonds,
6 of Diamonds, 7 of Diamonds, 8 of Diamonds, 9 of Diamonds, 10 of Diamonds,
Jack of Diamonds, Queen of Diamonds, King of Diamonds]
>>>
Now, that was anticlimactic, wasn't it? But it would have been too much to
reproduce all of the intermediate steps. I assure you that the in_shuffle()
function is actually doing an in-shuffle.
One of the coolest things in the world is the discovery by Elmsley (reported
by Gardner) that the binary number system directly gives you the sequence of
perfect shuffles needed to displace the top card down a certain distance:
| To move the top card down | Use this sequence
(O[ut]/I[n]) |
| 0 | O |
| 1 | I |
| 2 | I, O |
| 3 | I, I |
| 4 | I, O, O |
| 5 | I, O, I |
| 6 | I, I, O |
| 7 | I, I, I |
| 8 | I, O, O, O |
| 9 | I, O, O, I |
| 10 | I, O, I, O |
(Of course the pattern continues: to bring the top card to the bottom,
you can use I, I, O, O, I, I -- 110011 is binary for 51.)
Isn't that beautiful? Of course, the bottom card moves up by exactly the
same amount that the top card moves down.
Using Elmsley's principle, to move the top card of a deck down by 17,
you need I, O, O, O, I. Let's try it (emphasis added):
>>> d = Deck()
>>> print d
[