Chellenge 7

Challenge 7.1


In [10]:
myinput = '/home/fmuinos/projects/adventofcode/2016/ferran/inputs/input7.txt'

In [24]:
def fourlyndromes(mystr):
    for i in range(len(mystr)-3):
        if (mystr[i] == mystr[i+3]) and (mystr[i+1] == mystr[i+2]) and (mystr[i] != mystr[i+1]):
            return True
    return False

def separate_brackets(mystr):
    bracket_dict = {'[': set([]), ']': set([])}
    state = ']'
    myword = ''
    for char in mystr:
        if char == '[' or char == ']' or char == '\n':
            if myword != '':
                bracket_dict[state].add(myword)
                myword = ''
            state = char 
        else:
            myword += char
    return bracket_dict
            
def tls_count(myinput):
    tls_counter = 0
    with open(myinput, 'rt') as f:
        for line in f:
            bracket_dict = separate_brackets(line)
            inside = False
            for word in bracket_dict['[']:
                if fourlyndromes(word):
                    inside = True
                    continue
            outside = False
            for word in bracket_dict[']']:
                if fourlyndromes(word):
                    outside = True
                    continue
            if (not inside) and outside:
                    tls_counter += 1
    return tls_counter

In [25]:
tls_count(myinput)


Out[25]:
115

Challenge 7.2


In [28]:
def threelyndromes(mystr):
    myset = set([])
    for i in range(len(mystr)-2):
        if (mystr[i] == mystr[i+2]) and (mystr[i] != mystr[i+1]):
            myset.add(''.join(mystr[i:i+3]))
    return myset

def transform(aba):
    return aba[1]+aba[0]+aba[1]

def ssl_count(myinput):
    ssl_counter = 0
    with open(myinput, 'rt') as f:
        for line in f:
            bracket_dict = separate_brackets(line)
            inside = set([])
            for word in bracket_dict['[']:
                inside = inside.union(threelyndromes(word))
            outside = set([])
            for word in bracket_dict[']']:
                for aba in threelyndromes(word):
                    outside.add(transform(aba))
            if len(outside.intersection(inside)) > 0:
                ssl_counter += 1
    return ssl_counter

In [29]:
ssl_count(myinput)


Out[29]:
231