# here is a topological icosahedron, expressed as openings (faces)

# Note: I recycled this from my rbf.py but changed the letters to

# something friendlier

baseicosa = [('A', 'C', 'I'),
	     ('A', 'L', 'B'),
	     ('B', 'D', 'K'),
	     ('D', 'C', 'J'),
	     ('I', 'E', 'G'),
	     ('G', 'J', 'H'),
	     ('K', 'F', 'H'),
	     ('L', 'F', 'E'),
	     ('A', 'B', 'D'),
	     ('A', 'C', 'D'),
	     ('A', 'L', 'I'),
	     ('I', 'E', 'L'),
	     ('C', 'I', 'G'),
	     ('C', 'G', 'J'),
	     ('L', 'B', 'F'),
	     ('K', 'B', 'F'),
	     ('D', 'K', 'J'),
	     ('H', 'K', 'J'),
	     ('F', 'E', 'H'),
	     ('G', 'E', 'H')]

# we will consider these the names of 12 pentagons then add a

# 'soccer ball' pattern of 20 hexagons, named for the pentagons

# at their 3 alternate edges, e.g. hexagon ACI.

# Every hexagon will have six neighbors:  three pentagons with

# one letter in common, three hexagons with two letters is common

# Every pentagon with have five neighbors:  five hexagons with

# one letter in common.

pents = ['A','B','C','D','E','F','G','H','I','J','K','L']  # 20

print "Pents: %s" % pents

def gethexes():
    thelist = []
    for t in baseicosa:
	thehex = ''.join(sorted(t))
    return thelist

hexes = gethexes()
print "Hexes: %s" % hexes

# and let's get the edges while we're at it.  Every edge of every

# triangle is an edge.  We'll use the set data structure to police

# against duplicates

def getedges():
    theset = set()
    for t in baseicosa:
 	for i in (t[:2], t[1:], t[-1]+t[0]):
    return sorted(list(theset))	 

edges = getedges()
print "Edges: %s" % edges

# now we'd like a global dictionary in which every pentagon is paired

# with its 5 neighbors.  These will simply be all hexagons with

# a letter in common.

globaldata = {}

def buildpents():
    result = {}
    for p in pents:
	neighbors = []
	for h in hexes:
	    if p in h:
	result[p] = neighbors
    return result

result = buildpents()
print "Pent neighbors: %s" % result

# adding to our globaldata, will be all the hexagons paired with

# their six neighbors:  3 pentagons, and 3 hexagons across an edge.

# We detect edge sharing as a boundary condition, i.e. if a panel

# has two (and only two) letters in common, it's across an edge

def buildhexes():
    result = {}
    for h in hexes:
	neighbors = list(h) # 3 pentagons

	for candidate in hexes:
	    votes = 0
	    for i in range(3):
		if h[i] in candidate:
		   votes += 1
	    if votes == 2:
	result[h] = neighbors
    return result

result = buildhexes()
print "Hexa neighbors: %s" % result

# code highlighted using py2html.py version 0.8