In [22]:
import requests
import itertools
import networkx as nx
import matplotlib.pyplot as plt

def find_bigrams(lst):
    return zip(*(lst[i:] for i in range(2)))

In [4]:
txt = requests.get("https://projecteuler.net/project/resources/p079_keylog.txt").text.split("\n")

In [8]:
codes = list(filter(bool, txt))

In [15]:
allNodes = set(itertools.chain(*codes))

In [28]:
G=nx.DiGraph()

for node in allNodes:
    G.add_node(node)

for code in codes:
    for a,b in find_bigrams(code):
        G.add_edge(a, b)

In [31]:
%matplotlib inline
nx.draw(G)



In [51]:
G2 = G.copy()

def getNextCodepoint(G):
    for node, indeg in G.in_degree_iter():
        if indeg == 0:
            G.remove_node(node)
            return node
    return None

"".join(getNextCodepoint(G2) for i in range(G.number_of_nodes()))


Out[51]:
'73162890'