View Single Post
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.