Perfect shuffle is a programming exercise that poses the question: If you split a deck of cards perfectly in half and shuffle them with a perfect interleave, so that the first card of the half-deck on the left is always the top card, how many shuffles will it take until they return to their original order?
I encountered Perfect Shuffle the other night at a code kata held by the local Python group at GSU in Atlanta, GA. How could a room full of really smart, albeit new, programmers take 2 hours and still not come up with a perfect solution? I admit I was there. The next day, after thinking about it and checking on two questions I had about lists, I came up with the solution below which is neither long nor hard.
Everything I needed to know was on page two of Big Daddy’s General Python Toolbox (#1). All those methods collected below “LISTS” are not for decoration and you can NOT treat a list like it is a string!
Give it a shot for yourself. Here is my take:
''' PERFECT SHUFFLE Perfect shuffle is a programming exercise that poses the question: if you split a deck of cards perfectly in half and shuffle them with a perfect interleave so that the first card on the left is always the top card, how many shuffles will it take until they return to their original order? How could a room full of really smart new programmers take 2 hours and still not come up with a solution? ''' # create deck deck=[] newdeck=[] for i in range(52): deck.append(i+1) olddeck=deck.copy() cyclecount=0 # shuffle function def shuffle(): newdeck.clear() for i in range(0,26): newdeck.append(olddeck[i]) newdeck.append(olddeck[i+26]) olddeck.clear() decks_equal=False while decks_equal==False: cyclecount+=1 shuffle() if deck==newdeck: decks_equal=True print("Decks in sync at cycle: ", str(cyclecount)) print("original deck: \n "+ str(deck)) print("reshuffled deck: \n" + str(newdeck)) else: olddeck.clear() olddeck=newdeck.copy()