Day 11 - Advent of Code 2015

Working solutions for the day 11 puzzles.

Parts One and Two

""" day_11_01_02.py """

# usage: python3 day_11_01_02.py < input


def valid(text):
    """ is text a valid string """
    for character in 'ilo':
        if character in text:
            return False

    for i in text[:-2]:
        key = i + chr(ord(i) + 1) + chr(ord(i) + 2)
        if key in text:
            break
    else:
        return False

    pairs = 0
    for i in set(text):
        key = i + i
        if key in text:
            pairs += 1
            if pairs == 2:
                break
    else:
        return False

    return True


def generator(seed):
    """ valid string generator """
    string = seed
    while True:
        ords = [ord(i) - 97 for i in reversed(string)]
        carry = 1
        for i, value in enumerate(ords):
            carry, ords[i] = divmod(value + carry, 26)
        if carry == 1:
            ords.append(0)
        string = [chr(i + 97) for i in ords]
        string = ''.join(reversed(string))

        if valid(string):
            yield string


password = generator(input())

# part 01
print(next(password))

# part 02
print(next(password))