Min løsning på Advent of Code, luke 7:
SPOILER ALERT! Vis spoiler
Kode
import regex as re
def get_super_hyper(ip):
return (
re.split(r'\[[^\]]*?\]', ip),
re.findall(r'(?:\[)([^\]]*?)(?:\])', ip)
)
def support_tls(ip):
supernet_seqs, hypernet_seqs = get_super_hyper(ip)
return any(re.search(r'([a-z])(?!\1)([a-z])\2\1', match) for match in supernet_seqs) and \
not any(re.search(r'([a-z])(?!\1)([a-z])\2\1', match) for match in hypernet_seqs)
def support_ssl(ip):
supernet_seqs, hypernet_seqs = get_super_hyper(ip)
aba, bab = set(), set()
for seq in supernet_seqs:
aba |= set(re.findall(r'([a-z])(?!\1)([a-z])\1', seq, overlapped=True))
for seq in hypernet_seqs:
bab |= set(re.findall(r'([a-z])(?!\1)([a-z])\1', seq, overlapped=True))
return any((match[1], match[0]) in bab for match in aba)
def seven(func):
with open('7.txt') as ifile:
return sum(func(ip.strip()) for ip in ifile)
if __name__ == '__main__':
print '7a: {}'.format(seven(support_tls))
print '7b: {}'.format(seven(support_ssl))
Jeg er ganske blank på regexp, men så ingen annen løsning enn å prøve meg. Først prøvde jeg å løse hver deloppgave med en enkel regexp, men fant etter hvert ut at det ble enklere hvis man separerte supernet- og hypernetdelene først.
Problemet med deloppgave b var at man også må finne overlappende varianter av ABA, for eksempel ABACA. Python sin regexp-modul støtter ikke overlapping, men det viser seg at en planlagt fremtidig
regexp-modul støtter dette, så da fikk jeg det endelig til.
Sist endret av steili; 7. desember 2016 kl. 19:03.