Fun Python Solution to Euler Problem 79
Nothing says Merry Christmas like Project Euler.
Here’s a nifty solution to Problem 79 that uses Python and Graphviz.
The problem is to identify a user’s password given a bunch of successful logins (taken from some kind of nefarious keylogger–those crafty devils). The çatch is that each login is actually a subset of the actual password. Of course, they give you a sample of 50 successful logins.
So I decided to whip up some Python code to ingest each login and store a list of digit precedence. Then, the code prints out a Dot file which we turn into an image using the “dot” command. I ran this on Mac OS X, but it should work just fine on any Linux box (hint: install the “graphviz” package).
Here’s the Python code:
problem79.py:
digit_precendence = dict()
for line in [line.strip() for line in open("./keylog.txt")]:
    for index, char in enumerate(line):
        digits = digit_precendence.setdefault(int(char), set())
        if index < len(line)-1:
            digits.add(int(line[index+1]))
print "digraph problem79 {"
for (digit, subsequent_digits) in digit_precendence.iteritems():
    for subsequent_digit in subsequent_digits:
        print "   %d -> %d;" % (digit, subsequent_digit)
print "}"
Save that as problem79.py, download keylog.txt into the same folder, and run the program like this:
python problem79.py | dot -Tpng > problem79.png
Then view problem79.png, and voila! Graphviz just put the answer right in front of your nose: 73162890.
