#!/etc/python3.5 class PoolRoll: #roll[roll results], rolls[count of results], successes roll = [] rolls = [] # I think I need to do this for the following functions def rollsum(self): sum = 0 for i in range (2,13): sum += self.rolls[i] * i return sum def newlarge(self): x = 12 while x > 0: if self.rolls[x]: return x else: x += -1 return 0 def newsmall(self): x=2 #[0] and [1] will always be 0 while x < 13: if self.rolls[x]: return x else: x += 1 return 0 def __init__( self, oldpoolroll, newdieroll, TN ): self.roll = oldpoolroll.roll[:] self.roll.append(newdieroll) self.rolls = oldpoolroll.rolls[:] self.rolls[newdieroll] += 1 self.successes = oldpoolroll.successes if self.rollsum() < TN: pass #no new successes else: large = self.newlarge() if self.rolls[ TN - large ]: self.rolls[ TN - large ] += -1 self.rolls[large] += -1 self.successes += 1 else: total = large self.rolls[large] += -1 while total < TN: small = self.newsmall() total += small self.rolls[small] += -1 self.successes +=1 class Pool: def __init__(self, oldpool, currentpool): dierolls = tuple( [0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12] ) self.TN = oldpool.TN self.pool = currentpool[:] self.rolls = set() for oldpoolroll in oldpool.rolls: for dieroll in dierolls: if dieroll <= currentpool[-1]: newpoolroll = PoolRoll(oldpoolroll, dieroll, TN) self.rolls.add( newpoolroll ) def successes(self): totals = [0, 0, 0, 0, 0, 0] for roll in self.rolls: totals[roll.successes] += 1 return( totals ) class SeedRoll: def __init__( self, roll ): self.roll = [roll] self.rolls = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] self.rolls[roll] += 1 self.successes = 0 class SeedPool: def __init__(self, die, TN): self.TN = TN self.pool = [die] self.rolls = set() for i in (i for i in (0, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12) if i <= die): seed = SeedRoll( i ) self.rolls.add(seed) def successes(self): return([0, 0, 0, 0, 0, 0]) def iterate( pools, oldpool, lastpool, MAX ): dice = (4, 6, 8, 10, 12) print lastpool pools[str(lastpool)] = oldpool if len(lastpool) == MAX: file = open("iterative additive", "a") keylist = [key for key in pools if pools[key].pool[-1] == lastpool[-1]] for key in keylist: file.write("%d %s %s\n" % ( pools[key].TN, key, pools[key].successes())) del pools[key] file.close() return() else: for newdie in dice: currentpool = lastpool[:] if newdie <= lastpool[-1]: currentpool.append(newdie) pool = Pool(oldpool, currentpool) iterate( pools, pool, currentpool, MAX ) #main MAX = 11 for TN in xrange(5,9): limit = ((TN-1)/2)*2 for die in (die for die in (4, 6, 8, 10, 12) if die <= limit): currentpool = [die] seed = SeedPool(die, TN) pools = {} iterate(pools, seed, currentpool, MAX) del pools, seed