from random import * pairs = 50 magicCode = 4589 totalGets = 0 experRepeats = 100 basket = [] completed = [] checkedout = [] def initialize(): global basket, completed, checkedout, totalGets basket = [magicCode+2*i for i in range(0,pairs)] + [magicCode+2*i+1 for i in range(0,pairs)] completed = [] checkedout = [] totalGets = 0 def emptyBasket(): return basket==[] def getSock(): global basket, totalGets, checkedout assert(not emptyBasket()) i = randint(0,len(basket)-1) # print i sock = basket[i] del basket[i] checkedout = checkedout + [sock] totalGets = totalGets + 1 return sock def match(sock1, sock2): global checkedout, magicCode, completed # print "matching", sock1, "and", sock2 assert(sock1 in checkedout) assert(sock2 in checkedout) assert(sock1 != sock2) if (sock1-magicCode)/2 != (sock2-magicCode)/2: return False i1 = checkedout.index(sock1) del checkedout[i1] i2 = checkedout.index(sock2) del checkedout[i2] completed = completed + [[sock1,sock2]] # print "...matched" return True def replaceSock(sock): global checkedout, basket assert(sock in checkedout) i = checkedout.index(sock) del checkedout[i] basket = basket + [sock] # 4953 def sorter1(): x = getSock() y = getSock() if not match(x,y): replaceSock(x) replaceSock(y) # 2485.73 def sorter2(): x = getSock() y = getSock() while not match(x,y): replaceSock(y) y = getSock() # 1309.62 def sorter3(): x = getSock() y = getSock() pile = [] while not match(x,y): pile = pile + [y] y = getSock() for sock in pile: replaceSock(sock) # always 100 def sorter4(): emptySpot = 0 pile = [] while not emptyBasket(): x = getSock() matched = False for i in range(len(pile)): if not matched and match(x,pile[i]): matched = True del pile[i] if not matched: pile = pile + [ x ] # grab 3 def sorter5(): x = getSock() y = getSock() if emptyBasket(): match(x,y) else: z = getSock() if match(x,z): replaceSock(y) elif match(y,z): replaceSock(x) elif match(x,y): replaceSock(z) else: replaceSock(x) replaceSock(y) replaceSock(z) # alternative to sorter4 def sorter6(): pile = [] while not emptyBasket(): x = getSock() pile2 = [] matched = False while not matched and pile != []: y = pile[0] pile = pile[1:] if match(x,y): matched = True else: pile2 = pile2 + [y] pile = pile + pile2 if not matched: pile = pile + [ x ] sorter = sorter5 # 100.0 def experiment(): global experRepeats, totalGets allRuns = [] for i in range(experRepeats): # print "EXPERIMENT", i initialize() while len(completed) < pairs: sorter() allRuns = allRuns + [totalGets] return allRuns x = experiment() print "mean", sum(x)/(0.0+len(x)) print "max", max(x) print "min", min(x)