In [1]:
#!/usr/bin/env python
import re
eval_abba = re.compile(r'([a-z])([a-z])(?!\1)\2\1')
eval_ssl = re.compile(r'([a-z])([a-z])(?!\2)\1')
def get_subnets(ip):
supernets, hypernets = [], []
for i in range(100):
if '[' not in ip:
supernets.append(ip)
break
supernets.append(ip[:ip.index('[')])
hypernets.append(ip[ip.index('[')+1:ip.index(']', ip.index('['))])
ip = ip[ip.index(']', ip.index('['))+1:]
return supernets, hypernets
def eval_progressive_re(subnet, regex):
pos, matches = 0, []
while True:
m = regex.search(subnet, pos)
if m:
pos = m.start()+1
matches.append(m.group(0))
else:
return matches
def tls_capable(ip):
supernets, hypernets = get_subnets(ip)
if len([i for i in hypernets if eval_progressive_re(i, eval_abba)]):
return False
return len([i for i in supernets if eval_progressive_re(i, eval_abba)]) > 0
def ssl_capable(ip):
supernets, hypernets = get_subnets(ip)
supernet_matches = set([(i[1], i[2]) for supernet in supernets for i in eval_progressive_re(supernet, eval_ssl)])
hypernet_matches = set([(i[2], i[1]) for hypernet in hypernets for i in eval_progressive_re(hypernet, eval_ssl)])
return len(hypernet_matches & supernet_matches)
In [2]:
print eval_progressive_re('zazbz', eval_ssl)
print eval_progressive_re('bzb', eval_ssl)
assert ssl_capable('zazbz[bzb]cdb')
In [3]:
assert tls_capable('abba[mnop]qrst')
assert not tls_capable('abcd[bddb]xyyx')
assert not tls_capable('aaaa[qwer]tyui')
assert tls_capable('ioxxoj[asdfgh]zxcvbn')
assert tls_capable('ioxxoj[asdfgh]zxcvbnabba[mnop]qrst')
assert tls_capable('zxcvbn[asdfgh]qrst[mnop]ioxxoj')
assert not tls_capable('ioxxoj[asdfgh]zxcvbabcd[bddb]xyyx')
print "Solution 1 examples passed"
assert ssl_capable('aba[bab]xyz')
assert not ssl_capable('xyx[xyx]xyx')
assert ssl_capable('aaa[kek]eke')
assert ssl_capable('zazbz[bzb]cdb')
assert ssl_capable('zazabz[zaz]cdb')
print "Solution 2 examples passed"
In [4]:
total_ip_matching = 0
with open('Dec7.input', 'ra') as f:
for input_str in f:
if tls_capable(input_str):
total_ip_matching += 1
print total_ip_matching
In [5]:
total_ip_matching = 0
with open('Dec7.input', 'ra') as f:
for input_str in f:
if ssl_capable(input_str):
total_ip_matching += 1
print total_ip_matching