Skip to content

Instantly share code, notes, and snippets.

@1328
Last active August 29, 2015 14:07
Show Gist options
  • Save 1328/da0e84e834384af7c537 to your computer and use it in GitHub Desktop.
Save 1328/da0e84e834384af7c537 to your computer and use it in GitHub Desktop.
aliens - try
import random
from collections import defaultdict
from pprint import pprint
class City(object):
def __init__(self, data=None):
self.name = None
self.neighbors = {}
if data is not None:
self.load(data)
def load(self, data):
data=data.strip().split()
self.name = data[0]
for path in data[1:]:
direction, city_name = path.split('=')
self.neighbors[direction] = city_name
def random_neighbor(self):
if not self.neighbors:
return None
return random.choice(list(self.neighbors.values()))
def __repr__(self):
return 'City ({}) -> routes to: {} )'.format(self.name,
', '.join(self.neighbors.values()))
def delete_route(self, neighbor):
self.neighbors = {d:n for d,n in self.neighbors.items()
if n != neighbor}
class World(object):
def __init__(self, aliens = 10):
self.cities = self.load_cities()
self.load_aliens(aliens)
def load_cities(self, fn = 'cities.txt'):
city_map = {}
with open(fn, mode='r') as fh:
count = 0
for line in fh:
count += 1
if count > 10:
pass
city = City(line)
city_map[city.name] = city
return(city_map)
def load_aliens(self, pop_cap):
self.alien_map = defaultdict(list)
for i in range(pop_cap):
city = self.random_city()
self.alien_map[city].append(i)
def random_city(self):
'''
return a random city
'''
return random.choice(list(self.cities))
def move_aliens(self):
any_moved = False
new_map = defaultdict(list)
for city_name, aliens in self.alien_map.items():
city = self.cities[city_name]
for alien in aliens:
new_city_name = city.random_neighbor()
if new_city_name is None:
new_city_name = city_name
else:
any_moved = True
new_map[new_city_name].append(alien)
self.alien_map = new_map
return any_moved
def delete_city(self, city_name):
city = self.cities[city_name]
neighbors = city.neighbors.values()
for neighbor in map(self.cities.get,neighbors):
neighbor.delete_route(city_name)
del self.cities[city_name]
def fight(self):
new_map = {}
for city_name, aliens in self.alien_map.items():
if len(aliens)<=1:
new_map[city_name] = aliens
continue
print('aliens {} fought at {}'.format(aliens, city_name))
self.delete_city(city_name)
self.alien_map = new_map
def main():
world = World(4000)
counter =0
while world.move_aliens():
counter += 1
world.fight()
if counter > 10000:
print('ran otu of time')
break
for city, aliens in world.alien_map.items():
print(aliens, world.cities[city])
if __name__=='__main__':
main()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment