#! /usr/bin/env python def lines(f): return (line for line in (line.rstrip() for line in file("bases.txt")) if line != '') def parse(f): bases = {} for symbol, meaning in (line.split('\t') for line in lines(f)): bases[symbol] = meaning return bases def bitCount(x): count = 0 while(x): x &= x - 1 count += 1 return count def distance(left, right): return bitCount(ord(left) ^ ord(right)) def distances(symbols): distances = {} for left in symbols: for right in symbols: if (left >= right): continue distances[(left, right)] = distance(left, right) return distances def printGraph(edges, labeller = None): print 'strict graph G {' for node in sorted(set(couple[0] for couple in couples) | set(couple[1] for couple in couples)): print '', node, '[', 'label', '=', labeller(node) , ']', ';' for edge in sorted(edges): print '', edge[0], '--', edge[1], ';' print '}' def bits(symbol): return bin(ord(symbol))[2:] bases = parse(file("bases.txt")) couples = [distance[0] for distance in distances(bases.keys()).iteritems() if distance[1] == 1] printGraph(couples, lambda symbol: "\"%s (%s)\\n%s\"" % (symbol, bases[symbol], bits(symbol)))