#!/usr/bin/python # TYPE:sciencemath # DESC:Creates a pseudo-darwinistic society where two families compete to be more wealthy and able than the other. print "Content-type: text/html\n\n" import cgi, random data = cgi.FieldStorage() childrenStats = [0,0,0,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2,2,2,3,3,4,5] childrenNames = ['James', 'John', 'Robert', 'Michael', 'William', 'David', 'Richard', 'Charles', 'Joseph', 'Thomas', 'Christopher', 'Daniel', 'Paul', 'Mark', 'Donald', 'George', 'Kenneth', 'Steven', 'Edward', 'Brian', 'Ronald', 'Anthony', 'Kevin', 'Jason', 'Matthew', 'Gary', 'Timothy', 'Jose', 'Larry', 'Jeffrey', 'Frank', 'Scott', 'Eric', 'Stephen', 'Andrew', 'Raymond', 'Gregory', 'Joshua', 'Jerry', 'Dennis', 'Walter', 'Patrick', 'Peter', 'Harold', 'Douglas', 'Henry', 'Carl', 'Arthur', 'Ryan', 'Roger', 'Joe', 'Juan', 'Jack', 'Albert', 'Jonathan', 'Justin', 'Terry', 'Gerald', 'Keith', 'Samuel', 'Willie', 'Ralph', 'Lawrence', 'Nicholas', 'Roy', 'Benjamin', 'Bruce', 'Brandon', 'Adam', 'Harry', 'Fred', 'Wayne', 'Billy', 'Steve', 'Louis', 'Jeremy', 'Aaron', 'Randy', 'Howard', 'Eugene', 'Carlos', 'Russell', 'Bobby', 'Victor', 'Martin', 'Ernest', 'Phillip', 'Todd', 'Jesse', 'Craig', 'Alan', 'Shawn', 'Clarence', 'Sean', 'Philip', 'Chris', 'Johnny', 'Earl', 'Jimmy', 'Antonio', 'Danny', 'Bryan', 'Tony', 'Luis', 'Mike', 'Stanley', 'Leonard', 'Nathan', 'Dale', 'Manuel', 'Rodney', 'Curtis', 'Norman', 'Allen', 'Marvin', 'Vincent', 'Glenn', 'Jeffery', 'Travis', 'Jeff', 'Chad', 'Jacob', 'Lee', 'Melvin', 'Alfred', 'Kyle', 'Francis', 'Bradley', 'Jesus', 'Herbert', 'Frederick', 'Ray', 'Joel', 'Edwin', 'Don', 'Eddie', 'Ricky', 'Troy', 'Randall', 'Barry', 'Alexander', 'Bernard', 'Mario', 'Leroy', 'Francisco', 'Marcus', 'Micheal', 'Theodore', 'Clifford', 'Miguel', 'Oscar', 'Jay', 'Jim', 'Tom', 'Calvin', 'Alex', 'Jon', 'Ronnie', 'Bill', 'Lloyd', 'Tommy', 'Leon', 'Derek', 'Warren', 'Darrell', 'Jerome', 'Floyd', 'Leo', 'Alvin', 'Tim', 'Wesley', 'Gordon', 'Dean', 'Greg', 'Jorge', 'Dustin', 'Pedro', 'Derrick', 'Dan', 'Lewis', 'Zachary', 'Corey', 'Herman', 'Maurice', 'Vernon', 'Roberto', 'Clyde', 'Glen', 'Hector', 'Shane', 'Ricardo', 'Sam', 'Rick', 'Lester', 'Brent', 'Ramon', 'Charlie', 'Tyler', 'Gilbert', 'Gene', 'Marc', 'Reginald', 'Ruben', 'Brett', 'Angel', 'Nathaniel', 'Rafael', 'Leslie', 'Edgar', 'Milton', 'Raul', 'Ben', 'Chester', 'Cecil', 'Duane', 'Franklin', 'Andre', 'Elmer', 'Brad', 'Gabriel', 'Ron', 'Mitchell', 'Roland', 'Arnold', 'Harvey', 'Jared', 'Adrian', 'Karl', 'Cory', 'Claude', 'Erik', 'Darryl', 'Jamie', 'Neil', 'Jessie', 'Christian', 'Javier', 'Fernando', 'Clinton', 'Ted', 'Mathew', 'Tyrone', 'Darren', 'Lonnie', 'Lance', 'Cody', 'Julio', 'Kelly', 'Kurt', 'Allan', 'Nelson', 'Guy', 'Clayton', 'Hugh', 'Max', 'Dwayne', 'Dwight', 'Armando', 'Felix', 'Jimmie', 'Everett', 'Jordan', 'Ian', 'Mary', 'Patricia', 'Linda', 'Barbara', 'Elizabeth', 'Jennifer', 'Maria', 'Susan', 'Margaret', 'Dorothy', 'Lisa', 'Nancy', 'Karen', 'Betty', 'Helen', 'Sandra', 'Donna', 'Carol', 'Ruth', 'Sharon', 'Michelle', 'Laura', 'Sarah', 'Kimberly', 'Deborah', 'Jessica', 'Shirley', 'Cynthia', 'Angela', 'Melissa', 'Brenda', 'Amy', 'Anna', 'Rebecca', 'Virginia', 'Kathleen', 'Pamela', 'Martha', 'Debra', 'Amanda', 'Stephanie', 'Carolyn', 'Christine', 'Marie', 'Janet', 'Catherine', 'Frances', 'Ann', 'Joyce', 'Diane', 'Alice', 'Julie', 'Heather', 'Teresa', 'Doris', 'Gloria', 'Evelyn', 'Jean', 'Cheryl', 'Mildred', 'Katherine', 'Joan', 'Ashley', 'Judith', 'Rose', 'Janice', 'Kelly', 'Nicole', 'Judy', 'Christina', 'Kathy', 'Theresa', 'Beverly', 'Denise', 'Tammy', 'Irene', 'Jane', 'Lori', 'Rachel', 'Marilyn', 'Andrea', 'Kathryn', 'Louise', 'Sara', 'Anne', 'Jacqueline', 'Wanda', 'Bonnie', 'Julia', 'Ruby', 'Lois', 'Tina', 'Phyllis', 'Norma', 'Paula', 'Diana', 'Annie', 'Lillian', 'Emily', 'Robin', 'Peggy', 'Crystal', 'Gladys', 'Rita', 'Dawn', 'Connie', 'Florence', 'Tracy', 'Edna', 'Tiffany', 'Carmen', 'Rosa', 'Cindy', 'Grace', 'Wendy', 'Victoria', 'Edith', 'Kim', 'Sherry', 'Sylvia', 'Josephine', 'Thelma', 'Shannon', 'Sheila', 'Ethel', 'Ellen', 'Elaine', 'Marjorie', 'Carrie', 'Charlotte', 'Monica', 'Esther', 'Pauline', 'Emma', 'Juanita', 'Anita', 'Rhonda', 'Hazel', 'Amber', 'Eva', 'Debbie', 'April', 'Leslie', 'Clara', 'Lucille', 'Jamie', 'Joanne', 'Eleanor', 'Valerie', 'Danielle', 'Megan', 'Alicia', 'Suzanne', 'Michele', 'Gail', 'Bertha', 'Darlene', 'Veronica', 'Jill', 'Erin', 'Geraldine', 'Lauren', 'Cathy', 'Joann', 'Lorraine', 'Lynn', 'Sally', 'Regina', 'Erica', 'Beatrice', 'Dolores', 'Bernice', 'Audrey', 'Yvonne', 'Annette', 'June', 'Samantha', 'Marion', 'Dana', 'Stacy', 'Ana', 'Renee', 'Ida'] specialEvents = { 'wins the lottery': (2, (500000, 20)), 'gets malaria': (10, (0, -10)), 'is mugged': (15, (-200, -5)), 'is murdered': (2, (0, -100)), 'discovers a planet': (2, (100000, 20)), 'becomes a monk': (2, (0, 30)) } specialEventNames = specialEvents.keys() def commas(number): if number is None: return None if not number: return str(number) number = list(str(number)) if '.' in number: i = number.index('.') else: i = len(number) while 1: i = i-3 if i <= 0 or number[i-1] == '-': break number[i:i] = [','] return ''.join(number) def restrict(input, bottom, top): number = numerize(input) if number < bottom: return bottom elif number > top: return top else: return number numbers = '0123456789' def numerize(numberString): goodNumber = '' for character in numberString: if character in numbers: goodNumber += character if len(goodNumber) > 0: return int(goodNumber) else: return 0 class Person: def __init__(self, name, family, wealth, able, age=0, generation=0): self.name = name self.family = family self.wealth = wealth self.able = able self.family.add(generation, self) self.age = age self.generation = generation self.alive = 1 self.children = [] def __str__(self): return "%s %s with $%d at %s%% ableness." % (self.name, self.family.name, self.wealth, self.able) def life(self): if self.alive == 1: #print "Life cycle of", self.name, "beginning..." self.event() if self.age == 1 and random.randint(0,60) < self.able: self.reproduce() if self.age == 3 or self.able <= 10 or (self.able <= 30 and random.randint(0,100) < able): self.die() self.evolve() self.age += 1 #print "Life cycle of", self.name, "ending..." def evolve(self): if self.alive == 1: self.wealth = (self.able / 100.0) * (self.wealth + 100000) def die(self): #print self.name, "should be dying now..." self.alive = 0 if len(self.children) > 0: wealthDist = int(self.wealth / len(self.children)) for child in self.children: child.wealth += wealthDist def event(self): event = random.choice(specialEventNames) #print 'It is possible that %s %s...' % (self.name, event) eventInfo = specialEvents[event] eventChance = eventInfo[0] eventStats = eventInfo[1] #print '[Need to roll a %d]' % eventChance roll = random.randint(0, 100) if roll <= eventChance: #print 'Yay, %s %s! [rolled a %d]' % (self.name, event, roll) self.apply(event, eventStats) #else: print 'Boohoo... [rolled a %d]' % roll def apply(self, event, stats): #print "%s %s %s." % (self.name, self.family.name, event) self.wealth += stats[0] self.able += stats[1] def reproduce(self): childNum = random.choice(childrenStats) for x in range(0, childNum): wealthMod = random.randint(-30, 30) ableMod = random.randint(-15, 10) child = Person(random.choice(childrenNames), self.family, self.wealth + wealthMod, self.able + ableMod, generation = self.generation + 1) self.children.append(child) #print '%s %s had %d children.' % (self.name, self.family.name, childNum) class Family: def __init__(self, name): self.name = name self.members = [[]] def add(self, generation, person): try: self.members[generation].append(person) except IndexError: self.members.append([]) self.members[generation].append(person) def advance(self): for generation in self.members: for member in generation: #print "- Next member: %s" % member member.life() def makeStats(self): self.totalPeople = 0 self.totalWealth = 0 self.totalAble = 0 self.memberTable = "
| Gen | First Name | Wealth | Ability |
| %d | %s | %d | %d |
| %d | %d | %d |