Project Euler 59

プロジェクトオイラー
http://projecteuler.net/index.php

Q59.
暗号の3文字のキーを見つけて、その和を求めよ

3の剰余で分けて、それぞれで最も多いコードを探す。最初、それが'e'になるのかと思ったら、スペースだった。



file = open("cipher1.txt")
a = map(int, file.read().split(','))
file.close()

def gen(i, n):
for k in range((n - i - 1) / 3 + 1):
yield k * 3 + i

def add(d, n):
if d.has_key(n):
d[n] += 1
else:
d[n] = 1

def get_max_char(g):
d = { }
for k in g:
add(d, a[k])
return max(d.iteritems(), key = lambda x: x[1])[0]

def get_key(g):
return get_max_char(g) ^ ord(' ')

def decrypt(key):
b = map(lambda i: a[i] ^ key[i%3], range(len(a)))
print "".join(map(chr, b))
print "".join(map(chr, key))
print sum(b)

decrypt(map(get_key, map(lambda i: gen(i, len(a)), range(3))))